/ Hex Artifact Content
Login

Artifact 03b2a622bf7714153bf06f9a6789e94aad9a5f89:


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 2f 2a 0a 2a 2a 20 4d   = 1;.}../*.** M
2d80: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
2d90: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
2da0: 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c  y be run multipl
2db0: 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64  e times..*/.void
2dc0: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75 73   sqlite3VdbeReus
2dd0: 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  able(Vdbe *p){. 
2de0: 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20   p->runOnlyOnce 
2df0: 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  = 0;.}..#ifdef S
2e00: 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73  QLITE_DEBUG /* s
2e10: 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79 41  qlite3AssertMayA
2e20: 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a  bort() logic */.
2e30: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
2e40: 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75  wing type and fu
2e50: 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20  nction are used 
2e60: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2e70: 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a  gh all opcodes.*
2e80: 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e  * in a Vdbe main
2e90: 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63   program and eac
2ea0: 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f  h of the sub-pro
2eb0: 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73 29  grams (triggers)
2ec0: 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f   it may .** invo
2ed0: 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69  ke directly or i
2ee0: 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68  ndirectly. It sh
2ef0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73 20  ould be used as 
2f00: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
2f10: 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56   Op *pOp;.**   V
2f20: 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b  dbeOpIter sIter;
2f30: 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28  .**.**   memset(
2f40: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2f50: 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20  f(sIter));.**   
2f60: 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20  sIter.v = v;    
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20          // v is 
2f90: 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a  of type Vdbe* .*
2fa0: 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20  *   while( (pOp 
2fb0: 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49  = opIterNext(&sI
2fc0: 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20  ter)) ){.**     
2fd0: 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20  // Do something 
2fe0: 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a  with pOp.**   }.
2ff0: 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  **   sqlite3DbFr
3000: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
3010: 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74  apSub);.** .*/.t
3020: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56 64  ypedef struct Vd
3030: 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49  beOpIter VdbeOpI
3040: 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65  ter;.struct Vdbe
3050: 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20  OpIter {.  Vdbe 
3060: 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *v;             
3070: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f        /* Vdbe to
3080: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
3090: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20   the opcodes of 
30a0: 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  */.  SubProgram 
30b0: 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20 20  **apSub;        
30c0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 70  /* Array of subp
30d0: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
30e0: 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20 20   nSub;          
30f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3100: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
3110: 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69  apSub */.  int i
3120: 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  Addr;           
3130: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
3140: 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63   of next instruc
3150: 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a  tion to return *
3160: 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20  /.  int iSub;   
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3180: 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72  * 0 = main progr
3190: 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75  am, 1 = first su
31a0: 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a  b-program etc. *
31b0: 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a  /.};.static Op *
31c0: 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f  opIterNext(VdbeO
31d0: 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62  pIter *p){.  Vdb
31e0: 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f  e *v = p->v;.  O
31f0: 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f  p *pRet = 0;.  O
3200: 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f  p *aOp;.  int nO
3210: 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75  p;..  if( p->iSu
3220: 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20  b<=p->nSub ){.. 
3230: 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d     if( p->iSub==
3240: 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  0 ){.      aOp =
3250: 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e   v->aOp;.      n
3260: 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20  Op = v->nOp;.   
3270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f   }else{.      aO
3280: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3290: 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20  iSub-1]->aOp;.  
32a0: 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53      nOp = p->apS
32b0: 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e  ub[p->iSub-1]->n
32c0: 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  Op;.    }.    as
32d0: 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e  sert( p->iAddr<n
32e0: 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20  Op );..    pRet 
32f0: 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d  = &aOp[p->iAddr]
3300: 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b  ;.    p->iAddr++
3310: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64  ;.    if( p->iAd
3320: 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20  dr==nOp ){.     
3330: 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20   p->iSub++;.    
3340: 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a    p->iAddr = 0;.
3350: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28      }.  .    if(
3360: 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50   pRet->p4type==P
3370: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
3380: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
3390: 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69  = (p->nSub+1)*si
33a0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
33b0: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
33c0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
33d0: 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  <p->nSub; j++){.
33e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61          if( p->a
33f0: 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70  pSub[j]==pRet->p
3400: 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65  4.pProgram ) bre
3410: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3420: 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62    if( j==p->nSub
3430: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61   ){.        p->a
3440: 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62  pSub = sqlite3Db
3450: 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d  ReallocOrFree(v-
3460: 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e  >db, p->apSub, n
3470: 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Byte);.        i
3480: 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a  f( !p->apSub ){.
3490: 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20 3d            pRet =
34a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
34b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  e{.          p->
34c0: 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d  apSub[p->nSub++]
34d0: 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f   = pRet->p4.pPro
34e0: 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gram;.        }.
34f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3500: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  }..  return pRet
3510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
3520: 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
3530: 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d  stored in the VM
3540: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
3550: 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74   pParse may.** t
3560: 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78  hrow an ABORT ex
3570: 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67  ception (causing
3580: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
3590: 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74  but not entire t
35a0: 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f  ransaction.** to
35b0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29   be rolled back)
35c0: 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e  . This condition
35d0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20   is true if the 
35e0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20  main program or 
35f0: 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72  any.** sub-progr
3600: 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79  ams contains any
3610: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
3620: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50  g:.**.**   *  OP
3630: 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51  _Halt with P1=SQ
3640: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20  LITE_CONSTRAINT 
3650: 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e  and P2=OE_Abort.
3660: 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74  .**   *  OP_Halt
3670: 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53  IfNull with P1=S
3680: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3690: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
36a0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73  ..**   *  OP_Des
36b0: 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  troy.**   *  OP_
36c0: 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20  VUpdate.**   *  
36d0: 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20  OP_VRename.**   
36e0: 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20  *  OP_FkCounter 
36f0: 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65  with P2==0 (imme
3700: 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
3710: 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a  y constraint).**
3720: 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 54     *  OP_CreateT
3730: 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74  able and OP_Init
3740: 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72 20 43  Coroutine (for C
3750: 52 45 41 54 45 20 54 41 42 4c 45 20 41 53 20 53  REATE TABLE AS S
3760: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
3770: 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74   Then check that
3780: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
3790: 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20  rse.mayAbort is 
37a0: 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42  true if an.** AB
37b0: 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77  ORT may be throw
37c0: 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  n, or false othe
37d0: 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72  rwise. Return tr
37e0: 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a  ue if it does.**
37f0: 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65   match, or false
3800: 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69 73   otherwise. This
3810: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74   function is int
3820: 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64  ended to be used
3830: 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61   as.** part of a
3840: 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d 65  n assert stateme
3850: 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c  nt in the compil
3860: 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a  er. Similar to:.
3870: 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20  **.**   assert( 
3880: 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72  sqlite3VdbeAsser
3890: 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73 65  tMayAbort(pParse
38a0: 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d  ->pVdbe, pParse-
38b0: 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f  >mayAbort) );.*/
38c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
38d0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56  AssertMayAbort(V
38e0: 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41  dbe *v, int mayA
38f0: 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73  bort){.  int has
3900: 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74  Abort = 0;.  int
3910: 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20   hasFkCounter = 
3920: 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61  0;.  int hasCrea
3930: 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69  teTable = 0;.  i
3940: 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74  nt hasInitCorout
3950: 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70  ine = 0;.  Op *p
3960: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72  Op;.  VdbeOpIter
3970: 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74   sIter;.  memset
3980: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
3990: 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49  of(sIter));.  sI
39a0: 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68  ter.v = v;..  wh
39b0: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
39c0: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21  erNext(&sIter))!
39d0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70  =0 ){.    int op
39e0: 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f  code = pOp->opco
39f0: 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f  de;.    if( opco
3a00: 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c  de==OP_Destroy |
3a10: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70  | opcode==OP_VUp
3a20: 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  date || opcode==
3a30: 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20  OP_VRename .    
3a40: 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50   || ((opcode==OP
3a50: 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d  _Halt || opcode=
3a60: 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20  =OP_HaltIfNull) 
3a70: 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d  .      && ((pOp-
3a80: 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >p1&0xff)==SQLIT
3a90: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20  E_CONSTRAINT && 
3aa0: 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72  pOp->p2==OE_Abor
3ab0: 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  t)).    ){.     
3ac0: 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20   hasAbort = 1;. 
3ad0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3ae0: 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  }.    if( opcode
3af0: 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65  ==OP_CreateTable
3b00: 20 29 20 68 61 73 43 72 65 61 74 65 54 61 62 6c   ) hasCreateTabl
3b10: 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f  e = 1;.    if( o
3b20: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f  pcode==OP_InitCo
3b30: 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69  routine ) hasIni
3b40: 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a  tCoroutine = 1;.
3b50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3b60: 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a  MIT_FOREIGN_KEY.
3b70: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
3b80: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20  OP_FkCounter && 
3b90: 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f  pOp->p1==0 && pO
3ba0: 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20  p->p2==1 ){.    
3bb0: 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d    hasFkCounter =
3bc0: 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
3bd0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
3be0: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
3bf0: 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20  r.apSub);..  /* 
3c00: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 68  Return true if h
3c10: 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72  asAbort==mayAbor
3c20: 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f  t. Or if a mallo
3c30: 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  c failure occurr
3c40: 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c  ed..  ** If mall
3c50: 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20  oc failed, then 
3c60: 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70  the while() loop
3c70: 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68   above may not h
3c80: 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a  ave iterated.  *
3c90: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70  * through all op
3ca0: 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f  codes and hasAbo
3cb0: 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e  rt may be set in
3cc0: 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72  correctly. Retur
3cd0: 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20  n.  ** true for 
3ce0: 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72 65  this case to pre
3cf0: 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74 28  vent the assert(
3d00: 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73  ) in the callers
3d10: 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d   frame.  ** from
3d20: 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20   failing.  */.  
3d30: 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e  return ( v->db->
3d40: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20  mallocFailed || 
3d50: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
3d60: 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74  rt || hasFkCount
3d70: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  er.             
3d80: 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54 61   || (hasCreateTa
3d90: 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f  ble && hasInitCo
3da0: 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65  routine) );.}.#e
3db0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
3dc0: 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74  EBUG - the sqlit
3dd0: 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  e3AssertMayAbort
3de0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a  () function */..
3df0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3e00: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74  ne is called aft
3e10: 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68  er all opcodes h
3e20: 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ave been inserte
3e30: 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20  d.  It loops.** 
3e40: 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20  through all the 
3e50: 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65  opcodes and fixe
3e60: 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c  s up some detail
3e70: 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72  s..**.** (1) For
3e80: 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72   each jump instr
3e90: 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65  uction with a ne
3ea0: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
3eb0: 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20  (a label).**    
3ec0: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20   resolve the P2 
3ed0: 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75  value to an actu
3ee0: 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a  al address..**.*
3ef0: 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68  * (2) Compute th
3f00: 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
3f10: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73   of arguments us
3f20: 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75  ed by any SQL fu
3f30: 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e  nction.**     an
3f40: 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c  d store that val
3f50: 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41  ue in *pMaxFuncA
3f60: 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55  rgs..**.** (3) U
3f70: 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e 72  pdate the Vdbe.r
3f80: 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65  eadOnly and Vdbe
3f90: 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67 73  .bIsReader flags
3fa0: 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a   to accurately.*
3fb0: 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20 77  *     indicate w
3fc0: 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64  hat the prepared
3fd0: 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61   statement actua
3fe0: 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  lly does..**.** 
3ff0: 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  (4) Initialize t
4000: 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70  he p4.xAdvance p
4010: 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65  ointer on opcode
4020: 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a  s that use it..*
4030: 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d  *.** (5) Reclaim
4040: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f   the memory allo
4050: 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e  cated for storin
4060: 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61  g labels..*/.sta
4070: 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
4080: 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70  P2Values(Vdbe *p
4090: 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41  , int *pMaxFuncA
40a0: 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  rgs){.  int i;. 
40b0: 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20   int nMaxArgs = 
40c0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20  *pMaxFuncArgs;. 
40d0: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73   Op *pOp;.  Pars
40e0: 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70  e *pParse = p->p
40f0: 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c  Parse;.  int *aL
4100: 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61  abel = pParse->a
4110: 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64  Label;.  p->read
4120: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62  Only = 1;.  p->b
4130: 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20  IsReader = 0;.  
4140: 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20  for(pOp=p->aOp, 
4150: 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30  i=p->nOp-1; i>=0
4160: 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20  ; i--, pOp++){. 
4170: 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70     u8 opcode = p
4180: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20  Op->opcode;..   
4190: 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72   /* NOTE: Be sur
41a0: 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70  e to update mkop
41b0: 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20 61  codeh.tcl when a
41c0: 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e  dding or removin
41d0: 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66  g.    ** cases f
41e0: 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21  rom this switch!
41f0: 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20   */.    switch( 
4200: 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  opcode ){.      
4210: 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74  case OP_Transact
4220: 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ion: {.        i
4230: 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20  f( pOp->p2!=0 ) 
4240: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
4250: 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c  .        /* fall
4260: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d   thru */.      }
4270: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41  .      case OP_A
4280: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
4290: 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69   case OP_Savepoi
42a0: 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d  nt: {.        p-
42b0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a  >bIsReader = 1;.
42c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
42d0: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
42e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
42f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65       case OP_Che
4300: 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a  ckpoint:.#endif.
4310: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61        case OP_Va
4320: 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65  cuum:.      case
4330: 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a   OP_JournalMode:
4340: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65   {.        p->re
4350: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
4360: 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72      p->bIsReader
4370: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72   = 1;.        br
4380: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66  eak;.      }.#if
4390: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
43a0: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
43b0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64      case OP_VUpd
43c0: 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ate: {.        i
43d0: 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41  f( pOp->p2>nMaxA
43e0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
43f0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20   pOp->p2;.      
4400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4410: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56  .      case OP_V
4420: 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Filter: {.      
4430: 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
4440: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20   assert( p->nOp 
4450: 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20  - i >= 3 );.    
4460: 20 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b      assert( pOp[
4470: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  -1].opcode==OP_I
4480: 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20  nteger );.      
4490: 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    n = pOp[-1].p1
44a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e  ;.        if( n>
44b0: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
44c0: 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20  rgs = n;.       
44d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
44e0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73  #endif.      cas
44f0: 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20  e OP_Next:.     
4500: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f   case OP_NextIfO
4510: 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20  pen:.      case 
4520: 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b  OP_SorterNext: {
4530: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
4540: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
4550: 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20  te3BtreeNext;.  
4560: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4570: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4580: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4590: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
45a0: 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20  e OP_Prev:.     
45b0: 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f   case OP_PrevIfO
45c0: 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70  pen: {.        p
45d0: 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20  Op->p4.xAdvance 
45e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
45f0: 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20  evious;.        
4600: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
4610: 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20  _ADVANCE;.      
4620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4630: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d  .    }..    pOp-
4640: 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74  >opflags = sqlit
4650: 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79  e3OpcodeProperty
4660: 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66  [opcode];.    if
4670: 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20  ( (pOp->opflags 
4680: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
4690: 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b   && pOp->p2<0 ){
46a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 41  .      assert( A
46b0: 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61  DDR(pOp->p2)<pPa
46c0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20  rse->nLabel );. 
46d0: 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61       pOp->p2 = a
46e0: 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e  Label[ADDR(pOp->
46f0: 70 32 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  p2)];.    }.  }.
4700: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4710: 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61  p->db, pParse->a
4720: 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65  Label);.  pParse
4730: 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20  ->aLabel = 0;.  
4740: 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d  pParse->nLabel =
4750: 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41   0;.  *pMaxFuncA
4760: 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a  rgs = nMaxArgs;.
4770: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73    assert( p->bIs
4780: 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d  Reader!=0 || DbM
4790: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
47a0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f  reeMask) );.}../
47b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
47c0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
47d0: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
47e0: 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a  to be inserted..
47f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
4800: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 56 64  beCurrentAddr(Vd
4810: 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  be *p){.  assert
4820: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
4830: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
4840: 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a   return p->nOp;.
4850: 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20  }../*.** Verify 
4860: 74 68 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20  that at least N 
4870: 6f 70 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65  opcode slots are
4880: 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20   available in p 
4890: 77 69 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e  without.** havin
48a0: 67 20 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20  g to malloc for 
48b0: 6d 6f 72 65 20 73 70 61 63 65 20 28 65 78 63 65  more space (exce
48c0: 70 74 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64  pt when compiled
48d0: 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45   using.** SQLITE
48e0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
48f0: 52 45 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74  RESS).  This int
4900: 65 72 66 61 63 65 20 69 73 20 75 73 65 64 20 64  erface is used d
4910: 75 72 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a  uring testing.**
4920: 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
4930: 63 65 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f  certain calls to
4940: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
4950: 70 4c 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65  pList() can neve
4960: 72 0a 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f  r.** fail due to
4970: 20 61 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64   a OOM fault and
4980: 20 68 65 6e 63 65 20 74 68 61 74 20 74 68 65 20   hence that the 
4990: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f  return value fro
49a0: 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  m.** sqlite3Vdbe
49b0: 41 64 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c  AddOpList() will
49c0: 20 61 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e   always be non-N
49d0: 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ULL..*/.#if defi
49e0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
49f0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
4a00: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
4a10: 43 5f 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73  C_STRESS).void s
4a20: 71 6c 69 74 65 33 56 64 62 65 56 65 72 69 66 79  qlite3VdbeVerify
4a30: 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64  NoMallocRequired
4a40: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29  (Vdbe *p, int N)
4a50: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  {.  assert( p->n
4a60: 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61  Op + N <= p->pPa
4a70: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b  rse->nOpAlloc );
4a80: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
4a90: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   This function r
4aa0: 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
4ab0: 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66   to the array of
4ac0: 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61   opcodes associa
4ad0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
4ae0: 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
4af0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
4b00: 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61 6c  t. It is the cal
4b10: 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c  lers responsibil
4b20: 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67  ity.** to arrang
4b30: 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e  e for the return
4b40: 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20 65  ed array to be e
4b50: 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20  ventually freed 
4b60: 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64  using the .** vd
4b70: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29 20  beFreeOpArray() 
4b80: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
4b90: 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  Before returning
4ba0: 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74  , *pnOp is set t
4bb0: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
4bc0: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 72  entries in the r
4bd0: 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79  eturned.** array
4be0: 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72  . Also, *pnMaxAr
4bf0: 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  g is set to the 
4c00: 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63 75  larger of its cu
4c10: 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20  rrent value and 
4c20: 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  .** the number o
4c30: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65  f entries in the
4c40: 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72   Vdbe.apArg[] ar
4c50: 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f 20  ray required to 
4c60: 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20  execute the .** 
4c70: 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d  returned program
4c80: 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c  ..*/.VdbeOp *sql
4c90: 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72  ite3VdbeTakeOpAr
4ca0: 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ray(Vdbe *p, int
4cb0: 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d   *pnOp, int *pnM
4cc0: 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70  axArg){.  VdbeOp
4cd0: 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a   *aOp = p->aOp;.
4ce0: 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26 26    assert( aOp &&
4cf0: 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46   !p->db->mallocF
4d00: 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43  ailed );..  /* C
4d10: 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65  heck that sqlite
4d20: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 29  3VdbeUsesBtree()
4d30: 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20   was not called 
4d40: 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  on this VM */.  
4d50: 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c  assert( DbMaskAl
4d60: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
4d70: 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76  sk) );..  resolv
4d80: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d  eP2Values(p, pnM
4d90: 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20  axArg);.  *pnOp 
4da0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61  = p->nOp;.  p->a
4db0: 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  Op = 0;.  return
4dc0: 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41   aOp;.}../*.** A
4dd0: 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20  dd a whole list 
4de0: 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f  of operations to
4df0: 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73   the operation s
4e00: 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a  tack.  Return a.
4e10: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
4e20: 65 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  e first operatio
4e30: 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a 2a  n inserted..**.*
4e40: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50 32 20 61 72  * Non-zero P2 ar
4e50: 67 75 6d 65 6e 74 73 20 74 6f 20 6a 75 6d 70 20  guments to jump 
4e60: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
4e70: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61   automatically a
4e80: 64 6a 75 73 74 65 64 0a 2a 2a 20 73 6f 20 74 68  djusted.** so th
4e90: 61 74 20 74 68 65 20 6a 75 6d 70 20 74 61 72 67  at the jump targ
4ea0: 65 74 20 69 73 20 72 65 6c 61 74 69 76 65 20 74  et is relative t
4eb0: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
4ec0: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
4ed0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
4ee0: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28  e3VdbeAddOpList(
4ef0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
4f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4f10: 2f 2a 20 41 64 64 20 6f 70 63 6f 64 65 73 20 74  /* Add opcodes t
4f20: 6f 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  o the prepared s
4f30: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  tatement */.  in
4f40: 74 20 6e 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t nOp,          
4f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4f60: 6d 62 65 72 20 6f 66 20 6f 70 63 6f 64 65 73 20  mber of opcodes 
4f70: 74 6f 20 61 64 64 20 2a 2f 0a 20 20 56 64 62 65  to add */.  Vdbe
4f80: 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f  OpList const *aO
4f90: 70 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p,       /* The 
4fa0: 6f 70 63 6f 64 65 73 20 74 6f 20 62 65 20 61 64  opcodes to be ad
4fb0: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69  ded */.  int iLi
4fc0: 6e 65 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  neno            
4fd0: 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 2d        /* Source-
4fe0: 66 69 6c 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72  file line number
4ff0: 20 6f 66 20 66 69 72 73 74 20 6f 70 63 6f 64 65   of first opcode
5000: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
5010: 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74 2c 20    VdbeOp *pOut, 
5020: 2a 70 46 69 72 73 74 3b 0a 20 20 61 73 73 65 72  *pFirst;.  asser
5030: 74 28 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73  t( nOp>0 );.  as
5040: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
5050: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
5060: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20  );.  if( p->nOp 
5070: 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73  + nOp > p->pPars
5080: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67  e->nOpAlloc && g
5090: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f  rowOpArray(p, nO
50a0: 70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  p) ){.    return
50b0: 20 30 3b 0a 20 20 7d 0a 20 20 70 46 69 72 73 74   0;.  }.  pFirst
50c0: 20 3d 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f   = pOut = &p->aO
50d0: 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20 20 66 6f 72  p[p->nOp];.  for
50e0: 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b  (i=0; i<nOp; i++
50f0: 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29  , aOp++, pOut++)
5100: 7b 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f  {.    pOut->opco
5110: 64 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65  de = aOp->opcode
5120: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d  ;.    pOut->p1 =
5130: 20 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f   aOp->p1;.    pO
5140: 75 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32  ut->p2 = aOp->p2
5150: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f  ;.    assert( aO
5160: 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20  p->p2>=0 );.    
5170: 69 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f  if( (sqlite3Opco
5180: 64 65 50 72 6f 70 65 72 74 79 5b 61 4f 70 2d 3e  deProperty[aOp->
5190: 6f 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f  opcode] & OPFLG_
51a0: 4a 55 4d 50 29 21 3d 30 20 26 26 20 61 4f 70 2d  JUMP)!=0 && aOp-
51b0: 3e 70 32 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  >p2>0 ){.      p
51c0: 4f 75 74 2d 3e 70 32 20 2b 3d 20 70 2d 3e 6e 4f  Out->p2 += p->nO
51d0: 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 75  p;.    }.    pOu
51e0: 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b  t->p3 = aOp->p3;
51f0: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79 70  .    pOut->p4typ
5200: 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a  e = P4_NOTUSED;.
5210: 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d      pOut->p4.p =
5220: 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35   0;.    pOut->p5
5230: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
5240: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
5250: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
5260: 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d  pOut->zComment =
5270: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
5280: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
5290: 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75 74 2d  VERAGE.    pOut-
52a0: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e  >iSrcLine = iLin
52b0: 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20  eno+i;.#else.   
52c0: 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a   (void)iLineno;.
52d0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
52e0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 69  LITE_DEBUG.    i
52f0: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
5300: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
5310: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20  opTrace ){.     
5320: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
5330: 74 4f 70 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c  tOp(0, i+p->nOp,
5340: 20 26 70 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f   &p->aOp[i+p->nO
5350: 70 5d 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  p]);.    }.#endi
5360: 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b  f.  }.  p->nOp +
5370: 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20  = nOp;.  return 
5380: 70 46 69 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64  pFirst;.}..#if d
5390: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
53a0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
53b0: 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20  ATUS)./*.** Add 
53c0: 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  an entry to the 
53d0: 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65 72  array of counter
53e0: 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71 6c  s managed by sql
53f0: 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
5400: 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  atus()..*/.void 
5410: 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e 53  sqlite3VdbeScanS
5420: 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a 70  tatus(.  Vdbe *p
5430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5440: 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20 74           /* VM t
5450: 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75 73  o add scanstatus
5460: 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61  () to */.  int a
5470: 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20 20  ddrExplain,     
5480: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
5490: 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c  dress of OP_Expl
54a0: 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20  ain (or 0) */.  
54b0: 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20  int addrLoop,   
54c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54d0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c 6f  /* Address of lo
54e0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20  op counter */ . 
54f0: 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c 20   int addrVisit, 
5500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5510: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 72   /* Address of r
5520: 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75 6e  ows visited coun
5530: 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20  ter */.  LogEst 
5540: 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  nEst,           
5550: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74 69           /* Esti
5560: 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20  mated number of 
5570: 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20  output rows */. 
5580: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
5590: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
55a0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c   /* Name of tabl
55b0: 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e 67  e or index being
55c0: 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20   scanned */.){. 
55d0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d   int nByte = (p-
55e0: 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65  >nScan+1) * size
55f0: 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b 0a  of(ScanStatus);.
5600: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61 4e    ScanStatus *aN
5610: 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53 63  ew;.  aNew = (Sc
5620: 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74 65  anStatus*)sqlite
5630: 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62  3DbRealloc(p->db
5640: 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74  , p->aScan, nByt
5650: 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20 29  e);.  if( aNew )
5660: 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75 73  {.    ScanStatus
5670: 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70   *pNew = &aNew[p
5680: 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20  ->nScan++];.    
5690: 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61 69  pNew->addrExplai
56a0: 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e 3b  n = addrExplain;
56b0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c  .    pNew->addrL
56c0: 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a  oop = addrLoop;.
56d0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56 69      pNew->addrVi
56e0: 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74 3b  sit = addrVisit;
56f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20  .    pNew->nEst 
5700: 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65 77  = nEst;.    pNew
5710: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
5720: 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62 2c  3DbStrDup(p->db,
5730: 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e   zName);.    p->
5740: 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20  aScan = aNew;.  
5750: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  }.}.#endif.../*.
5760: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
5770: 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  lue of the opcod
5780: 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50 33  e, or P1, P2, P3
5790: 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64 73  , or P5 operands
57a0: 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69 66  .** for a specif
57b0: 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ic instruction..
57c0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
57d0: 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65 28  dbeChangeOpcode(
57e0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
57f0: 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64 65  r, u8 iNewOpcode
5800: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5810: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f  GetOp(p,addr)->o
5820: 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f  pcode = iNewOpco
5830: 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  de;.}.void sqlit
5840: 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28 56  e3VdbeChangeP1(V
5850: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5860: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5870: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5880: 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c  ,addr)->p1 = val
5890: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
58a0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64 62  VdbeChangeP2(Vdb
58b0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
58c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69  int val){.  sqli
58d0: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
58e0: 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a  ddr)->p2 = val;.
58f0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
5900: 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65 20  beChangeP3(Vdbe 
5910: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
5920: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5930: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5940: 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p3 = val;.}.
5950: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5960: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
5970: 2c 20 75 38 20 70 35 29 7b 0a 20 20 69 66 28 20  , u8 p5){.  if( 
5980: 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  !p->db->mallocFa
5990: 69 6c 65 64 20 29 20 70 2d 3e 61 4f 70 5b 70 2d  iled ) p->aOp[p-
59a0: 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b  >nOp-1].p5 = p5;
59b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
59c0: 20 74 68 65 20 50 32 20 6f 70 65 72 61 6e 64 20   the P2 operand 
59d0: 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61  of instruction a
59e0: 64 64 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  ddr so that it p
59f0: 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
5a00: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e  address of the n
5a10: 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20  ext instruction 
5a20: 74 6f 20 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a  to be coded..*/.
5a30: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5a40: 4a 75 6d 70 48 65 72 65 28 56 64 62 65 20 2a 70  JumpHere(Vdbe *p
5a50: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 70  , int addr){.  p
5a60: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
5a70: 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b  Op = p->nOp - 1;
5a80: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
5a90: 61 6e 67 65 50 32 28 70 2c 20 61 64 64 72 2c 20  angeP2(p, addr, 
5aa0: 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  p->nOp);.}.../*.
5ab0: 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20  ** If the input 
5ac0: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
5ad0: 65 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2c 20  e is ephemeral, 
5ae0: 74 68 65 6e 20 66 72 65 65 20 69 74 2e 20 20 49  then free it.  I
5af0: 66 0a 2a 2a 20 74 68 65 20 46 75 6e 63 44 65 66  f.** the FuncDef
5b00: 20 69 73 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c   is not ephermal
5b10: 2c 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  , then do nothin
5b20: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5b30: 64 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46  d freeEphemeralF
5b40: 75 6e 63 74 69 6f 6e 28 73 71 6c 69 74 65 33 20  unction(sqlite3 
5b50: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 44  *db, FuncDef *pD
5b60: 65 66 29 7b 0a 20 20 69 66 28 20 41 4c 57 41 59  ef){.  if( ALWAY
5b70: 53 28 70 44 65 66 29 20 26 26 20 28 70 44 65 66  S(pDef) && (pDef
5b80: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
5b90: 4c 49 54 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29  LITE_FUNC_EPHEM)
5ba0: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
5bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
5bc0: 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69  f);.  }.}..stati
5bd0: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
5be0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
5bf0: 2c 20 4f 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f  , Op *, int);../
5c00: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 50 34  *.** Delete a P4
5c10: 20 76 61 6c 75 65 20 69 66 20 6e 65 63 65 73 73   value if necess
5c20: 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ary..*/.static v
5c30: 6f 69 64 20 66 72 65 65 50 34 28 73 71 6c 69 74  oid freeP4(sqlit
5c40: 65 33 20 2a 64 62 2c 20 69 6e 74 20 70 34 74 79  e3 *db, int p4ty
5c50: 70 65 2c 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20  pe, void *p4){. 
5c60: 20 69 66 28 20 70 34 20 29 7b 0a 20 20 20 20 61   if( p4 ){.    a
5c70: 73 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 20  ssert( db );.   
5c80: 20 73 77 69 74 63 68 28 20 70 34 74 79 70 65 20   switch( p4type 
5c90: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  ){.      case P4
5ca0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
5cb0: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
5cc0: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28  lFunction(db, ((
5cd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
5ce0: 29 70 34 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20  )p4)->pFunc);.  
5cf0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
5d00: 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 65 20 6e  rough into the n
5d10: 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  ext case */.    
5d20: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
5d30: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 20 20 63 61  4_REAL:.      ca
5d40: 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20  se P4_INT64:.   
5d50: 20 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d     case P4_DYNAM
5d60: 49 43 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  IC:.      case P
5d70: 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20  4_INTARRAY: {.  
5d80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
5d90: 72 65 65 28 64 62 2c 20 70 34 29 3b 0a 20 20 20  ree(db, p4);.   
5da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5db0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
5dc0: 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20  4_KEYINFO: {.   
5dd0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5de0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
5df0: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
5e00: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
5e10: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5e20: 0a 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20  .      }.#ifdef 
5e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
5e40: 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 20  RSOR_HINTS.     
5e50: 20 63 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b   case P4_EXPR: {
5e60: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
5e70: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 28  ExprDelete(db, (
5e80: 45 78 70 72 2a 29 70 34 29 3b 0a 20 20 20 20 20  Expr*)p4);.     
5e90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5ea0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
5eb0: 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20  ase P4_MPRINTF: 
5ec0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5ed0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5ee0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
5ef0: 28 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72  (p4);.        br
5f00: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
5f10: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
5f20: 45 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72  EF: {.        fr
5f30: 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74  eeEphemeralFunct
5f40: 69 6f 6e 28 64 62 2c 20 28 46 75 6e 63 44 65 66  ion(db, (FuncDef
5f50: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
5f60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
5f70: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a      case P4_MEM:
5f80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
5f90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
5fa0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5fb0: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
5fc0: 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
5fd0: 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  )p4);.        }e
5fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 4d  lse{.          M
5ff0: 65 6d 20 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34  em *p = (Mem*)p4
6000: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
6010: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
6020: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
6030: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
6040: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
6050: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
6060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
6070: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
6080: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
6090: 20 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28   : {.        if(
60a0: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
60b0: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74  d==0 ) sqlite3Vt
60c0: 61 62 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65  abUnlock((VTable
60d0: 20 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20   *)p4);.        
60e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
60f0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
6100: 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63 65  * Free the space
6110: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 61   allocated for a
6120: 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76 61  Op and any p4 va
6130: 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 66  lues allocated f
6140: 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  or the.** opcode
6150: 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  s contained with
6160: 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e 6f  in. If aOp is no
6170: 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73 73  t NULL it is ass
6180: 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20  umed to contain 
6190: 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e  .** nOp entries.
61a0: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64   .*/.static void
61b0: 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
61c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70  (sqlite3 *db, Op
61d0: 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b   *aOp, int nOp){
61e0: 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20 20  .  if( aOp ){.  
61f0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66    Op *pOp;.    f
6200: 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c  or(pOp=aOp; pOp<
6210: 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b  &aOp[nOp]; pOp++
6220: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  ){.      if( pOp
6230: 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65 65 50  ->p4type ) freeP
6240: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
6250: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23  e, pOp->p4.p);.#
6260: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6270: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6280: 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69 74  ENTS.      sqlit
6290: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f 70  e3DbFree(db, pOp
62a0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e  ->zComment);.#en
62b0: 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a 20  dif     .    }. 
62c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
62d0: 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a  ee(db, aOp);.}..
62e0: 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53  /*.** Link the S
62f0: 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74  ubProgram object
6300: 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
6310: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
6320: 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a  nto the linked.*
6330: 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e 70  * list at Vdbe.p
6340: 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69 73  SubProgram. This
6350: 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74 6f   list is used to
6360: 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d   delete all sub-
6370: 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63  program.** objec
6380: 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20 69  ts when the VM i
6390: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75  s no longer requ
63a0: 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ired..*/.void sq
63b0: 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75 62  lite3VdbeLinkSub
63c0: 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70 56  Program(Vdbe *pV
63d0: 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d 20  dbe, SubProgram 
63e0: 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20  *p){.  p->pNext 
63f0: 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61  = pVdbe->pProgra
6400: 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72 6f  m;.  pVdbe->pPro
6410: 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a  gram = p;.}../*.
6420: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f 70  ** Change the op
6430: 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e 74  code at addr int
6440: 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74  o OP_Noop.*/.int
6450: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6460: 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70  geToNoop(Vdbe *p
6470: 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 56  , int addr){.  V
6480: 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66  dbeOp *pOp;.  if
6490: 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
64a0: 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 30  ailed ) return 0
64b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
64c0: 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e  >=0 && addr<p->n
64d0: 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70  Op );.  pOp = &p
64e0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66  ->aOp[addr];.  f
64f0: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70  reeP4(p->db, pOp
6500: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6510: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 74  4.p);.  pOp->p4t
6520: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
6530: 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20  ;.  pOp->p4.z = 
6540: 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  0;.  pOp->opcode
6550: 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72 65   = OP_Noop;.  re
6560: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
6570: 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70 63   If the last opc
6580: 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64 20  ode is "op" and 
6590: 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70  it is not a jump
65a0: 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a   destination,.**
65b0: 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e   then remove it.
65c0: 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66    Return true if
65d0: 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20   and only if an 
65e0: 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f 76  opcode was remov
65f0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
6600: 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69 6f  e3VdbeDeletePrio
6610: 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c  rOpcode(Vdbe *p,
6620: 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20 28   u8 op){.  if( (
6630: 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50  p->nOp-1)>(p->pP
6640: 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29 20  arse->iFixedOp) 
6650: 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  && p->aOp[p->nOp
6660: 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29  -1].opcode==op )
6670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
6680: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
6690: 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31  Noop(p, p->nOp-1
66a0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
66b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a  return 0;.  }.}.
66c0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
66d0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50  e value of the P
66e0: 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20  4 operand for a 
66f0: 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63  specific instruc
6700: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  tion..** This ro
6710: 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20  utine is useful 
6720: 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f  when a large pro
6730: 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66  gram is loaded f
6740: 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20  rom a.** static 
6750: 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69  array using sqli
6760: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
6770: 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20   but we want to 
6780: 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69  make a.** few mi
6790: 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74  nor changes to t
67a0: 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a  he program..**.*
67b0: 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74  * If n>=0 then t
67c0: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73  he P4 operand is
67d0: 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e   dynamic, meanin
67e0: 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66  g that a copy of
67f0: 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69  .** the string i
6800: 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f  s made into memo
6810: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
6820: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6830: 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66  )..** A value of
6840: 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79   n==0 means copy
6850: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70   bytes of zP4 up
6860: 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e   to and includin
6870: 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e  g the.** first n
6880: 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e  ull byte.  If n>
6890: 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20  0 then copy n+1 
68a0: 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a  bytes of zP4..**
68b0: 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65   .** Other value
68c0: 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49  s of n (P4_STATI
68d0: 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74  C, P4_COLLSEQ et
68e0: 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68 61  c.) indicate tha
68f0: 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20  t zP4 points.** 
6900: 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73  to a string or s
6910: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69 73  tructure that is
6920: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
6930: 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66  xist for the lif
6940: 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20  etime of.** the 
6950: 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63  Vdbe. In these c
6960: 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74  ases we can just
6970: 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65   copy the pointe
6980: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72  r..**.** If addr
6990: 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50  <0 then change P
69a0: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
69b0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
69c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
69d0: 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49  static void SQLI
69e0: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62 65  TE_NOINLINE vdbe
69f0: 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20 20  ChangeP4Full(.  
6a00: 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a 70  Vdbe *p,.  Op *p
6a10: 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Op,.  const char
6a20: 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a 29   *zP4,.  int n.)
6a30: 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34 74  {.  if( pOp->p4t
6a40: 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65 50  ype ){.    freeP
6a50: 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70 34  4(p->db, pOp->p4
6a60: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
6a70: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6a80: 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d 3e  e = 0;.    pOp->
6a90: 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  p4.p = 0;.  }.  
6aa0: 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20 73  if( n<0 ){.    s
6ab0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
6ac0: 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70 20  P4(p, (int)(pOp 
6ad0: 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c 20  - p->aOp), zP4, 
6ae0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
6af0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
6b00: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6b10: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
6b20: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
6b30: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
6b40: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
6b50: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
6b60: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  MIC;.  }.}.void 
6b70: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6b80: 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  eP4(Vdbe *p, int
6b90: 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68 61   addr, const cha
6ba0: 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b 0a  r *zP4, int n){.
6bb0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71 6c    Op *pOp;.  sql
6bc0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73 65  ite3 *db;.  asse
6bd0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64 62  rt( p!=0 );.  db
6be0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
6bf0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
6c00: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
6c10: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6c20: 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  p!=0 || db->mall
6c30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6c40: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
6c50: 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 21  ed ){.    if( n!
6c60: 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65 50  =P4_VTAB ) freeP
6c70: 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a 29  4(db, n, (void*)
6c80: 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b 0a  *(char**)&zP4);.
6c90: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6ca0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
6cb0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
6cc0: 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20  addr<p->nOp );. 
6cd0: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
6ce0: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
6cf0: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70 20   - 1;.  }.  pOp 
6d00: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
6d10: 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20 70  .  if( n>=0 || p
6d20: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
6d30: 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75    vdbeChangeP4Fu
6d40: 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c 20  ll(p, pOp, zP4, 
6d50: 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  n);.    return;.
6d60: 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f    }.  if( n==P4_
6d70: 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20  INT32 ){.    /* 
6d80: 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74 20  Note: this cast 
6d90: 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73 65  is safe, because
6da0: 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74 61   the origin data
6db0: 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69 6e   point was an in
6dc0: 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77 61  t.    ** that wa
6dd0: 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f 6e  s cast to a (con
6de0: 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20  st char *). */. 
6df0: 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53     pOp->p4.i = S
6e00: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
6e10: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
6e20: 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54 33  p4type = P4_INT3
6e30: 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  2;.  }else if( z
6e40: 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  P4!=0 ){.    ass
6e50: 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20 20  ert( n<0 );.    
6e60: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69  pOp->p4.p = (voi
6e70: 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d  d*)zP4;.    pOp-
6e80: 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e 65  >p4type = (signe
6e90: 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69 66  d char)n;.    if
6ea0: 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20 73  ( n==P4_VTAB ) s
6eb0: 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28 28  qlite3VtabLock((
6ec0: 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20 20  VTable*)zP4);.  
6ed0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
6ee0: 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  he P4 on the mos
6ef0: 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64  t recently added
6f00: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20 4b   opcode to the K
6f10: 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a 2a  eyInfo for the.*
6f20: 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a 2a  * index given..*
6f30: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
6f40: 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28 50  beSetP4KeyInfo(P
6f50: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49 6e  arse *pParse, In
6f60: 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56 64  dex *pIdx){.  Vd
6f70: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
6f80: 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74 28  pVdbe;.  assert(
6f90: 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72   v!=0 );.  asser
6fa0: 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20 20  t( pIdx!=0 );.  
6fb0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
6fc0: 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61 72  eP4(v, -1, (char
6fd0: 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  *)sqlite3KeyInfo
6fe0: 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c 20  OfIndex(pParse, 
6ff0: 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20 20  pIdx),.         
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34 5f               P4_
7010: 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66  KEYINFO);.}..#if
7020: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7030: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7040: 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  TS./*.** Change 
7050: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74  the comment on t
7060: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79  he most recently
7070: 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69   coded instructi
7080: 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65 72  on.  Or.** inser
7090: 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61 64  t a No-op and ad
70a0: 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74 6f  d the comment to
70b0: 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72 75   that new instru
70c0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a 20  ction.  This.** 
70d0: 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20 65  makes the code e
70e0: 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64 75  asier to read du
70f0: 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e 20  ring debugging. 
7100: 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68 61   None of this ha
7110: 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70 72  ppens.** in a pr
7120: 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e 0a  oduction build..
7130: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
7140: 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62 65  dbeVComment(Vdbe
7150: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
7160: 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69 73  *zFormat, va_lis
7170: 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74 28  t ap){.  assert(
7180: 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e   p->nOp>0 || p->
7190: 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  aOp==0 );.  asse
71a0: 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c  rt( p->aOp==0 ||
71b0: 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31   p->aOp[p->nOp-1
71c0: 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c  ].zComment==0 ||
71d0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
71e0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
71f0: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73 65  >nOp ){.    asse
7200: 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20 20  rt( p->aOp );.  
7210: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7220: 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d  p->db, p->aOp[p-
7230: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
7240: 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70 2d  );.    p->aOp[p-
7250: 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74  >nOp-1].zComment
7260: 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e   = sqlite3VMPrin
7270: 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61  tf(p->db, zForma
7280: 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f  t, ap);.  }.}.vo
7290: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
72a0: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
72b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
72c0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
72d0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
72e0: 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  ){.    va_start(
72f0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
7300: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
7310: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
7320: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
7330: 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74    }.}.void sqlit
7340: 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e  e3VdbeNoopCommen
7350: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
7360: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
7370: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
7380: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
7390: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
73a0: 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29  dOp0(p, OP_Noop)
73b0: 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
73c0: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20  p, zFormat);.   
73d0: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c   vdbeVComment(p,
73e0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
73f0: 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20     va_end(ap);. 
7400: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a 20   }.}.#endif  /* 
7410: 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64 65  NDEBUG */..#ifde
7420: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
7430: 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74  VERAGE./*.** Set
7440: 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74 68   the value if th
7450: 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c 64  e iSrcLine field
7460: 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f 75   for the previou
7470: 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75  sly coded instru
7480: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
7490: 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69 6e  qlite3VdbeSetLin
74a0: 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76 2c  eNumber(Vdbe *v,
74b0: 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20 73   int iLine){.  s
74c0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
74d0: 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65 20  v,-1)->iSrcLine 
74e0: 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69  = iLine;.}.#endi
74f0: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42 45  f /* SQLITE_VDBE
7500: 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a  _COVERAGE */../*
7510: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6f  .** Return the o
7520: 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76 65  pcode for a give
7530: 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20 74  n address.  If t
7540: 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d 31  he address is -1
7550: 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72 6e  , then.** return
7560: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7570: 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63 6f  ly inserted opco
7580: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  de..**.** If a m
7590: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
75a0: 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72   error has occur
75b0: 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65  red prior to the
75c0: 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69 73   calling of this
75d0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68 65  .** routine, the
75e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
75f0: 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77 69   dummy VdbeOp wi
7600: 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20  ll be returned. 
7610: 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a 20   That opcode.** 
7620: 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74 20  is readable but 
7630: 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74 68  not writable, th
7640: 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74 20  ough it is cast 
7650: 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76 61  to a writable va
7660: 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75  lue..** The retu
7670: 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f 70  rn of a dummy op
7680: 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65 20  code allows the 
7690: 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75 65  call to continue
76a0: 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20   functioning.** 
76b0: 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61 75  after an OOM fau
76c0: 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  lt without havin
76d0: 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73 65  g to check to se
76e0: 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e 20  e if the return 
76f0: 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72 6f  from .** this ro
7700: 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69 64  utine is a valid
7710: 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20 62   pointer.  But b
7720: 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d 79  ecause the dummy
7730: 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a 2a  .opcode is 0,.**
7740: 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76 65   dummy will neve
7750: 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e  r be written to.
7760: 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66 69    This is verifi
7770: 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70 65  ed by code inspe
7780: 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79 20  ction and.** by 
7790: 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61 6c  running with Val
77a0: 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70  grind..*/.VdbeOp
77b0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
77c0: 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  Op(Vdbe *p, int 
77d0: 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39 20  addr){.  /* C89 
77e0: 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20 74  specifies that t
77f0: 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75 6d  he constant "dum
7800: 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69 74  my" will be init
7810: 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a 20  ialized to all. 
7820: 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63 68   ** zeros, which
7830: 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d 53   is correct.  MS
7840: 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20 77  VC generates a w
7850: 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68 65  arning, neverthe
7860: 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74 69  less. */.  stati
7870: 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b 20  c VdbeOp dummy; 
7880: 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 4d   /* Ignore the M
7890: 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f 75  SVC warning abou
78a0: 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65 72  t no initializer
78b0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
78c0: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
78d0: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
78e0: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
78f0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
7900: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
7910: 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72  (addr>=0 && addr
7920: 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64  <p->nOp) || p->d
7930: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7940: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
7950: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
7960: 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62 65      return (Vdbe
7970: 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d 65  Op*)&dummy;.  }e
7980: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
7990: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
79a0: 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65   }.}..#if define
79b0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
79c0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
79d0: 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  )./*.** Return a
79e0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  n integer value 
79f0: 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 70  for one of the p
7a00: 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68 65  arameters to the
7a10: 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20 64   opcode pOp.** d
7a20: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68 61  etermined by cha
7a30: 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74 61  racter c..*/.sta
7a40: 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61 74  tic int translat
7a50: 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73 74  eP(char c, const
7a60: 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66 28   Op *pOp){.  if(
7a70: 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72 6e   c=='1' ) return
7a80: 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28 20   pOp->p1;.  if( 
7a90: 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e 20  c=='2' ) return 
7aa0: 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20 63  pOp->p2;.  if( c
7ab0: 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20 70  =='3' ) return p
7ac0: 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63 3d  Op->p3;.  if( c=
7ad0: 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70 4f  ='4' ) return pO
7ae0: 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75 72  p->p4.i;.  retur
7af0: 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a  n pOp->p5;.}../*
7b00: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
7b10: 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63 6f  ring for the "co
7b20: 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66 20  mment" field of 
7b30: 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c 69  a VDBE opcode li
7b40: 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sting..**.** The
7b50: 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c 64   Synopsis: field
7b60: 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   in comments in 
7b70: 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63  the vdbe.c sourc
7b80: 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e 76  e file gets conv
7b90: 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20 65  erted.** to an e
7ba0: 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61 74  xtra string that
7bb0: 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20   is appended to 
7bc0: 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  the sqlite3Opcod
7bd0: 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68 65  eName().  In the
7be0: 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20 6f  .** absence of o
7bf0: 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20 74  ther comments, t
7c00: 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65 63  his synopsis bec
7c10: 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e 74  omes the comment
7c20: 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e 0a   on the opcode..
7c30: 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61 74  ** Some translat
7c40: 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a  ion occurs:.**.*
7c50: 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20 20  *       "PX"    
7c60: 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a 20    ->  "r[X]".** 
7c70: 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20 20        "PX@PY"   
7c80: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d  ->  "r[X..X+Y-1]
7c90: 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20  "  or "r[x]" if 
7ca0: 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20 20  y is 0 or 1.**  
7cb0: 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20 2d       "PX@PY+1" -
7cc0: 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20 20  >  "r[X..X+Y]"  
7cd0: 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79    or "r[x]" if y
7ce0: 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20 22   is 0.**       "
7cf0: 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72 5b  PY..PY"  ->  "r[
7d00: 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20 22  X..Y]"      or "
7d10: 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a 2f  r[x]" if y<=x.*/
7d20: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
7d30: 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f  layComment(.  co
7d40: 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20 20  nst Op *pOp,    
7d50: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 74   /* The opcode t
7d60: 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20 2a  o be commented *
7d70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7d80: 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69 6f  zP4,   /* Previo
7d90: 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76 61  usly obtained va
7da0: 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20 20  lue for P4 */.  
7db0: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20 20  char *zTemp,    
7dc0: 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73 75     /* Write resu
7dd0: 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  lt here */.  int
7de0: 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20 20   nTemp          
7df0: 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61 62  /* Space availab
7e00: 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f  le in zTemp[] */
7e10: 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
7e20: 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e   *zOpName;.  con
7e30: 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70 73  st char *zSynops
7e40: 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61 6d  is;.  int nOpNam
7e50: 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a 3b  e;.  int ii, jj;
7e60: 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  zOpName = sql
7e70: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
7e80: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e  Op->opcode);.  n
7e90: 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  OpName = sqlite3
7ea0: 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65  Strlen30(zOpName
7eb0: 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65  );.  if( zOpName
7ec0: 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20  [nOpName+1] ){. 
7ed0: 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d     int seenCom =
7ee0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b 0a   0;.    char c;.
7ef0: 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20      zSynopsis = 
7f00: 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61  zOpName += nOpNa
7f10: 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72 28  me + 1;.    for(
7f20: 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d  ii=jj=0; jj<nTem
7f30: 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e  p-1 && (c = zSyn
7f40: 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69  opsis[ii])!=0; i
7f50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
7f60: 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20  c=='P' ){.      
7f70: 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b    c = zSynopsis[
7f80: 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  ++ii];.        i
7f90: 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20  f( c=='4' ){.   
7fa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
7fb0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
7fc0: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22  , zTemp+jj, "%s"
7fd0: 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20  , zP4);.        
7fe0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27  }else if( c=='X'
7ff0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
8000: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8010: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
8020: 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43  j, "%s", pOp->zC
8030: 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  omment);.       
8040: 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a     seenCom = 1;.
8050: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
8060: 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31 20           int v1 
8070: 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20  = translateP(c, 
8080: 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pOp);.          
8090: 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20  int v2;.        
80a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
80b0: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
80c0: 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29  mp+jj, "%d", v1)
80d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
80e0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
80f0: 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29  s+ii+1, "@P", 2)
8100: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8110: 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20     ii += 3;.    
8120: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
8130: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
8140: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20  emp+jj);.       
8150: 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c       v2 = transl
8160: 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69  ateP(zSynopsis[i
8170: 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  i], pOp);.      
8180: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
8190: 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31  p(zSynopsis+ii+1
81a0: 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20  ,"+1",2)==0 ){. 
81b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20               ii 
81c0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20  += 2;.          
81d0: 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20      v2++;.      
81e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
81f0: 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a      if( v2>1 ){.
8200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
8210: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8220: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
8230: 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32  j, "..%d", v1+v2
8240: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1);.           
8250: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c   }.          }el
8260: 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
8270: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
8280: 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20  ..P3", 4)==0 && 
8290: 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20  pOp->p3==0 ){.  
82a0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
82b0: 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
82c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
82d0: 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74   jj += sqlite3St
82e0: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29  rlen30(zTemp+jj)
82f0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
8300: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b         zTemp[jj+
8310: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
8320: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73      }.    if( !s
8330: 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65  eenCom && jj<nTe
8340: 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f  mp-5 && pOp->zCo
8350: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  mment ){.      s
8360: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8370: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
8380: 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d  jj, "; %s", pOp-
8390: 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20  >zComment);.    
83a0: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
83b0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
83c0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
83d0: 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d   jj<nTemp ) zTem
83e0: 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c  p[jj] = 0;.  }el
83f0: 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d  se if( pOp->zCom
8400: 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  ment ){.    sqli
8410: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8420: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c  mp, zTemp, "%s",
8430: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
8440: 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65  .    jj = sqlite
8450: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29  3Strlen30(zTemp)
8460: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
8470: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
8480: 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72   jj = 0;.  }.  r
8490: 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64  eturn jj;.}.#end
84a0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
84b0: 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f  UG */..#if VDBE_
84c0: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
84d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
84e0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
84f0: 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74  )./*.** Translat
8500: 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20 76  e the P4.pExpr v
8510: 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43  alue for an OP_C
8520: 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65  ursorHint opcode
8530: 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68   into text.** th
8540: 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61  at can be displa
8550: 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f  yed in the P4 co
8560: 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20  lumn of EXPLAIN 
8570: 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  output..*/.stati
8580: 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34  c void displayP4
8590: 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70  Expr(StrAccum *p
85a0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
85b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
85c0: 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28  p = 0;.  switch(
85d0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
85e0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
85f0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
8600: 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c 20  Printf(p, "%Q", 
8610: 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29  pExpr->u.zToken)
8620: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8630: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
8640: 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ER:.      sqlite
8650: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64 22  3XPrintf(p, "%d"
8660: 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75  , pExpr->u.iValu
8670: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
8680: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
8690: 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  L:.      sqlite3
86a0: 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c  XPrintf(p, "NULL
86b0: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
86c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47  .    case TK_REG
86d0: 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73  ISTER: {.      s
86e0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
86f0: 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d   "r[%d]", pExpr-
8700: 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  >iTable);.      
8710: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8720: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
8730: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
8740: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b  pr->iColumn<0 ){
8750: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8760: 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 69  XPrintf(p, "rowi
8770: 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  d");.      }else
8780: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8790: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25 64  3XPrintf(p, "c%d
87a0: 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69  ", (int)pExpr->i
87b0: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
87c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
87d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
87e0: 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  LT:      zOp = "
87f0: 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  LT";      break;
8800: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
8810: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22        zOp = "LE"
8820: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8830: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
8840: 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20     zOp = "GT";  
8850: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8860: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
8870: 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20  zOp = "GE";     
8880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8890: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70   TK_NE:      zOp
88a0: 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72   = "NE";      br
88b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
88c0: 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _EQ:      zOp = 
88d0: 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "EQ";      break
88e0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
88f0: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53  :      zOp = "IS
8900: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8910: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54     case TK_ISNOT
8920: 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54  :   zOp = "ISNOT
8930: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
8940: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20  case TK_AND:    
8950: 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20   zOp = "AND";   
8960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8970: 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f  e TK_OR:      zO
8980: 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62  p = "OR";      b
8990: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
89a0: 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d  K_PLUS:    zOp =
89b0: 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65 61   "ADD";     brea
89c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
89d0: 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d  TAR:    zOp = "M
89e0: 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  UL";     break;.
89f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55      case TK_MINU
8a00: 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22  S:   zOp = "SUB"
8a10: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
8a20: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
8a30: 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20    zOp = "REM";  
8a40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8a50: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a  se TK_BITAND:  z
8a60: 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20  Op = "BITAND";  
8a70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8a80: 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20  TK_BITOR:   zOp 
8a90: 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65  = "BITOR";   bre
8aa0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8ab0: 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22  SLASH:   zOp = "
8ac0: 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  DIV";     break;
8ad0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
8ae0: 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48  IFT:  zOp = "LSH
8af0: 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IFT";  break;.  
8b00: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
8b10: 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54  :  zOp = "RSHIFT
8b20: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
8b30: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20  ase TK_CONCAT:  
8b40: 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20  zOp = "CONCAT"; 
8b50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8b60: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70   TK_UMINUS:  zOp
8b70: 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72   = "MINUS";   br
8b80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8b90: 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _UPLUS:   zOp = 
8ba0: 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b  "PLUS";    break
8bb0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8bc0: 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TNOT:  zOp = "BI
8bd0: 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TNOT";  break;. 
8be0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
8bf0: 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b      zOp = "NOT";
8c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c10: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20  case TK_ISNULL: 
8c20: 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b   zOp = "ISNULL";
8c30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8c40: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f  e TK_NOTNULL: zO
8c50: 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62  p = "NOTNULL"; b
8c60: 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75  reak;..    defau
8c70: 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  lt:.      sqlite
8c80: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22  3XPrintf(p, "%s"
8c90: 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20  , "expr");.     
8ca0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
8cb0: 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71  f( zOp ){.    sq
8cc0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8cd0: 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20  "%s(", zOp);.   
8ce0: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 70   displayP4Expr(p
8cf0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
8d00: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
8d10: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
8d20: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41  sqlite3StrAccumA
8d30: 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29  ppend(p, ",", 1)
8d40: 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 50  ;.      displayP
8d50: 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e  4Expr(p, pExpr->
8d60: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20  pRight);.    }. 
8d70: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
8d80: 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22 2c  umAppend(p, ")",
8d90: 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   1);.  }.}.#endi
8da0: 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41  f /* VDBE_DISPLA
8db0: 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28  Y_P4 && defined(
8dc0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
8dd0: 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a  RSOR_HINTS) */..
8de0: 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41  .#if VDBE_DISPLA
8df0: 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  Y_P4./*.** Compu
8e00: 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  te a string that
8e10: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50   describes the P
8e20: 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20  4 parameter for 
8e30: 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73  an opcode..** Us
8e40: 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20  e zTemp for any 
8e50: 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61  required tempora
8e60: 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e  ry buffer space.
8e70: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
8e80: 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70  *displayP4(Op *p
8e90: 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  Op, char *zTemp,
8ea0: 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63   int nTemp){.  c
8eb0: 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70  har *zP4 = zTemp
8ec0: 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a  ;.  StrAccum x;.
8ed0: 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e    assert( nTemp>
8ee0: 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  =20 );.  sqlite3
8ef0: 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c  StrAccumInit(&x,
8f00: 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70   0, zTemp, nTemp
8f10: 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20  , 0);.  switch( 
8f20: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
8f30: 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e     case P4_KEYIN
8f40: 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  FO: {.      int 
8f50: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
8f60: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
8f70: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
8f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
8f90: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
8fa0: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
8fb0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
8fc0: 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66   "k(%d", pKeyInf
8fd0: 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20  o->nField);.    
8fe0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
8ff0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
9000: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
9010: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
9020: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
9030: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
9040: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
9050: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
9060: 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20  me : "";.       
9070: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c   if( strcmp(zCol
9080: 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20  l, "BINARY")==0 
9090: 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20  ) zColl = "B";. 
90a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
90b0: 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 73 25 73  rintf(&x, ",%s%s
90c0: 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  ", pKeyInfo->aSo
90d0: 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22  rtOrder[j] ? "-"
90e0: 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20   : "", zColl);. 
90f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
9100: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
9110: 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a  nd(&x, ")", 1);.
9120: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9130: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9140: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
9150: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
9160: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
9170: 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c  isplayP4Expr(&x,
9180: 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b   pOp->p4.pExpr);
9190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
91a0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
91b0: 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20  ase P4_COLLSEQ: 
91c0: 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20  {.      CollSeq 
91d0: 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34  *pColl = pOp->p4
91e0: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71  .pColl;.      sq
91f0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9200: 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c   "(%.20s)", pCol
9210: 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  l->zName);.     
9220: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9230: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45    case P4_FUNCDE
9240: 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  F: {.      FuncD
9250: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
9260: 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20  p4.pFunc;.      
9270: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9280: 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44 65  x, "%s(%d)", pDe
9290: 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e  f->zName, pDef->
92a0: 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65  nArg);.      bre
92b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66  ak;.    }.#ifdef
92c0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
92d0: 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54    case P4_FUNCCT
92e0: 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44  X: {.      FuncD
92f0: 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e  ef *pDef = pOp->
9300: 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a  p4.pCtx->pFunc;.
9310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9320: 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29  intf(&x, "%s(%d)
9330: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
9340: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
9350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9360: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
9370: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
9380: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9390: 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f  (&x, "%lld", *pO
93a0: 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20  p->p4.pI64);.   
93b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
93c0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33      case P4_INT3
93d0: 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2: {.      sqlit
93e0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
93f0: 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a  d", pOp->p4.i);.
9400: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9410: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52   }.    case P4_R
9420: 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EAL: {.      sql
9430: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
9440: 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70  "%.16g", *pOp->p
9450: 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20  4.pReal);.      
9460: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9470: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
9480: 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20        Mem *pMem 
9490: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a  = pOp->p4.pMem;.
94a0: 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e        if( pMem->
94b0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
94c0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  ){.        zP4 =
94d0: 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20   pMem->z;.      
94e0: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
94f0: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
9500: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9510: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9520: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
9530: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
9540: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9550: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
9560: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9570: 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20  tf(&x, "%.16g", 
9580: 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  pMem->u.r);.    
9590: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
95a0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ->flags & MEM_Nu
95b0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  ll ){.        zP
95c0: 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20  4 = "NULL";.    
95d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
95e0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
95f0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
9600: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
9610: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
9620: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
9630: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
9640: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
9650: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
9660: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
9670: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
9680: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
9690: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
96a0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
96b0: 66 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c  f(&x, "vtab:%p",
96c0: 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62   pVtab);.      b
96d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
96e0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
96f0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
9700: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e   int i;.      in
9710: 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e  t *ai = pOp->p4.
9720: 61 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  ai;.      int n 
9730: 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68  = ai[0];   /* Th
9740: 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20  e first element 
9750: 6f 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69  of an INTARRAY i
9760: 73 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20  s always the.   
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20      ** count of 
9790: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
97a0: 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77  ements to follow
97b0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
97c0: 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<n; i++){.  
97d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
97e0: 69 6e 74 66 28 26 78 2c 20 22 2c 25 64 22 2c 20  intf(&x, ",%d", 
97f0: 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  ai[i]);.      }.
9800: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
9810: 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69   '[';.      sqli
9820: 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
9830: 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20  d(&x, "]", 1);. 
9840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9850: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
9860: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
9870: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
9880: 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b  (&x, "program");
9890: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
98a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
98b0: 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20  ADVANCE: {.     
98c0: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
98d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
98e0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
98f0: 0a 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70  .      zP4 = pOp
9900: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66  ->p4.z;.      if
9910: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
9920: 20 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b      zP4 = zTemp;
9930: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30  .        zTemp[0
9940: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
9950: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
9960: 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
9970: 28 26 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (&x);.  assert( 
9980: 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  zP4!=0 );.  retu
9990: 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66  rn zP4;.}.#endif
99a0: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
99b0: 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65  _P4 */../*.** De
99c0: 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62  clare to the Vdb
99d0: 65 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65  e that the BTree
99e0: 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61   object at db->a
99f0: 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a  Db[i] is used..*
9a00: 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65  *.** The prepare
9a10: 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65  d statements nee
9a20: 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76  d to know in adv
9a30: 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74  ance the complet
9a40: 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61  e set of.** atta
9a50: 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74  ched databases t
9a60: 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e  hat will be use.
9a70: 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73    A mask of thes
9a80: 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69  e databases.** i
9a90: 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20  s maintained in 
9aa0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54  p->btreeMask.  T
9ab0: 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76  he p->lockMask v
9ac0: 61 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73  alue is the subs
9ad0: 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65  et of.** p->btre
9ae0: 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73  eMask of databas
9af0: 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71  es that will req
9b00: 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a  uire a lock..*/.
9b10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9b20: 55 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a  UsesBtree(Vdbe *
9b30: 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73  p, int i){.  ass
9b40: 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70  ert( i>=0 && i<p
9b50: 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28  ->db->nDb && i<(
9b60: 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61  int)sizeof(yDbMa
9b70: 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72  sk)*8 );.  asser
9b80: 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  t( i<(int)sizeof
9b90: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38  (p->btreeMask)*8
9ba0: 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28   );.  DbMaskSet(
9bb0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29  p->btreeMask, i)
9bc0: 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20  ;.  if( i!=1 && 
9bd0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72  sqlite3BtreeShar
9be0: 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b  able(p->db->aDb[
9bf0: 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44  i].pBt) ){.    D
9c00: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b  bMaskSet(p->lock
9c10: 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a  Mask, i);.  }.}.
9c20: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9c30: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9c40: 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66  _CACHE)./*.** If
9c50: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
9c60: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
9c70: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
9c80: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
9c90: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
9ca0: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
9cb0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
9cc0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
9cd0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
9ce0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
9cf0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
9d00: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
9d10: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
9d20: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
9d30: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
9d40: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
9d50: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
9d60: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
9d70: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
9d80: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
9d90: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
9da0: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
9db0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
9dc0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
9dd0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
9de0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
9df0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
9e00: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
9e10: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
9e20: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
9e30: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
9e40: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
9e50: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
9e60: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
9e70: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
9e80: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
9e90: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
9ea0: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
9eb0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
9ec0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
9ed0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
9ee0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
9ef0: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
9f00: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
9f10: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
9f20: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
9f30: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
9f40: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
9f50: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
9f60: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
9f70: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
9f80: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
9f90: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
9fa0: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
9fb0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
9fc0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
9fd0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
9fe0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
9ff0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
a000: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
a010: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
a020: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
a030: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
a040: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
a050: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
a060: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
a070: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
a080: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
a090: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44  int nDb;.  if( D
a0a0: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
a0b0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
a0c0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
a0d0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
a0e0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
a0f0: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
a100: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
a110: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
a120: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
a130: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
a140: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
a150: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
a160: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
a170: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
a180: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
a190: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
a1a0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a1b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a1c0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
a1d0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
a1e0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c  /*.** Unlock all
a1f0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70   of the btrees p
a200: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
a210: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
a220: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29  lite3VdbeEnter()
a230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
a240: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
a250: 20 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20   vdbeLeave(Vdbe 
a260: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
a270: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
a280: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
a290: 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
a2a0: 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  .  aDb = db->aDb
a2b0: 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44  ;.  nDb = db->nD
a2c0: 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  b;.  for(i=0; i<
a2d0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
a2e0: 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73  f( i!=1 && DbMas
a2f0: 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  kTest(p->lockMas
a300: 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61  k,i) && ALWAYS(a
a310: 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b  Db[i].pBt!=0) ){
a320: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
a330: 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e  reeLeave(aDb[i].
a340: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pBt);.    }.  }.
a350: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
a360: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
a370: 7b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  {.  if( DbMaskAl
a380: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
a390: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
a3a0: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
a3b0: 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28   */.  vdbeLeave(
a3c0: 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  p);.}.#endif..#i
a3d0: 66 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  f defined(VDBE_P
a3e0: 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e  ROFILE) || defin
a3f0: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
a400: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
a410: 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54  ingle opcode.  T
a420: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
a430: 73 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  sed for debuggin
a440: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20  g only..*/.void 
a450: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
a460: 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69  Op(FILE *pOut, i
a470: 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b  nt pc, Op *pOp){
a480: 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20  .  char *zP4;.  
a490: 63 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20  char zPtr[50];. 
a4a0: 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b   char zCom[100];
a4b0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
a4c0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d  char *zFormat1 =
a4d0: 20 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20   "%4d %-13s %4d 
a4e0: 25 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e  %4d %4d %-13s %.
a4f0: 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20  2X %s\n";.  if( 
a500: 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d  pOut==0 ) pOut =
a510: 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d   stdout;.  zP4 =
a520: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
a530: 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74  zPtr, sizeof(zPt
a540: 72 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  r));.#ifdef SQLI
a550: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
a560: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73  N_COMMENTS.  dis
a570: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
a580: 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65   zP4, zCom, size
a590: 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65  of(zCom));.#else
a5a0: 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a  .  zCom[0] = 0;.
a5b0: 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20  #endif.  /* NB: 
a5c0: 20 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   The sqlite3Opco
a5d0: 64 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f  deName() functio
a5e0: 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
a5f0: 20 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64   by code created
a600: 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f  .  ** by the mko
a610: 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d  pcodeh.awk and m
a620: 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72  kopcodec.awk scr
a630: 69 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61  ipts which extra
a640: 63 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f  ct the.  ** info
a650: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
a660: 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74   vdbe.c source t
a670: 65 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66  ext */.  fprintf
a680: 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c  (pOut, zFormat1,
a690: 20 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69   pc, .      sqli
a6a0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
a6b0: 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d  p->opcode), pOp-
a6c0: 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f  >p1, pOp->p2, pO
a6d0: 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d  p->p3, zP4, pOp-
a6e0: 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a  >p5,.      zCom.
a6f0: 20 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f    );.  fflush(pO
a700: 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  ut);.}.#endif../
a710: 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20  *.** Release an 
a720: 61 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65  array of N Mem e
a730: 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  lements.*/.stati
a740: 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65  c void releaseMe
a750: 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69  mArray(Mem *p, i
a760: 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26  nt N){.  if( p &
a770: 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  & N ){.    Mem *
a780: 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20  pEnd = &p[N];.  
a790: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a7a0: 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64  p->db;.    if( d
a7b0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20  b->pnBytesFreed 
a7c0: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
a7d0: 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61       if( p->szMa
a7e0: 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62  lloc ) sqlite3Db
a7f0: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
a800: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  loc);.      }whi
a810: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
a820: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
a830: 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
a840: 20 20 20 20 61 73 73 65 72 74 28 20 28 26 70 5b      assert( (&p[
a850: 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30  1])==pEnd || p[0
a860: 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b  ].db==p[1].db );
a870: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
a880: 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d  qlite3VdbeCheckM
a890: 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20  emInvariants(p) 
a8a0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  );..      /* Thi
a8b0: 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c  s block is reall
a8c0: 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72  y an inlined ver
a8d0: 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
a8e0: 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a  dbeMemRelease().
a8f0: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61        ** that ta
a900: 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66  kes advantage of
a910: 20 74 68 65 20 66 61 63 74 20 74 68 61 74 20 74   the fact that t
a920: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76  he memory cell v
a930: 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a  alue is .      *
a940: 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e  * being set to N
a950: 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73  ULL after releas
a960: 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20  ing any dynamic 
a970: 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20  resources..     
a980: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65   **.      ** The
a990: 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66   justification f
a9a0: 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63  or duplicating c
a9b0: 6f 64 65 20 69 73 20 74 68 61 74 20 61 63 63 6f  ode is that acco
a9c0: 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20  rding to .      
a9d0: 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68  ** callgrind, th
a9e0: 69 73 20 63 61 75 73 65 73 20 61 20 63 65 72 74  is causes a cert
a9f0: 61 69 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f  ain test case to
aa00: 20 68 69 74 20 74 68 65 20 43 50 55 20 34 2e 37   hit the CPU 4.7
aa10: 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65   .      ** perce
aa20: 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e  nt less (x86 lin
aa30: 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20  ux, gcc version 
aa40: 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e  4.1.2, -O6) than
aa50: 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71   if .      ** sq
aa60: 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28  lite3MemRelease(
aa70: 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72  ) were called fr
aa80: 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f  om here. With -O
aa90: 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20  2, this jumps.  
aaa0: 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65      ** to 6.6 pe
aab0: 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20  rcent. The test 
aac0: 63 61 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e  case is insertin
aad0: 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f  g 1000 rows into
aae0: 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20   a table .      
aaf0: 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78  ** with no index
ab00: 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  es using a singl
ab10: 65 20 70 72 65 70 61 72 65 64 20 49 4e 53 45 52  e prepared INSER
ab20: 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e  T statement, bin
ab30: 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e  d() .      ** an
ab40: 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72  d reset(). Inser
ab50: 74 73 20 61 72 65 20 67 72 6f 75 70 65 64 20 69  ts are grouped i
ab60: 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f  nto a transactio
ab70: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
ab80: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
ab90: 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29  lags & MEM_Agg )
aba0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
abb0: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
abc0: 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65  _Dyn );.      te
abd0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
abe0: 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a   & MEM_Frame );.
abf0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ac00: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52  p->flags & MEM_R
ac10: 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69  owSet );.      i
ac20: 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d  f( p->flags&(MEM
ac30: 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d  _Agg|MEM_Dyn|MEM
ac40: 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65  _Frame|MEM_RowSe
ac50: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  t) ){.        sq
ac60: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
ac70: 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65  ase(p);.      }e
ac80: 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c  lse if( p->szMal
ac90: 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  loc ){.        s
aca0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
acb0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
acc0: 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f        p->szMallo
acd0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a  c = 0;.      }..
ace0: 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d        p->flags =
acf0: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
ad00: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
ad10: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a  )<pEnd );.  }.}.
ad20: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20  ./*.** Delete a 
ad30: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
ad40: 20 61 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74   and its content
ad50: 73 2e 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a  s. VdbeFrame obj
ad60: 65 63 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ects are.** allo
ad70: 63 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f  cated by the OP_
ad80: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
ad90: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  n sqlite3VdbeExe
ada0: 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c()..*/.void sql
adb0: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
adc0: 65 74 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ete(VdbeFrame *p
add0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65  ){.  int i;.  Me
ade0: 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72  m *aMem = VdbeFr
adf0: 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62  ameMem(p);.  Vdb
ae00: 65 43 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20  eCursor **apCsr 
ae10: 3d 20 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  = (VdbeCursor **
ae20: 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64  )&aMem[p->nChild
ae30: 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Mem];.  for(i=0;
ae40: 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b   i<p->nChildCsr;
ae50: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
ae60: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
ae70: 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29  (p->v, apCsr[i])
ae80: 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d  ;.  }.  releaseM
ae90: 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d  emArray(aMem, p-
aea0: 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73  >nChildMem);.  s
aeb0: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
aec0: 41 75 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62  AuxData(p->v->db
aed0: 2c 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &p->pAuxData, 
aee0: 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  -1, 0);.  sqlite
aef0: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
af00: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
af10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
af20: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
af30: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
af40: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
af50: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
af60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
af70: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
af80: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
af90: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
afa0: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
afb0: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
afc0: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
afd0: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
afe0: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
aff0: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
b000: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
b010: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
b020: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
b030: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
b040: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
b050: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
b060: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
b070: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
b080: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
b090: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
b0a0: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
b0b0: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
b0c0: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
b0d0: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
b0e0: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
b0f0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
b100: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
b110: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
b120: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
b130: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
b140: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
b150: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b160: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
b170: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
b180: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
b190: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
b1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b1b0: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
b1c0: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
b1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1e0: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
b1f0: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
b200: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
b210: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
b220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b230: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b240: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
b250: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
b260: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
b270: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b280: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
b290: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
b2a0: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
b2b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2c0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
b2d0: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
b2e0: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
b2f0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b310: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
b320: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
b330: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b360: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
b370: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
b3a0: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
b3b0: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
b3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b3d0: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
b3e0: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
b3f0: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
b400: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
b410: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
b420: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
b430: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b440: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
b450: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
b460: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
b470: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
b480: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
b490: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
b4a0: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
b4b0: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
b4c0: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
b4d0: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
b4e0: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
b4f0: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
b500: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
b510: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
b520: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
b530: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
b540: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
b550: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
b560: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
b570: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
b580: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
b590: 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  PT ){.    /* Thi
b5a0: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
b5b0: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
b5c0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b5d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
b5e0: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
b5f0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
b600: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
b610: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
b620: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
b630: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b640: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
b650: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
b660: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
b670: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
b680: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
b690: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
b6a0: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
b6b0: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
b6c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
b6d0: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
b6e0: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
b6f0: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
b700: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
b710: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
b720: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b730: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
b740: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
b750: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
b760: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
b770: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
b780: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
b790: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b7a0: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
b7b0: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
b7c0: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
b7d0: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
b7e0: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
b7f0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
b800: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
b810: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
b820: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
b830: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
b840: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
b850: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
b860: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
b870: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
b880: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
b890: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
b8a0: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
b8b0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b8c0: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
b8d0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
b8e0: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
b8f0: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
b900: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
b910: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
b920: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
b930: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
b940: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
b950: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
b960: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
b970: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
b980: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
b990: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
b9a0: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
b9b0: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
b9c0: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
b9d0: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
b9e0: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
b9f0: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
ba00: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
ba10: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
ba20: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
ba30: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
ba40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
ba50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
ba60: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
ba70: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
ba80: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
ba90: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
baa0: 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c  <nRow && p->expl
bab0: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
bac0: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
bad0: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
bae0: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70  i>=nRow ){.    p
baf0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
bb00: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
bb10: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
bb20: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
bb30: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
bb40: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
bb50: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
bb60: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
bb70: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bb80: 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33  Error(p, sqlite3
bb90: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
bba0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
bbb0: 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a  r *zP4;.    Op *
bbc0: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
bbd0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
bbe0: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
bbf0: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
bc00: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
bc10: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
bc20: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
bc30: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
bc40: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
bc50: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
bc60: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
bc70: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
bc80: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
bc90: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
bca0: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
bcb0: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
bcc0: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
bcd0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
bce0: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
bcf0: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
bd00: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
bd10: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
bd20: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
bd30: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
bd40: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
bd50: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
bd60: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
bd70: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
bd80: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
bd90: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
bda0: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
bdd0: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
bde0: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
bdf0: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
be00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
be10: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
be20: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
be30: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
be40: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
be50: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20  Op->opcode); /* 
be60: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
be70: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
be80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
be90: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
bea0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
beb0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
bec0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
bed0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
bee0: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
bef0: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
bf00: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
bf10: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
bf20: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
bf30: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
bf40: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
bf50: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
bf60: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
bf70: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
bf80: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
bf90: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
bfa0: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
bfb0: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
bfc0: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
bfd0: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
bfe0: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
bff0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c000: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
c010: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
c020: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
c030: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
c040: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
c050: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
c060: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
c070: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
c080: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
c090: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
c0a0: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
c0b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c0c0: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
c0d0: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
c0e0: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
c0f0: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
c100: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
c110: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
c120: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
c130: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  ;.          apSu
c140: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
c150: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
c160: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
c170: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
c180: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
c190: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
c1a0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
c1b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c1c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
c1d0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c1e0: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
c1f0: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
c220: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
c230: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c240: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
c250: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
c280: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
c290: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c2a0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
c2b0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
c2c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c2d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
c2e0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
c2f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c300: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
c310: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29  esize(pMem, 100)
c320: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
c330: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
c340: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c350: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
c360: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
c370: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
c380: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
c390: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
c3a0: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
c3b0: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73  pMem->z, pMem->s
c3c0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  zMalloc);.    if
c3d0: 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29  ( zP4!=pMem->z )
c3e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c3f0: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
c400: 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49  m, zP4, -1, SQLI
c410: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
c420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
c430: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
c440: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
c450: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
c460: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
c470: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c480: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
c490: 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a   }.    pMem++;..
c4a0: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
c4b0: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
c4c0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
c4d0: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
c4e0: 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20  pMem, 4) ){.    
c4f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
c500: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c510: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c520: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
c540: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c550: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
c560: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
c570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
c580: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
c590: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
c5a0: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
c5b0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
c5c0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
c5d0: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
c5e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c5f0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
c600: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
c610: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
c620: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
c630: 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20  em, 500) ){.    
c640: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
c650: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c660: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c670: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
c690: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c6a0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
c6b0: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
c6c0: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
c6d0: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
c6e0: 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  500);.      pMem
c6f0: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c700: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
c710: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c720: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
c730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c740: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
c750: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
c760: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
c770: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
c780: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
c790: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
c7a0: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
c7b0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c7c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
c7d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c7e0: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
c7f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
c800: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
c810: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
c820: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
c830: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
c840: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
c850: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
c860: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
c870: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
c880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
c890: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
c8a0: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
c8b0: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
c8c0: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
c8d0: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
c8e0: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
c8f0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
c900: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
c910: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
c920: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
c930: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
c940: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
c950: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
c960: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
c970: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
c980: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
c990: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
c9a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
c9b0: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
c9c0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
c9d0: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
c9e0: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
c9f0: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
ca00: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
ca10: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
ca20: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
ca30: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
ca40: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
ca50: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
ca60: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
ca70: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
ca80: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
ca90: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
caa0: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
cab0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
cac0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
cad0: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
cae0: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
caf0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
cb00: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
cb10: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
cb20: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
cb30: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
cb40: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
cb50: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
cb60: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
cb70: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
cb80: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
cb90: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
cba0: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
cbb0: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
cbc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
cbe0: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
cbf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
cc00: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
cc10: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
cc20: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
cc30: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
cc40: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
cc50: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
cc60: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41  IOTRACE */../* A
cc70: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
cc80: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
cc90: 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  bes bulk memory 
cca0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
ccb0: 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f  e.** by subcompo
ccc0: 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61  nents of a prepa
ccd0: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
cce0: 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  Space is allocat
ccf0: 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52  ed out.** of a R
cd00: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
cd10: 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63  ect by the alloc
cd20: 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
cd30: 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74  below..*/.struct
cd40: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b   ReusableSpace {
cd50: 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20  .  u8 *pSpace;  
cd60: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
cd70: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
cd80: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
cd90: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
cda0: 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  f available memo
cdb0: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65  ry */.  int nNee
cdc0: 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ded;         /* 
cdd0: 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74  Total bytes that
cde0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
cdf0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
ce00: 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74  * Try to allocat
ce10: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
ce20: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
ce30: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  bulk memory for 
ce40: 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  pBuf.** from the
ce50: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
ce60: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
ce70: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
ce80: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d  allocated.** mem
ce90: 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ory on success. 
cea0: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
ceb0: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
cec0: 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52  able in the.** R
ced0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
cee0: 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ect, increase th
cef0: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e  e ReusableSpace.
cf00: 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65  nNeeded.** value
cf10: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e   by the amount n
cf20: 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eeded and return
cf30: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
cf40: 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74  pBuf is not init
cf50: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74  ially NULL, that
cf60: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
cf70: 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61  memory has alrea
cf80: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
cf90: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
cfa0: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
cfb0: 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65  tine, so just re
cfc0: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
cfd0: 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65  f pBuf and leave
cfe0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75   ReusableSpace u
cff0: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
d000: 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69  This allocator i
d010: 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65  s employed to re
d020: 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73  purpose unused s
d030: 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20  lots at the end 
d040: 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  of the.** opcode
d050: 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72   array of prepar
d060: 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68  ed state for oth
d070: 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20  er memory needs 
d080: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a  of the prepared.
d090: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ** statement..*/
d0a0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
d0b0: 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75  locSpace(.  stru
d0c0: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
d0d0: 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65   *p,  /* Bulk me
d0e0: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
d0f0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
d100: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
d110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d120: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69  Pointer to a pri
d130: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
d140: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
d150: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d160: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
d170: 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  needed */.){.  a
d180: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
d190: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70  E_ALIGNMENT(p->p
d1a0: 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20  Space) );.  if( 
d1b0: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  pBuf==0 ){.    n
d1c0: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
d1d0: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
d1e0: 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20  yte <= p->nFree 
d1f0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  ){.      p->nFre
d200: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e -= nByte;.    
d210: 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70    pBuf = &p->pSp
d220: 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20  ace[p->nFree];. 
d230: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d240: 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42  p->nNeeded += nB
d250: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
d260: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
d270: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
d280: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
d290: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
d2a0: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
d2b0: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
d2c0: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
d2d0: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
d2e0: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
d2f0: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
d300: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
d310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
d320: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
d330: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
d340: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
d350: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
d360: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
d370: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
d380: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
d390: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
d3a0: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
d3b0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d3c0: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
d3d0: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
d3e0: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
d3f0: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
d400: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
d410: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d420: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
d430: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d440: 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  G.  for(i=0; i<p
d450: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
d460: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
d470: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
d480: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
d490: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
d4a0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d4b0: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
d4c0: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
d4d0: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
d4e0: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
d4f0: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
d500: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
d510: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
d520: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
d530: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
d540: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
d550: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
d560: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
d570: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
d580: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
d590: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
d5a0: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d5b0: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
d5c0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
d5d0: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
d5e0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
d5f0: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
d600: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
d610: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
d620: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
d630: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
d640: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
d650: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
d660: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
d670: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
d680: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
d690: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
d6a0: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
d6b0: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
d6c0: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
d6d0: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
d6e0: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
d6f0: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
d700: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
d710: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
d720: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d730: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
d740: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
d750: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
d760: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
d770: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
d780: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
d790: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
d7a0: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
d7b0: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
d7c0: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
d7d0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
d7e0: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
d7f0: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
d800: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
d810: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
d820: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
d830: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
d840: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
d850: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
d860: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
d870: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
d880: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
d890: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
d8a0: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
d8b0: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
d8c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
d8d0: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
d8e0: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
d8f0: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
d900: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d910: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
d920: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
d930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d940: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
d950: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
d960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d970: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
d980: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
d990: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
d9a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
d9b0: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
d9c0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
d9d0: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
d9e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d9f0: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
da00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
da10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
da30: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
da40: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
da50: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
da60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
da70: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
da80: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
da90: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
daa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dab0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
dac0: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
dad0: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
dae0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
daf0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
db00: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
db10: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
db20: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
db30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
db50: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
db60: 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20  eSpace x;       
db70: 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c   /* Reusable bul
db80: 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61  k memory */..  a
db90: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
dba0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
dbb0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dbc0: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
dbd0: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
dbe0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
dbf0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
dc00: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
dc10: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
dc20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
dc30: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
dc40: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
dc50: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
dc60: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
dc70: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
dc80: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
dc90: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
dca0: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
dcb0: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
dcc0: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
dcd0: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
dce0: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
dcf0: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
dd00: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
dd10: 20 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65   Each cursor use
dd20: 73 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  s a memory cell.
dd30: 20 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73    The first curs
dd40: 6f 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61  or (cursor 0) ca
dd50: 6e 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b  n.  ** use aMem[
dd60: 30 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20  0] which is not 
dd70: 6f 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62  otherwise used b
dd80: 79 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72  y the VDBE progr
dd90: 61 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20  am.  Allocate.  
dda0: 2a 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20  ** space at the 
ddb0: 65 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f  end of aMem[] fo
ddc0: 72 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20  r cursors 1 and 
ddd0: 67 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65  greater..  ** Se
dde0: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
ddf0: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
de00: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
de10: 3b 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d  ;.  if( nCursor=
de20: 3d 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e  =0 && nMem>0 ) n
de30: 4d 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65  Mem++;  /* Space
de40: 20 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65   for aMem[0] eve
de50: 6e 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f  n if not used */
de60: 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
de70: 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61  t how much reusa
de80: 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ble memory is av
de90: 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65  ailable at the e
dea0: 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f  nd of the.  ** o
deb0: 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68  pcode array.  Th
dec0: 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  is extra memory 
ded0: 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61  will be realloca
dee0: 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c  ted for other el
def0: 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74  ements.  ** of t
df00: 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
df10: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20  ement..  */.  n 
df20: 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  = ROUND8(sizeof(
df30: 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20  Op)*p->nOp);    
df40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
df50: 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d  es of opcode mem
df60: 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e  ory used */.  x.
df70: 70 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29  pSpace = &((u8*)
df80: 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20  p->aOp)[n];     
df90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
dfa0: 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72  sed opcode memor
dfb0: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45  y */.  assert( E
dfc0: 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
dfd0: 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b  ENT(x.pSpace) );
dfe0: 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55  .  x.nFree = ROU
dff0: 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e  NDDOWN8(pParse->
e000: 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20  szOpAlloc - n); 
e010: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75   /* Bytes of unu
e020: 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  sed memory */.  
e030: 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e  assert( x.nFree>
e040: 3d 30 20 29 3b 0a 20 20 69 66 28 20 78 2e 6e 46  =0 );.  if( x.nF
e050: 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d  ree>0 ){.    mem
e060: 73 65 74 28 78 2e 70 53 70 61 63 65 2c 20 30 2c  set(x.pSpace, 0,
e070: 20 78 2e 6e 46 72 65 65 29 3b 0a 20 20 20 20 61   x.nFree);.    a
e080: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
e090: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70  E_ALIGNMENT(&x.p
e0a0: 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20  Space[x.nFree]) 
e0b0: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f 6c 76  );.  }..  resolv
e0c0: 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41  eP2Values(p, &nA
e0d0: 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74  rg);.  p->usesSt
e0e0: 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29  mtJournal = (u8)
e0f0: 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69  (pParse->isMulti
e100: 57 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d  Write && pParse-
e110: 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66  >mayAbort);.  if
e120: 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  ( pParse->explai
e130: 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a  n && nMem<10 ){.
e140: 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20      nMem = 10;. 
e150: 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20   }.  p->expired 
e160: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72  = 0;..  /* Memor
e170: 79 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c  y for registers,
e180: 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72   parameters, cur
e190: 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c  sor, etc, is all
e1a0: 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72  ocated in one or
e1b0: 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73   two.  ** passes
e1c0: 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  .  On the first 
e1d0: 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20  pass, we try to 
e1e0: 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d  reuse unused mem
e1f0: 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ory at the .  **
e200: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
e210: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
e220: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
e230: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
e240: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
e250: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
e260: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
e270: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
e280: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
e290: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
e2a0: 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67   remainder using
e2b0: 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20   a fresh memory 
e2c0: 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20  allocation.  .  
e2d0: 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f  **.  ** This two
e2e0: 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74  -pass approach t
e2f0: 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75  hat reuses as mu
e300: 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73  ch memory as pos
e310: 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20  sible from.  ** 
e320: 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d  the leftover mem
e330: 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ory at the end o
e340: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
e350: 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69  ay.  This can si
e360: 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a  gnificantly.  **
e370: 20 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75   reduce the amou
e380: 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c  nt of memory hel
e390: 64 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20  d by a prepared 
e3a0: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a  statement..  */.
e3b0: 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65    do {.    x.nNe
e3c0: 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d  eded = 0;.    p-
e3d0: 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61  >aMem = allocSpa
e3e0: 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20  ce(&x, p->aMem, 
e3f0: 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nMem*sizeof(Mem)
e400: 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d  );.    p->aVar =
e410: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
e420: 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69  p->aVar, nVar*si
e430: 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20  zeof(Mem));.    
e440: 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63  p->apArg = alloc
e450: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41  Space(&x, p->apA
e460: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
e470: 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61  Mem*));.    p->a
e480: 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pCsr = allocSpac
e490: 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20  e(&x, p->apCsr, 
e4a0: 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56  nCursor*sizeof(V
e4b0: 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 20 20  dbeCursor*));.  
e4c0: 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    p->aOnceFlag =
e4d0: 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20   allocSpace(&x, 
e4e0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f  p->aOnceFlag, nO
e4f0: 6e 63 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  nce);.#ifdef SQL
e500: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
e510: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70  SCANSTATUS.    p
e520: 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63  ->anExec = alloc
e530: 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45  Space(&x, p->anE
e540: 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65  xec, p->nOp*size
e550: 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66  of(i64));.#endif
e560: 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64  .    if( x.nNeed
e570: 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ed==0 ) break;. 
e580: 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d     x.pSpace = p-
e590: 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33  >pFree = sqlite3
e5a0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
e5b0: 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20   x.nNeeded);.   
e5c0: 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65   x.nFree = x.nNe
e5d0: 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20  eded;.  }while( 
e5e0: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
e5f0: 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73  d );..  p->nCurs
e600: 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20  or = nCursor;.  
e610: 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e  p->nOnceFlag = n
e620: 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61  Once;.  if( p->a
e630: 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56  Var ){.    p->nV
e640: 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72  ar = (ynVar)nVar
e650: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e  ;.    for(n=0; n
e660: 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20  <nVar; n++){.   
e670: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c     p->aVar[n].fl
e680: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
e690: 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d        p->aVar[n]
e6a0: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
e6b0: 20 20 7d 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d    }.  p->nzVar =
e6c0: 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a   pParse->nzVar;.
e6d0: 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61    p->azVar = pPa
e6e0: 72 73 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50  rse->azVar;.  pP
e6f0: 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30  arse->nzVar =  0
e700: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  ;.  pParse->azVa
e710: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  r = 0;.  if( p->
e720: 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  aMem ){.    p->n
e730: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20  Mem = nMem;.    
e740: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 4d 65 6d 3b  for(n=0; n<nMem;
e750: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
e760: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
e770: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
e780: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
e790: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
e7a0: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
e7b0: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
e7c0: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
e7d0: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
e7e0: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
e7f0: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
e800: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
e810: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
e820: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
e830: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
e840: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
e850: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
e860: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
e870: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
e880: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e890: 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
e8a0: 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43  Bt==0 || pCx->eC
e8b0: 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
e8c0: 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63  BTREE );.  switc
e8d0: 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  h( pCx->eCurType
e8e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52   ){.    case CUR
e8f0: 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20  TYPE_SORTER: {. 
e900: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e910: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
e920: 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62  b, pCx);.      b
e930: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
e940: 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52  case CURTYPE_BTR
e950: 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EE: {.      if( 
e960: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
e970: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e980: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
e990: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
e9a0: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
e9b0: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
e9c0: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
e9d0: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20  exists, by.     
e9e0: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
e9f0: 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  bove. */.      }
ea00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
ea10: 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43  sert( pCx->uc.pC
ea20: 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
ea30: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ea40: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
ea50: 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
ea60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ea70: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
ea80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ea90: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
eaa0: 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a  se CURTYPE_VTAB:
eab0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
eac0: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
ead0: 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56  Cur = pCx->uc.pV
eae0: 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Cur;.      const
eaf0: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
eb00: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72  *pModule = pVCur
eb10: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
eb20: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
eb30: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
eb40: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56  ef>0 );.      pV
eb50: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
eb60: 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c  --;.      pModul
eb70: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
eb80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eb90: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
eba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ebb0: 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ll cursors in th
ebc0: 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
ebd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ebe0: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
ebf0: 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ame(Vdbe *p){.  
ec00: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
ec10: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
ec20: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
ec30: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
ec40: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
ec50: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
ec60: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
ec70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ec80: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
ec90: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
eca0: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
ecb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ecc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
ecd0: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
ece0: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
ecf0: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
ed00: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
ed10: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
ed20: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
ed30: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
ed40: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
ed50: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
ed60: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
ed70: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
ed80: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
ed90: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
eda0: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
edb0: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
edc0: 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
edd0: 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65  nFrame(v);.#ifde
ede0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
edf0: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
ee00: 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46    v->anExec = pF
ee10: 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65  rame->anExec;.#e
ee20: 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46  ndif.  v->aOnceF
ee30: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  lag = pFrame->aO
ee40: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f  nceFlag;.  v->nO
ee50: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
ee60: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->nOnceFlag;.  v
ee70: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
ee80: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
ee90: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
eea0: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
eeb0: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
eec0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
eed0: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
eee0: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
eef0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
ef00: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
ef10: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
ef20: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
ef30: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
ef40: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
ef50: 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43  nge;.  v->db->nC
ef60: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
ef70: 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c  nDbChange;.  sql
ef80: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
ef90: 78 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d  xData(v->db, &v-
efa0: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
efb0: 29 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61  );.  v->pAuxData
efc0: 20 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44   = pFrame->pAuxD
efd0: 61 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70  ata;.  pFrame->p
efe0: 41 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72  AuxData = 0;.  r
eff0: 65 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63  eturn pFrame->pc
f000: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
f010: 20 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a   all cursors..**
f020: 0a 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65  .** Also release
f030: 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d   any dynamic mem
f040: 6f 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20  ory held by the 
f050: 56 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61  VM in the Vdbe.a
f060: 4d 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63  Mem memory .** c
f070: 65 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20  ell array. This 
f080: 69 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20  is necessary as 
f090: 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  the memory cell 
f0a0: 61 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69  array may contai
f0b0: 6e 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f  n.** pointers to
f0c0: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
f0d0: 74 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e  ts, which may in
f0e0: 20 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f   turn contain po
f0f0: 69 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65  inters to.** ope
f100: 6e 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74  n cursors..*/.st
f110: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41  atic void closeA
f120: 6c 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a  llCursors(Vdbe *
f130: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72  p){.  if( p->pFr
f140: 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46  ame ){.    VdbeF
f150: 72 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20  rame *pFrame;.  
f160: 20 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e    for(pFrame=p->
f170: 70 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e  pFrame; pFrame->
f180: 70 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d  pParent; pFrame=
f190: 70 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29  pFrame->pParent)
f1a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f1b0: 65 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46  eFrameRestore(pF
f1c0: 72 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46  rame);.    p->pF
f1d0: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d  rame = 0;.    p-
f1e0: 3e 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d  >nFrame = 0;.  }
f1f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46  .  assert( p->nF
f200: 72 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f  rame==0 );.  clo
f210: 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65  seCursorsInFrame
f220: 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  (p);.  if( p->aM
f230: 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  em ){.    releas
f240: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65  eMemArray(p->aMe
f250: 6d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  m, p->nMem);.  }
f260: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
f270: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
f280: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
f290: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
f2a0: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
f2b0: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
f2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f2d0: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
f2e0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
f2f0: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
f300: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
f310: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
f320: 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
f330: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f340: 74 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c  teAuxData(p->db,
f350: 20 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d   &p->pAuxData, -
f360: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
f370: 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
f380: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
f390: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
f3a0: 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a  r a single run..
f3b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
f3c0: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b  leanup(Vdbe *p){
f3d0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f3e0: 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20   p->db;..#ifdef 
f3f0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
f400: 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
f410: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
f420: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
f430: 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
f440: 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
f450: 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
f460: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
f470: 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
f480: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
f490: 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
f4a0: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
f4b0: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
f4c0: 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
f4d0: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
f4e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
f4f0: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
f500: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
f510: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
f520: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
f530: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
f540: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
f550: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
f560: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
f570: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
f580: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
f590: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
f5a0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
f5b0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f5c0: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
f5d0: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
f5e0: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
f5f0: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
f600: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
f610: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
f620: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
f630: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f640: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
f650: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
f660: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
f670: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
f680: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
f690: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
f6a0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
f6b0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
f6c0: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
f6d0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
f6e0: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
f6f0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
f700: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
f710: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
f720: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
f730: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
f740: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
f750: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f760: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
f770: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
f780: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
f790: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
f7a0: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
f7b0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f7c0: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
f7d0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
f7e0: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
f7f0: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
f800: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
f810: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
f820: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
f830: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
f840: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
f850: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
f860: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f870: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
f880: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
f890: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
f8a0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
f8b0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
f8c0: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
f8d0: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
f8e0: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
f8f0: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
f900: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
f910: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
f920: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
f930: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
f940: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
f950: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
f960: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
f970: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
f980: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
f990: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
f9a0: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
f9b0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
f9c0: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
f9d0: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
f9e0: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
f9f0: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
fa00: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fa10: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fa20: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
fa50: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
fa60: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
fa90: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
faa0: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
fab0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
fac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fad0: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
fae0: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
faf0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fb00: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
fb10: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
fb20: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
fb30: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
fb40: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
fb50: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
fb60: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
fb70: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
fb80: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
fb90: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
fba0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
fbb0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
fbc0: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
fbd0: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
fbe0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
fbf0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
fc00: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
fc10: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
fc20: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
fc30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fc40: 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
fc50: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f    assert( p->aCo
fc60: 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43  lName!=0 );.  pC
fc70: 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43  olName = &(p->aC
fc80: 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70  olName[idx+var*p
fc90: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a  ->nResColumn]);.
fca0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
fcb0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c  beMemSetStr(pCol
fcc0: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  Name, zName, -1,
fcd0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44   SQLITE_UTF8, xD
fce0: 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  el);.  assert( r
fcf0: 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c  c!=0 || !zName |
fd00: 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61  | (pColName->fla
fd10: 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20  gs&MEM_Term)!=0 
fd20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
fd30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20  }../*.** A read 
fd40: 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
fd50: 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20  tion may or may 
fd60: 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e  not be active on
fd70: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
fd80: 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61  .** db. If a tra
fd90: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
fda0: 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49  ve, commit it. I
fdb0: 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20  f there is a.** 
fdc0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
fdd0: 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20  n spanning more 
fde0: 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
fdf0: 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75  e file, this rou
fe00: 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61  tine.** takes ca
fe10: 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  re of the master
fe20: 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72   journal tricker
fe30: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
fe40: 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69   vdbeCommit(sqli
fe50: 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
fe60: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
fe70: 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f  t nTrans = 0;  /
fe80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61  * Number of data
fe90: 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63  bases with an ac
fea0: 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73  tive write-trans
feb0: 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20  action.         
fec0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61            ** tha
fed0: 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73  t are candidates
fee0: 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65   for a two-phase
fef0: 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a   commit using a.
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
ff20: 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63  rnal */.  int rc
ff30: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
ff40: 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  int needXcommit 
ff50: 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  = 0;..#ifdef SQL
ff60: 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
ff70: 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20  TABLE.  /* With 
ff80: 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c  this option, sql
ff90: 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69  ite3VtabSync() i
ffa0: 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20  s defined to be 
ffb0: 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c  simply .  ** SQL
ffc0: 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e  ITE_OK so p is n
ffd0: 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20  ot used. .  */. 
ffe0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fff0: 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  R(p);.#endif..  
10000 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20  /* Before doing 
10010 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63  anything else, c
10020 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20  all the xSync() 
10030 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79  callback for any
10040 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f  .  ** virtual mo
10050 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74  dule tables writ
10060 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e  ten in this tran
10070 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61  saction. This ha
10080 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e  s to.  ** be don
10090 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69  e before determi
100a0 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d  ning whether a m
100b0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
100c0 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75  le is .  ** requ
100d0 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e  ired, as an xSyn
100e0 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79  c() callback may
100f0 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64   add an attached
10100 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74   database.  ** t
10110 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
10120 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
10130 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64  qlite3VtabSync(d
10140 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69  b, p);..  /* Thi
10150 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65  s loop determine
10160 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d  s (a) if the com
10170 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20  mit hook should 
10180 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20  be invoked and. 
10190 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79   ** (b) how many
101a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
101b0 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20  have open write 
101c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f  transactions, no
101d0 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e  t .  ** includin
101e0 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62  g the temp datab
101f0 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f  ase. (b) is impo
10200 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66  rtant because if
10210 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a   more than .  **
10220 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
10230 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77  le has an open w
10240 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
10250 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  , a master journ
10260 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20  al.  ** file is 
10270 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20  required for an 
10280 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20  atomic commit.. 
10290 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20   */ .  for(i=0; 
102a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
102b0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
102c0 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42  { .    Btree *pB
102d0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
102e0 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  Bt;.    if( sqli
102f0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
10300 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  s(pBt) ){.      
10310 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f  /* Whether or no
10320 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67  t a database mig
10330 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72  ht need a master
10340 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73   journal depends
10350 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69   upon.      ** i
10360 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20  ts journal mode 
10370 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69  (among other thi
10380 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72  ngs).  This matr
10390 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68  ix determines wh
103a0 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  ich.      ** jou
103b0 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61  rnal modes use a
103c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
103d0 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74  and which do not
103e0 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63   */.      static
103f0 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65   const u8 aMJNee
10400 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ded[] = {.      
10410 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f    /* DELETE   */
10420 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20    1,.        /* 
10430 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a  PERSIST   */ 1,.
10440 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20          /* OFF  
10450 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20       */ 0,.     
10460 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20     /* TRUNCATE  
10470 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 1,.        /*
10480 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c   MEMORY    */ 0,
10490 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20  .        /* WAL 
104a0 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20        */ 0.     
104b0 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20   };.      Pager 
104c0 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61  *pPager;   /* Pa
104d0 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
104e0 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20  ith pBt */.     
104f0 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
10500 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10510 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a  treeEnter(pBt);.
10520 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73        pPager = s
10530 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
10540 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28  (pBt);.      if(
10550 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65   db->aDb[i].safe
10560 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f  ty_level!=PAGER_
10570 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a  SYNCHRONOUS_OFF.
10580 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65         && aMJNee
10590 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72  ded[sqlite3Pager
105a0 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70  GetJournalMode(p
105b0 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29 7b  Pager)].      ){
105c0 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74   .        assert
105d0 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20  ( i!=1 );.      
105e0 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20    nTrans++;.    
105f0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
10600 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75  qlite3PagerExclu
10610 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29  siveLock(pPager)
10620 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
10630 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a  treeLeave(pBt);.
10640 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
10650 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10660 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
10670 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
10680 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65  re are any write
10690 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74  -transactions at
106a0 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65   all, invoke the
106b0 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a   commit hook */.
106c0 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69    if( needXcommi
106d0 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  t && db->xCommit
106e0 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20  Callback ){.    
106f0 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  rc = db->xCommit
10700 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f  Callback(db->pCo
10710 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66  mmitArg);.    if
10720 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
10730 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53  turn SQLITE_CONS
10740 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
10750 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  K;.    }.  }..  
10760 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61  /* The simple ca
10770 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61  se - no more tha
10780 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
10790 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e  ile (not countin
107a0 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20  g the.  ** TEMP 
107b0 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20  database) has a 
107c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69  transaction acti
107d0 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e  ve.   There is n
107e0 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20  o need for the. 
107f0 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
10800 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  al..  **.  ** If
10810 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
10820 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  e of sqlite3Btre
10830 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69  eGetFilename() i
10840 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a  s a zero length.
10850 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20    ** string, it 
10860 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64  means the main d
10870 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f  atabase is :memo
10880 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69  ry: or a temp fi
10890 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68  le.  In .  ** th
108a0 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f  at case we do no
108b0 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63  t support atomic
108c0 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d   multi-file comm
108d0 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20  its, so use the 
108e0 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73  .  ** simple cas
108f0 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f  e then too..  */
10900 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65  .  if( 0==sqlite
10910 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65  3Strlen30(sqlite
10920 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10930 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74  e(db->aDb[0].pBt
10940 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c  )).   || nTrans<
10950 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28  =1.  ){.    for(
10960 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10970 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10980 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
10990 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
109a0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
109b0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
109c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
109d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
109e0 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  ne(pBt, 0);.    
109f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
10a00 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20  * Do the commit 
10a10 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61  only if all data
10a20 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c  bases successful
10a30 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73  ly complete phas
10a40 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20  e 1. .    ** If 
10a50 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65  one of the Btree
10a60 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
10a70 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68   calls fails, th
10a80 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a  is indicates an.
10a90 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20      ** IO error 
10aa0 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f  while deleting o
10ab0 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  r truncating a j
10ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
10ad0 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20  is unlikely,.   
10ae0 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61   ** but could ha
10af0 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61  ppen. In this ca
10b00 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65  se abandon proce
10b10 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e  ssing and return
10b20 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20   the error..    
10b30 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
10b40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10b50 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10b60 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
10b70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10b80 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
10b90 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
10ba0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
10bb0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
10bc0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
10bd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
10be0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10bf0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
10c00 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d  ommit(db);.    }
10c10 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63  .  }..  /* The c
10c20 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68  omplex case - Th
10c30 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66  ere is a multi-f
10c40 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ile write-transa
10c50 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20  ction active..  
10c60 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73  ** This requires
10c70 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10c80 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65  l file to ensure
10c90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10ca0 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74   is.  ** committ
10cb0 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  ed atomically.. 
10cc0 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
10cd0 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20  TE_OMIT_DISKIO. 
10ce0 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74   else{.    sqlit
10cf0 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64  e3_vfs *pVfs = d
10d00 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61  b->pVfs;.    cha
10d10 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20  r *zMaster = 0; 
10d20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66    /* File-name f
10d30 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  or the master jo
10d40 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61  urnal */.    cha
10d50 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69  r const *zMainFi
10d60 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
10d70 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
10d80 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
10d90 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
10da0 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  pMaster = 0;.   
10db0 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b   i64 offset = 0;
10dc0 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  .    int res;.  
10dd0 20 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74    int retryCount
10de0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d   = 0;.    int nM
10df0 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a  ainFile;..    /*
10e00 20 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72   Select a master
10e10 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
10e20 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46  me */.    nMainF
10e30 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ile = sqlite3Str
10e40 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29  len30(zMainFile)
10e50 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
10e60 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
10e70 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39  b, "%s-mjXXXXXX9
10e80 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29  XXz", zMainFile)
10e90 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65  ;.    if( zMaste
10ea0 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
10eb0 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
10ec0 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20  .    do {.      
10ed0 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20  u32 iRandom;.   
10ee0 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
10ef0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
10f00 20 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20   retryCount>100 
10f10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
10f20 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
10f30 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65  FULL, "MJ delete
10f40 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
10f50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
10f60 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
10f70 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
10f80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10f90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
10fa0 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29   retryCount==1 )
10fb0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
10fc0 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
10fd0 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65  ULL, "MJ collide
10fe0 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b  : %s", zMaster);
10ff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11000 20 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f   }.      retryCo
11010 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c  unt++;.      sql
11020 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
11030 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c  sizeof(iRandom),
11040 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20   &iRandom);.    
11050 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
11060 74 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b  tf(13, &zMaster[
11070 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a  nMainFile], "-mj
11080 25 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20  %06X9%02X",.    
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110a0 20 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e             (iRan
110b0 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66  dom>>8)&0xffffff
110c0 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b  , iRandom&0xff);
110d0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e  .      /* The an
110e0 74 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68  tipenultimate ch
110f0 61 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d  aracter of the m
11100 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
11110 6d 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a  me must.      **
11120 20 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64   be "9" to avoid
11130 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73   name collisions
11140 20 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20   when using 8+3 
11150 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20  filenames. */.  
11160 20 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73      assert( zMas
11170 74 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65  ter[sqlite3Strle
11180 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d  n30(zMaster)-3]=
11190 3d 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71  ='9' );.      sq
111a0 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
111b0 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73  (zMainFile, zMas
111c0 74 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ter);.      rc =
111d0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
111e0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
111f0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
11200 49 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20  ISTS, &res);.   
11210 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
11220 49 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b  ITE_OK && res );
11230 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
11240 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11250 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
11260 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  er journal. */. 
11270 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11280 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56  3OsOpenMalloc(pV
11290 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d  fs, zMaster, &pM
112a0 61 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20  aster, .        
112b0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
112c0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
112d0 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20  PEN_CREATE|.    
112e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
112f0 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49  N_EXCLUSIVE|SQLI
11300 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
11310 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20  OURNAL, 0.      
11320 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
11330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11340 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11350 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11360 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11370 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20   rc;.    }. .   
11380 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61   /* Write the na
11390 6d 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62  me of each datab
113a0 61 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20  ase file in the 
113b0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f  transaction into
113c0 20 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20   the new.    ** 
113d0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
113e0 69 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ile. If an error
113f0 20 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20   occurs at this 
11400 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20  point close.    
11410 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ** and delete th
11420 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11430 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69   file. All the i
11440 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61  ndividual journa
11450 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73  l files.    ** s
11460 74 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27  till have 'null'
11470 20 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a   as the master j
11480 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20  ournal pointer, 
11490 73 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c  so they will rol
114a0 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e  l.    ** back in
114b0 64 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61  dependently if a
114c0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e   failure occurs.
114d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
114e0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
114f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
11500 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11510 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11520 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
11530 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
11540 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
11550 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c  nst *zFile = sql
11560 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
11570 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20  nalname(pBt);.  
11580 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d        if( zFile=
11590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
115a0 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67  continue;  /* Ig
115b0 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d  nore TEMP and :m
115c0 65 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73  emory: databases
115d0 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   */.        }.  
115e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46        assert( zF
115f0 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20  ile[0]!=0 );.   
11600 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11610 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
11620 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
11630 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
11640 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
11650 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
11660 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11670 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
11680 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11690 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
116a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
116b0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
116c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
116d0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
116e0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
116f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11700 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11710 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11720 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11730 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11740 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
11750 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11760 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
11770 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
11780 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
11790 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
117a0 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
117b0 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c  .    if( 0==(sql
117c0 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
117d0 61 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73  acteristics(pMas
117e0 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41  ter)&SQLITE_IOCA
117f0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20  P_SEQUENTIAL).  
11800 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21     && SQLITE_OK!
11810 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73  =(rc = sqlite3Os
11820 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51  Sync(pMaster, SQ
11830 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c  LITE_SYNC_NORMAL
11840 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
11850 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
11860 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11870 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
11880 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
11890 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
118a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
118b0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
118c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
118d0 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20      /* Sync all 
118e0 74 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76  the db files inv
118f0 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61  olved in the tra
11900 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61  nsaction. The sa
11910 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73  me call.    ** s
11920 65 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ets the master j
11930 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69  ournal pointer i
11940 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61  n each individua
11950 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  l journal. If.  
11960 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
11970 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f  curs here, do no
11980 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11990 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
119a0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
119b0 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63  If the error occ
119c0 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66  urs during the f
119d0 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  irst call to.   
119e0 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65   ** sqlite3Btree
119f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
11a00 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  , then there is 
11a10 61 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  a chance that th
11a20 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20  e.    ** master 
11a30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c  journal file wil
11a40 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42  l be orphaned. B
11a50 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c  ut we cannot del
11a60 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69  ete it,.    ** i
11a70 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65  n case the maste
11a80 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
11a90 61 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20  ame was written 
11aa0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
11ab0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66  .    ** file bef
11ac0 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20  ore the failure 
11ad0 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f  occurred..    */
11ae0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11af0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11b00 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
11b10 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
11b20 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
11b30 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
11b40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
11b50 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
11b60 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
11b70 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
11b90 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
11ba0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
11bb0 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
11bc0 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66  E_BUSY );.    if
11bd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11be0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
11bf0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
11c00 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
11c10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
11c20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d   /* Delete the m
11c30 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11c40 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73  le. This commits
11c50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
11c60 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64  . After.    ** d
11c70 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69  oing this the di
11c80 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65  rectory is synce
11c90 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61  d again before a
11ca0 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20  ny individual.  
11cb0 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
11cc0 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74   files are delet
11cd0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ed..    */.    r
11ce0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
11cf0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11d00 72 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  r, 1);.    sqlit
11d10 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11d20 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74  ster);.    zMast
11d30 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  er = 0;.    if( 
11d40 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
11d50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
11d60 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61    /* All files a
11d70 6e 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68  nd directories h
11d80 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
11d90 20 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20   synced, so the 
11da0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a  following.    **
11db0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
11dc0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
11dd0 65 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20  eTwo() are only 
11de0 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e  closing files an
11df0 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e  d.    ** deletin
11e00 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
11e10 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d  journals. If som
11e20 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
11e30 67 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74  g while.    ** t
11e40 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67  his is happening
11e50 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
11e60 20 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67   care. The integ
11e70 72 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  rity of the.    
11e80 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
11e90 73 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e  s already guaran
11ea0 74 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73  teed, but some s
11eb0 74 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72  tray 'cold' jour
11ec0 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20  nals.    ** may 
11ed0 62 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e  be lying around.
11ee0 20 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72   Returning an er
11ef0 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68  ror code won't h
11f00 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20  elp matters..   
11f10 20 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   */.    disable_
11f20 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11f30 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
11f40 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
11f50 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69  loc();.    for(i
11f60 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
11f70 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
11f80 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
11f90 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
11fa0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
11fb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f    sqlite3BtreeCo
11fc0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
11fd0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
11fe0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
11ff0 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
12000 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d  ;.    enable_sim
12010 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
12020 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ();..    sqlite3
12030 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
12040 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
12050 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a  turn rc;.}../* .
12060 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
12070 63 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20  checks that the 
12080 73 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74  sqlite3.nVdbeAct
12090 69 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62  ive count variab
120a0 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68  le.** matches th
120b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65  e number of vdbe
120c0 27 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73  's in the list s
120d0 71 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61  qlite3.pVdbe tha
120e0 74 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74  t are.** current
120f0 6c 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73  ly active. An as
12100 73 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66  sertion fails if
12110 20 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20   the two counts 
12120 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  do not match..**
12130 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65   This is an inte
12140 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20  rnal self-check 
12150 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74  only - it is not
12160 20 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72   an essential pr
12170 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70  ocessing.** step
12180 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
12190 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55  a no-op if NDEBU
121a0 47 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f  G is defined..*/
121b0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
121c0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
121d0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73  kActiveVdbeCnt(s
121e0 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56  qlite3 *db){.  V
121f0 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e  dbe *p;.  int cn
12200 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72  t = 0;.  int nWr
12210 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  ite = 0;.  int n
12220 52 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20  Read = 0;.  p = 
12230 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69  db->pVdbe;.  whi
12240 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  le( p ){.    if(
12250 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75   sqlite3_stmt_bu
12260 73 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  sy((sqlite3_stmt
12270 2a 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e  *)p) ){.      cn
12280 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t++;.      if( p
12290 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20  ->readOnly==0 ) 
122a0 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20  nWrite++;.      
122b0 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
122c0 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20   ) nRead++;.    
122d0 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  }.    p = p->pNe
122e0 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  xt;.  }.  assert
122f0 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65  ( cnt==db->nVdbe
12300 41 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65  Active );.  asse
12310 72 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e  rt( nWrite==db->
12320 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20  nVdbeWrite );.  
12330 61 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64  assert( nRead==d
12340 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a  b->nVdbeRead );.
12350 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12360 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
12370 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  nt(x).#endif../*
12380 0a 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20  .** If the Vdbe 
12390 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
123a0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65  rst argument ope
123b0 6e 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d  ned a statement-
123c0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
123d0 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72  close it now. Ar
123e0 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20  gument eOp must 
123f0 62 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f  be either SAVEPO
12400 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a  INT_ROLLBACK or.
12410 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  ** SAVEPOINT_REL
12420 45 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53  EASE. If it is S
12430 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12440 4b 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74  K, then the stat
12450 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
12460 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
12470 61 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53  ack. If eOp is S
12480 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12490 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73  , then the .** s
124a0 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
124b0 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
124c0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
124d0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
124e0 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  an SQLITE_IOERR_
124f0 58 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69  XXX error code i
12500 73 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20  s returned. .** 
12510 4f 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45  Otherwise SQLITE
12520 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
12530 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
12540 65 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69  ement(Vdbe *p, i
12550 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74  nt eOp){.  sqlit
12560 65 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70  e3 *const db = p
12570 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ->db;.  int rc =
12580 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
12590 2a 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65  * If p->iStateme
125a0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
125b0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
125c0 69 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61  is Vdbe opened a
125d0 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74   .  ** statement
125e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61   transaction tha
125f0 74 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73  t should be clos
12600 65 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c  ed here. The onl
12610 79 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a  y exception.  **
12620 20 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65   is that an IO e
12630 72 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63  rror may have oc
12640 63 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20  curred, causing 
12650 61 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c  an emergency rol
12660 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74  lback..  ** In t
12670 68 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53  his case (db->nS
12680 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e  tatement==0), an
12690 64 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  d there is nothi
126a0 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20  ng to do..  */. 
126b0 20 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d   if( db->nStatem
126c0 65 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65  ent && p->iState
126d0 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  ment ){.    int 
126e0 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  i;.    const int
126f0 20 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d   iSavepoint = p-
12700 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a  >iStatement-1;..
12710 20 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d      assert( eOp=
12720 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12730 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45  ACK || eOp==SAVE
12740 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a  POINT_RELEASE);.
12750 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
12760 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a  nStatement>0 );.
12770 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
12780 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e  Statement==(db->
12790 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e  nStatement+db->n
127a0 53 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20  Savepoint) );.. 
127b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
127c0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
127d0 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51      int rc2 = SQ
127e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42  LITE_OK;.      B
127f0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
12800 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
12810 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
12820 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41       if( eOp==SA
12830 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12840 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12850 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
12860 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
12870 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12880 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
12890 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
128a0 20 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54    if( rc2==SQLIT
128b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
128c0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42    rc2 = sqlite3B
128d0 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42  treeSavepoint(pB
128e0 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  t, SAVEPOINT_REL
128f0 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74  EASE, iSavepoint
12900 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12910 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12920 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12930 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20      rc = rc2;.  
12940 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12950 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53      }.    db->nS
12960 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20  tatement--;.    
12970 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
12980 30 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0;..    if( rc==
12990 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
129a0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
129b0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
129c0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
129d0 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f  qlite3VtabSavepo
129e0 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e  int(db, SAVEPOIN
129f0 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
12a00 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
12a10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
12a20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12a30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12a40 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
12a50 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
12a60 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
12a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12a80 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73  .    /* If the s
12a90 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12aa0 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f  tion is being ro
12ab0 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20  lled back, also 
12ac0 72 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20  restore the .   
12ad0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e   ** database han
12ae0 64 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f  dles deferred co
12af0 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72  nstraint counter
12b00 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74   to the value it
12b10 20 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a   had when .    *
12b20 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
12b30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
12b40 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20  opened.  */.    
12b50 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
12b60 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
12b70 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
12b80 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d  edCons = p->nStm
12b90 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20  tDefCons;.      
12ba0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
12bb0 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
12bc0 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d  efImmCons;.    }
12bd0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
12be0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12bf0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
12c00 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
12c10 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20  ction opened by 
12c20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
12c30 20 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74   handle associat
12c40 65 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70  ed with the VM p
12c50 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75  assed as an argu
12c60 6d 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f  ment is about to
12c70 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65   be .** committe
12c80 64 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20  d. If there are 
12c90 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65  outstanding defe
12ca0 72 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79  rred foreign key
12cb0 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76   constraint.** v
12cc0 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72  iolations, retur
12cd0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20  n SQLITE_ERROR. 
12ce0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
12cf0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  E_OK..**.** If t
12d00 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
12d10 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f  ding FK violatio
12d20 6e 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ns and this func
12d30 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a  tion returns .**
12d40 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73   SQLITE_ERROR, s
12d50 65 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  et the result of
12d60 20 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54   the VM to SQLIT
12d70 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
12d80 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77  EIGNKEY.** and w
12d90 72 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  rite an error me
12da0 73 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65  ssage to it. The
12db0 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
12dc0 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ERROR..*/.#ifnde
12dd0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
12de0 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71  REIGN_KEY.int sq
12df0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
12e00 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65  (Vdbe *p, int de
12e10 66 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74  ferred){.  sqlit
12e20 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
12e30 20 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20    if( (deferred 
12e40 26 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65  && (db->nDeferre
12e50 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72  dCons+db->nDefer
12e60 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a  redImmCons)>0) .
12e70 20 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64     || (!deferred
12e80 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72   && p->nFkConstr
12e90 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20  aint>0) .  ){.  
12ea0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12eb0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
12ec0 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65  IGNKEY;.    p->e
12ed0 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
12ee0 41 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74  Abort;.    sqlit
12ef0 65 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22  e3VdbeError(p, "
12f00 46 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73  FOREIGN KEY cons
12f10 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b  traint failed");
12f20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12f30 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
12f40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12f50 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
12f60 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12f70 73 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65  s called the whe
12f80 6e 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74  n a VDBE tries t
12f90 6f 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20  o halt.  If the 
12fa0 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65  VDBE.** has made
12fb0 20 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20   changes and is 
12fc0 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f  in autocommit mo
12fd0 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20  de, then commit 
12fe0 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73  those.** changes
12ff0 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b  .  If a rollback
13000 20 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e   is needed, then
13010 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   do the rollback
13020 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13030 74 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79  tine is the only
13040 20 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65   way to move the
13050 20 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66   state of a VM f
13060 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41  rom.** SQLITE_MA
13070 47 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54  GIC_RUN to SQLIT
13080 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49  E_MAGIC_HALT.  I
13090 74 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f  t is harmless to
130a0 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e  .** call this on
130b0 20 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e   a VM that is in
130c0 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49   the SQLITE_MAGI
130d0 43 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a  C_HALT state..**
130e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72  .** Return an er
130f0 72 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68  ror code.  If th
13100 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e  e commit could n
13110 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61  ot complete beca
13120 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63  use of.** lock c
13130 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72  ontention, retur
13140 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  n SQLITE_BUSY.  
13150 49 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  If SQLITE_BUSY i
13160 73 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a  s returned, it.*
13170 2a 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73  * means the clos
13180 65 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e  e did not happen
13190 20 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65   and needs to be
131a0 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e   repeated..*/.in
131b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c  t sqlite3VdbeHal
131c0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e  t(Vdbe *p){.  in
131d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
131e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
131f0 20 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74   Used to store t
13200 72 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20  ransient return 
13210 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  codes */.  sqlit
13220 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
13230 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
13240 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ion contains the
13250 20 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65   logic that dete
13260 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74  rmines if a stat
13270 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72  ement or.  ** tr
13280 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62  ansaction will b
13290 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
132a0 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
132b0 72 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20  result of the.  
132c0 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  ** execution of 
132d0 74 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63  this virtual mac
132e0 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  hine. .  **.  **
132f0 20 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66   If any of the f
13300 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20  ollowing errors 
13310 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  occur:.  **.  **
13320 20 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45       SQLITE_NOME
13330 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  M.  **     SQLIT
13340 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20  E_IOERR.  **    
13350 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a   SQLITE_FULL.  *
13360 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54  *     SQLITE_INT
13370 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a  ERRUPT.  **.  **
13380 20 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e   Then the intern
13390 61 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68  al cache might h
133a0 61 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e  ave been left in
133b0 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74   an inconsistent
133c0 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65  .  ** state.  We
133d0 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63   need to rollbac
133e0 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
133f0 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20  transaction, if 
13400 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e  there is.  ** on
13410 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65  e, or the comple
13420 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te transaction i
13430 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74  f there is no st
13440 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
13450 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28  ion..  */..  if(
13460 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13470 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
13480 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
13490 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  PT;.  }.  if( p-
134a0 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d  >aOnceFlag ) mem
134b0 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
134c0 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
134d0 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75  g);.  closeAllCu
134e0 72 73 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20  rsors(p);.  if( 
134f0 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d  p->magic!=VDBE_M
13500 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20  AGIC_RUN ){.    
13510 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13520 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74  ;.  }.  checkAct
13530 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
13540 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20  .  /* No commit 
13550 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
13560 65 64 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ed if the progra
13570 6d 20 6e 65 76 65 72 20 73 74 61 72 74 65 64 20  m never started 
13580 6f 72 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53  or if the.  ** S
13590 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65  QL statement doe
135a0 73 20 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72  s not read or wr
135b0 69 74 65 20 61 20 64 61 74 61 62 61 73 65 20 66  ite a database f
135c0 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70  ile.  */.  if( p
135d0 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49  ->pc>=0 && p->bI
135e0 73 52 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69  sReader ){.    i
135f0 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69  nt mrc;   /* Pri
13600 6d 61 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20  mary error code 
13610 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20  from p->rc */.  
13620 20 20 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74    int eStatement
13630 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  Op = 0;.    int 
13640 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20  isSpecialError; 
13650 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
13660 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 20 27  t to true if a '
13670 73 70 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a  special' error *
13680 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61  /..    /* Lock a
13690 6c 6c 20 62 74 72 65 65 73 20 75 73 65 64 20 62  ll btrees used b
136a0 79 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  y the statement 
136b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
136c0 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20  beEnter(p);..   
136d0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e   /* Check for on
136e0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
136f0 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d   errors */.    m
13700 72 63 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66  rc = p->rc & 0xf
13710 66 3b 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c  f;.    isSpecial
13720 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c  Error = mrc==SQL
13730 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63  ITE_NOMEM || mrc
13740 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20  ==SQLITE_IOERR. 
13750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13760 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49      || mrc==SQLI
13770 54 45 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20  TE_INTERRUPT || 
13780 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  mrc==SQLITE_FULL
13790 3b 0a 20 20 20 20 69 66 28 20 69 73 53 70 65 63  ;.    if( isSpec
137a0 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20  ialError ){.    
137b0 20 20 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72    /* If the quer
137c0 79 20 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20  y was read-only 
137d0 61 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f  and the error co
137e0 64 65 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54  de is SQLITE_INT
137f0 45 52 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a  ERRUPT, .      *
13800 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73  * no rollback is
13810 20 6e 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65   necessary. Othe
13820 72 77 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20  rwise, at least 
13830 61 20 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20  a savepoint .   
13840 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
13850 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64  n must be rolled
13860 20 62 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65   back to restore
13870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f   the database to
13880 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e   a .      ** con
13890 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20  sistent state.. 
138a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
138b0 20 45 76 65 6e 20 69 66 20 74 68 65 20 73 74 61   Even if the sta
138c0 74 65 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f  tement is read-o
138d0 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72  nly, it is impor
138e0 74 61 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a  tant to perform.
138f0 20 20 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65        ** a state
13900 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74  ment or transact
13910 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65  ion rollback ope
13920 72 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65  ration. If the e
13930 72 72 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f  rror .      ** o
13940 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 77 72  ccurred while wr
13950 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75  iting to the jou
13960 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61  rnal, sub-journa
13970 6c 20 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20  l or database.  
13980 20 20 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70      ** file as p
13990 61 72 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74  art of an effort
139a0 20 74 6f 20 66 72 65 65 20 75 70 20 63 61 63 68   to free up cach
139b0 65 20 73 70 61 63 65 20 28 73 65 65 20 66 75 6e  e space (see fun
139c0 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70  ction.      ** p
139d0 61 67 65 72 53 74 72 65 73 73 28 29 20 69 6e 20  agerStress() in 
139e0 70 61 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f  pager.c), the ro
139f0 6c 6c 62 61 63 6b 20 69 73 20 72 65 71 75 69 72  llback is requir
13a00 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20  ed to restore . 
13a10 20 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65       ** the page
13a20 72 20 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e  r to a consisten
13a30 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
13a40 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e  /.      if( !p->
13a50 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21  readOnly || mrc!
13a60 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50  =SQLITE_INTERRUP
13a70 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  T ){.        if(
13a80 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f   (mrc==SQLITE_NO
13a90 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
13aa0 54 45 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75  TE_FULL) && p->u
13ab0 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29  sesStmtJournal )
13ac0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
13ad0 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
13ae0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
13af0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
13b00 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72          /* We ar
13b10 65 20 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c  e forced to roll
13b20 20 62 61 63 6b 20 74 68 65 20 61 63 74 69 76 65   back the active
13b30 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65   transaction. Be
13b40 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20  fore doing.     
13b50 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72       ** so, abor
13b60 74 20 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74  t any other stat
13b70 65 6d 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64  ements this hand
13b80 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73  le currently has
13b90 20 61 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20   active..       
13ba0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
13bb0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
13bc0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
13bd0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
13be0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13bf0 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
13c00 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64  db);.          d
13c10 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
13c20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  1;.          p->
13c30 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
13c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
13c50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65     }..    /* Che
13c60 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65  ck for immediate
13c70 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f   foreign key vio
13c80 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20  lations. */.    
13c90 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
13ca0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
13cb0 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
13cc0 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
13cd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61  .    /* If the a
13ce0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
13cf0 69 73 20 73 65 74 20 61 6e 64 20 74 68 69 73 20  is set and this 
13d00 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69  is the only acti
13d10 76 65 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a  ve writer .    *
13d20 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f  * VM, then we do
13d30 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74   either a commit
13d40 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20   or rollback of 
13d50 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
13d60 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a  saction. .    **
13d70 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68  .    ** Note: Th
13d80 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75  is block also ru
13d90 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65  ns if one of the
13da0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
13db0 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20  handled .    ** 
13dc0 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72  above has occurr
13dd0 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed. .    */.    
13de0 69 66 28 20 21 73 71 6c 69 74 65 33 56 74 61 62  if( !sqlite3Vtab
13df0 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20  InSync(db) .    
13e00 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d   && db->autoComm
13e10 69 74 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  it .     && db->
13e20 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e  nVdbeWrite==(p->
13e30 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20  readOnly==0) .  
13e40 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70    ){.      if( p
13e50 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13e60 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69  || (p->errorActi
13e70 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21  on==OE_Fail && !
13e80 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20  isSpecialError) 
13e90 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13ea0 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
13eb0 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20  Fk(p, 1);.      
13ec0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13ee0 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65   if( NEVER(p->re
13ef0 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20  adOnly) ){.     
13f00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13f10 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
13f20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13f30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
13f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13f50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
13f60 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
13f70 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  NKEY;.        }e
13f80 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20  lse{ .          
13f90 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  /* The auto-comm
13fa0 69 74 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c  it flag is true,
13fb0 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
13fc0 6d 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  m was successful
13fd0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f   .          ** o
13fe0 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49  r hit an 'OR FAI
13ff0 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e  L' constraint an
14000 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64  d there are no d
14010 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a  eferred foreign.
14020 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79            ** key
14030 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
14040 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e  hold up the tran
14050 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65  saction. This me
14060 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20  ans a commit .  
14070 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65          ** is re
14080 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20  quired. */.     
14090 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
140a0 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20  mmit(db, p);.   
140b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
140c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
140d0 53 59 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c  SY && p->readOnl
140e0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  y ){.          s
140f0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
14100 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  p);.          re
14110 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
14120 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
14130 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14140 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  K ){.          p
14150 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
14160 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
14170 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
14180 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
14190 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
141a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
141b0 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e  .          db->n
141c0 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
141d0 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
141e0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
141f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
14200 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
14210 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20  LITE_DeferFKs;. 
14220 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14230 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68  CommitInternalCh
14240 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20  anges(db);.     
14250 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
14260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14270 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14280 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20   SQLITE_OK);.   
14290 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
142a0 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
142b0 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
142c0 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  t = 0;.    }else
142d0 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
142e0 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  p==0 ){.      if
142f0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14300 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63  OK || p->errorAc
14310 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b  tion==OE_Fail ){
14320 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
14330 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
14340 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20  T_RELEASE;.     
14350 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72   }else if( p->er
14360 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62  rorAction==OE_Ab
14370 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65  ort ){.        e
14380 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
14390 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
143a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
143b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
143c0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
143d0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
143e0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
143f0 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14400 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14410 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14420 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14430 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14440 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14450 20 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d     /* If eStatem
14460 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  entOp is non-zer
14470 6f 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d  o, then a statem
14480 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
14490 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
144a0 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20  be committed or 
144b0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c  rolled back. Cal
144c0 6c 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  l sqlite3VdbeClo
144d0 73 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f  seStatement() to
144e0 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49  .    ** do so. I
144f0 66 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  f this operation
14500 20 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f   returns an erro
14510 72 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  r, and the curre
14520 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20  nt statement.   
14530 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69   ** error code i
14540 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53  s SQLITE_OK or S
14550 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14560 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74  , then promote t
14570 68 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  he.    ** curren
14580 74 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f  t statement erro
14590 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20  r code..    */. 
145a0 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e     if( eStatemen
145b0 74 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20  tOp ){.      rc 
145c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f  = sqlite3VdbeClo
145d0 73 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65  seStatement(p, e
145e0 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20  StatementOp);.  
145f0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
14600 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
14610 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
14620 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->rc&0xff)==SQLI
14630 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b  TE_CONSTRAINT ){
14640 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63  .          p->rc
14650 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20   = rc;.         
14660 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
14670 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
14680 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72            p->zEr
14690 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  rMsg = 0;.      
146a0 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
146b0 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
146c0 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  b, SQLITE_ABORT_
146d0 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20  ROLLBACK);.     
146e0 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
146f0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
14700 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
14710 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
14720 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14730 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
14740 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
14750 69 73 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54  is was an INSERT
14760 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45  , UPDATE or DELE
14770 54 45 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d  TE and no statem
14780 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ent transaction.
14790 20 20 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20      ** has been 
147a0 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64  rolled back, upd
147b0 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
147c0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e   connection chan
147d0 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20  ge-counter. .   
147e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63   */.    if( p->c
147f0 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20  hangeCntOn ){.  
14800 20 20 20 20 69 66 28 20 65 53 74 61 74 65 6d 65      if( eStateme
14810 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f  ntOp!=SAVEPOINT_
14820 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
14830 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
14840 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d  etChanges(db, p-
14850 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20  >nChange);.     
14860 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
14870 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
14880 61 6e 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20  anges(db, 0);.  
14890 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e      }.      p->n
148a0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
148b0 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73  }..    /* Releas
148c0 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20  e the locks */. 
148d0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
148e0 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f  ave(p);.  }..  /
148f0 2a 20 57 65 20 68 61 76 65 20 73 75 63 63 65 73  * We have succes
14900 73 66 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e  sfully halted an
14910 64 20 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e  d closed the VM.
14920 20 20 52 65 63 6f 72 64 20 74 68 69 73 20 66 61    Record this fa
14930 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ct. */.  if( p->
14940 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  pc>=0 ){.    db-
14950 3e 6e 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a  >nVdbeActive--;.
14960 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64      if( !p->read
14970 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65  Only ) db->nVdbe
14980 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28  Write--;.    if(
14990 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
149a0 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b  db->nVdbeRead--;
149b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d  .    assert( db-
149c0 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62  >nVdbeActive>=db
149d0 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20  ->nVdbeRead );. 
149e0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
149f0 56 64 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56  VdbeRead>=db->nV
14a00 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20  dbeWrite );.    
14a10 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
14a20 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d  eWrite>=0 );.  }
14a30 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
14a40 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20  BE_MAGIC_HALT;. 
14a50 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65   checkActiveVdbe
14a60 43 6e 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64  Cnt(db);.  if( d
14a70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14a80 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
14a90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
14aa0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
14ab0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
14ac0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74 72  lag is set to tr
14ad0 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63  ue, then any loc
14ae0 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65 6c  ks that were hel
14af0 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63  d.  ** by connec
14b00 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77  tion db have now
14b10 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20   been released. 
14b20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e  Call sqlite3Conn
14b30 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29  ectionUnlocked()
14b40 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65   .  ** to invoke
14b50 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e   any required un
14b60 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
14b70 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  backs..  */.  if
14b80 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  ( db->autoCommit
14b90 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43   ){.    sqlite3C
14ba0 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
14bb0 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  d(db);.  }..  as
14bc0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41  sert( db->nVdbeA
14bd0 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61  ctive>0 || db->a
14be0 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20  utoCommit==0 || 
14bf0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d  db->nStatement==
14c00 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70  0 );.  return (p
14c10 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
14c20 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20  Y ? SQLITE_BUSY 
14c30 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a  : SQLITE_OK);.}.
14c40 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42  ../*.** Each VDB
14c50 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75  E holds the resu
14c60 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  lt of the most r
14c70 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74  ecent sqlite3_st
14c80 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20  ep() call.** in 
14c90 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75  p->rc.  This rou
14ca0 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20 72  tine sets that r
14cb0 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51  esult back to SQ
14cc0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64  LITE_OK..*/.void
14cd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65   sqlite3VdbeRese
14ce0 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62 65  tStepResult(Vdbe
14cf0 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20   *p){.  p->rc = 
14d00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14d10 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72  .** Copy the err
14d20 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f  or code and erro
14d30 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67  r message belong
14d40 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45 20  ing to the VDBE 
14d50 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
14d60 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
14d70 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65 20  to its database 
14d80 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20  handle (so that 
14d90 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a  they will be .**
14da0 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c   returned by cal
14db0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72  ls to sqlite3_er
14dc0 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69  rcode() and sqli
14dd0 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a  te3_errmsg())..*
14de0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14df0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61  on does not clea
14e00 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f 72  r the VDBE error
14e10 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65   code or message
14e20 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73  , just.** copies
14e30 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74   them to the dat
14e40 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
14e50 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
14e60 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64  TransferError(Vd
14e70 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
14e80 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
14e90 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b   int rc = p->rc;
14ea0 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73  .  if( p->zErrMs
14eb0 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65  g ){.    db->bBe
14ec0 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20  nignMalloc++;.  
14ed0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
14ee0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
14ef0 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
14f00 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
14f10 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
14f20 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
14f30 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
14f40 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
14f50 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
14f60 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
14f70 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
14f80 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
14f90 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  );.    db->bBeni
14fa0 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20  gnMalloc--;.    
14fb0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
14fc0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14fd0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14fe0 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
14ff0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
15000 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
15010 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
15020 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
15030 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
15040 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
15050 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
15060 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
15070 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15080 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
15090 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
150a0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
150b0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
150c0 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
150d0 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
150e0 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
150f0 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
15100 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
15110 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
15120 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
15130 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
15140 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
15150 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
15160 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15170 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
15180 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
15190 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
151a0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
151b0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
151c0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
151d0 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
151e0 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
151f0 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
15200 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
15210 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
15220 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
15230 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
15240 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
15250 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
15260 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
15270 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
15280 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
15290 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
152a0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
152b0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
152c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
152d0 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
152e0 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
152f0 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
15300 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
15310 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
15320 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
15330 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
15340 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
15350 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
15360 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
15370 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
15380 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
15390 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
153a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
153b0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
153c0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
153d0 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
153e0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
153f0 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
15400 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
15410 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
15420 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
15430 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
15440 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
15450 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
15460 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
15470 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
15480 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
15490 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
154a0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
154b0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
154c0 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
154d0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
154e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
154f0 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
15500 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15510 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
15520 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
15530 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
15540 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
15550 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
15560 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
15570 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
15580 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
15590 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
155a0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
155b0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
155c0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
155d0 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
155e0 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
155f0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15600 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
15610 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15620 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
15630 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15640 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
15650 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
15660 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
15670 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
15680 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
15690 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
156a0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
156b0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
156c0 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
156d0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
156e0 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
156f0 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
15700 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
15710 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
15720 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
15730 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
15740 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
15750 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15760 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
15770 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
15780 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
15790 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
157a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
157b0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
157c0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
157d0 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
157e0 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
157f0 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
15800 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
15810 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
15820 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
15830 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
15840 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
15850 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
15860 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
15870 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
15880 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
15890 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
158a0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
158b0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
158c0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
158d0 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
158e0 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
158f0 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15900 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
15910 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
15920 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15930 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
15940 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
15950 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
15960 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
15970 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
15980 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
15990 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
159a0 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
159b0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
159c0 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
159d0 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
159e0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
159f0 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
15a00 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
15a10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15a20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
15a30 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15a40 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
15a50 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15a60 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
15a70 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
15a80 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
15a90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
15aa0 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
15ab0 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
15ac0 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
15ad0 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15ae0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15af0 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
15b00 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15b10 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
15b20 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
15b30 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
15b40 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15b50 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15b60 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
15b70 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
15b80 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
15b90 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
15ba0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
15bb0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
15bc0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
15bd0 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
15be0 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15bf0 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
15c00 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
15c10 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
15c20 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
15c30 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
15c40 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
15c50 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
15c60 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
15c70 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
15c80 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
15c90 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
15ca0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
15cb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
15cc0 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
15cd0 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
15ce0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
15cf0 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15d00 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
15d10 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
15d20 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
15d30 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
15d40 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
15d50 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
15d60 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
15d70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
15d80 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
15d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
15da0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
15db0 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
15dc0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
15dd0 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
15de0 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
15df0 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
15e00 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
15e10 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
15e20 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
15e30 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
15e40 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
15e50 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15e60 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
15e70 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
15e80 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
15e90 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
15ea0 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
15eb0 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
15ec0 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
15ed0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
15ee0 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
15ef0 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
15f00 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
15f10 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
15f20 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
15f30 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
15f40 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
15f50 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
15f60 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
15f70 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
15f80 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
15f90 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
15fa0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
15fb0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
15fc0 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
15fd0 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
15fe0 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
15ff0 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
16000 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
16010 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
16020 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
16030 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
16040 44 61 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62  Data(sqlite3 *db
16050 2c 20 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20  , AuxData **pp, 
16060 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73  int iOp, int mas
16070 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70  k){.  while( *pp
16080 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20   ){.    AuxData 
16090 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20  *pAux = *pp;.   
160a0 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20   if( (iOp<0).   
160b0 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d    || (pAux->iOp=
160c0 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69  =iOp && (pAux->i
160d0 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b  Arg>31 || !(mask
160e0 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75   & MASKBIT32(pAu
160f0 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20  x->iArg)))).    
16100 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  ){.      testcas
16110 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33  e( pAux->iArg==3
16120 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  1 );.      if( p
16130 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a  Aux->xDelete ){.
16140 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44          pAux->xD
16150 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78  elete(pAux->pAux
16160 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16170 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65   *pp = pAux->pNe
16180 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  xt;.      sqlite
16190 33 44 62 46 72 65 65 28 64 62 2c 20 70 41 75 78  3DbFree(db, pAux
161a0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
161b0 20 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70      pp= &pAux->p
161c0 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Next;.    }.  }.
161d0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c  }../*.** Free al
161e0 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  l memory associa
161f0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
16200 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
16210 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
16220 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f  .** except for o
16230 62 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68  bject itself, wh
16240 69 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64  ich is preserved
16250 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
16260 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
16270 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
16280 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
16290 74 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20  te() is that.** 
162a0 56 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73  VdbeDelete() als
162b0 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64  o unlinks the Vd
162c0 62 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  be from the list
162d0 20 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74   of VMs associat
162e0 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64  ed with.** the d
162f0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
16300 6f 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65  on and frees the
16310 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a   object itself..
16320 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
16330 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73  dbeClearObject(s
16340 71 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65  qlite3 *db, Vdbe
16350 20 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72   *p){.  SubProgr
16360 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74  am *pSub, *pNext
16370 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73  ;.  int i;.  ass
16380 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c  ert( p->db==0 ||
16390 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20   p->db==db );.  
163a0 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
163b0 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72  p->aVar, p->nVar
163c0 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  );.  releaseMemA
163d0 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65  rray(p->aColName
163e0 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a  , p->nResColumn*
163f0 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f  COLNAME_N);.  fo
16400 72 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72  r(pSub=p->pProgr
16410 61 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70  am; pSub; pSub=p
16420 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
16430 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a   = pSub->pNext;.
16440 20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72      vdbeFreeOpAr
16450 72 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f  ray(db, pSub->aO
16460 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20  p, pSub->nOp);. 
16470 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
16480 28 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a  (db, pSub);.  }.
16490 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72    for(i=p->nzVar
164a0 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73  -1; i>=0; i--) s
164b0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
164c0 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20   p->azVar[i]);. 
164d0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
164e0 62 2c 20 70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20  b, p->azVar);.  
164f0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16500 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
16510 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
16520 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
16530 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16540 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
16550 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
16560 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
16570 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
16580 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
16590 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
165a0 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
165b0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
165c0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
165d0 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
165e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
165f0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
16600 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
16610 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
16620 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
16630 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16640 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16650 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16660 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16670 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16680 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16690 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
166a0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
166b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
166c0 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
166d0 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
166e0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
166f0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
16700 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
16710 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
16720 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
16730 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16740 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16750 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16760 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16770 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16780 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16790 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
167a0 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
167b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
167c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
167d0 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
167e0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
167f0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
16800 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
16810 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
16820 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
16830 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16840 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16850 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16860 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16870 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16880 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16890 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
168a0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
168b0 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
168c0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
168d0 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
168e0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
168f0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
16900 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
16910 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
16920 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
16930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16940 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16950 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
16960 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
16970 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
16980 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
16990 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
169a0 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
169b0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
169c0 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
169d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
169e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
169f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16a00 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
16a10 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
16a20 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
16a30 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
16a40 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
16a50 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
16a60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16a70 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
16a80 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
16a90 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
16aa0 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
16ab0 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
16ac0 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
16ad0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16ae0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
16af0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
16b00 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
16b10 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
16b20 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
16b30 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
16b40 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
16b50 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
16b60 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
16b70 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
16b80 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
16b90 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
16ba0 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
16bb0 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
16bc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
16bd0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
16be0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
16bf0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16c00 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
16c10 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
16c20 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
16c30 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
16c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16c50 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
16c60 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16c70 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
16c80 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
16c90 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
16ca0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16cb0 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
16cc0 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
16cd0 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
16ce0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
16cf0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
16d00 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
16d10 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
16d20 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16d30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
16d40 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
16d50 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
16d60 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
16d70 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
16d80 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
16d90 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
16da0 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
16db0 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
16dc0 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
16dd0 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
16de0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
16df0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
16e00 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
16e10 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
16e20 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
16e30 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
16e40 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
16e50 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
16e60 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16e70 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16e80 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16e90 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
16ea0 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
16eb0 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
16ec0 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
16ed0 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
16ee0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
16ef0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
16f00 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
16f10 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
16f20 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
16f30 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
16f40 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
16f50 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
16f60 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
16f70 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
16f80 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
16f90 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
16fa0 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
16fb0 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
16fc0 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
16fd0 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
16fe0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
16ff0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
17000 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
17010 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
17020 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
17030 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
17040 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
17050 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
17060 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
17070 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
17080 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
17090 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
170a0 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
170b0 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
170c0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
170d0 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
170e0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
170f0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  to(VdbeCursor **
17100 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b  pp, int *piCol){
17110 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
17120 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d   = *pp;.  if( p-
17130 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
17140 50 45 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20  PE_BTREE ){.    
17150 69 66 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  if( p->deferredM
17160 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69  oveto ){.      i
17170 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69  nt iMap;.      i
17180 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26  f( p->aAltMap &&
17190 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74   (iMap = p->aAlt
171a0 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30  Map[1+*piCol])>0
171b0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20   ){.        *pp 
171c0 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b  = p->pAltCursor;
171d0 0a 20 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20  .        *piCol 
171e0 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20  = iMap - 1;.    
171f0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17200 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
17210 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
17220 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
17230 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  p);.    }.    if
17240 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17250 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
17260 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
17270 20 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64       return hand
17280 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
17290 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
172a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
172b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
172c0 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lowing functions
172d0 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56  :.**.** sqlite3V
172e0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a  dbeSerialType().
172f0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17300 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a  rialTypeLen().**
17310 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17320 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  alLen().** sqlit
17330 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28  e3VdbeSerialPut(
17340 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17350 53 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a  SerialGet().**.*
17360 2a 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68  * encapsulate th
17370 65 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69  e code that seri
17380 61 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f  alizes values fo
17390 72 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c  r storage in SQL
173a0 69 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20  ite.** data and 
173b0 69 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45  index records. E
173c0 61 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76  ach serialized v
173d0 61 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  alue consists of
173e0 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79   a.** 'serial-ty
173f0 70 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f  pe' and a blob o
17400 66 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69  f data. The seri
17410 61 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d  al type is an 8-
17420 62 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a  byte unsigned.**
17430 20 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64   integer, stored
17440 20 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a   as a varint..**
17450 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65  .** In an SQLite
17460 20 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74   index record, t
17470 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69  he serial type i
17480 73 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c  s stored directl
17490 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  y before.** the 
174a0 62 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61  blob of data tha
174b0 74 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73  t it corresponds
174c0 20 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20   to. In a table 
174d0 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69  record, all seri
174e0 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20  al.** types are 
174f0 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74  stored at the st
17500 61 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72  art of the recor
17510 64 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73  d, and the blobs
17520 20 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74   of data at.** t
17530 68 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68  he end. Hence th
17540 65 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c  ese functions al
17550 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74  low the caller t
17560 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20  o handle the.** 
17570 73 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20  serial-type and 
17580 64 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61  data blob separa
17590 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tely..**.** The 
175a0 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20  following table 
175b0 64 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61  describes the va
175c0 72 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c  rious storage cl
175d0 61 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a  asses for data:.
175e0 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74  **.**   serial t
175f0 79 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73  ype        bytes
17600 20 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79   of data      ty
17610 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  pe.**   --------
17620 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
17630 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d  ----------    --
17640 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
17650 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
17660 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17670 20 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a           NULL.**
17680 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
17690 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20              1   
176a0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
176b0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
176c0 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
176d0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
176e0 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
176f0 72 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20  r.**      3     
17700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17710 33 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  3            sig
17720 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17730 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
17740 20 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20            4     
17750 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17760 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20  teger.**      5 
17770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17780 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17790 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
177a0 2a 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20  **      6       
177b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
177c0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
177d0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
177e0 20 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20    7             
177f0 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17800 20 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a       IEEE float.
17810 2a 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20  **      8       
17820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
17830 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67             Integ
17840 65 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a  er constant 0.**
17850 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
17860 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17870 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
17880 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20   constant 1.**  
17890 20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20     10,11        
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
178c0 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a  for expansion.**
178d0 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76      N>=12 and ev
178e0 65 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f  en       (N-12)/
178f0 32 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a  2        BLOB.**
17900 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64      N>=13 and od
17910 64 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f  d        (N-13)/
17920 32 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a  2        text.**
17930 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20  .** The 8 and 9 
17940 74 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64  types were added
17950 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20   in 3.3.0, file 
17960 66 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72  format 4.  Prior
17970 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20   versions.** of 
17980 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20  SQLite will not 
17990 75 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65  understand those
179a0 20 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a   serial types..*
179b0 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
179c0 74 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20  the serial-type 
179d0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
179e0 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f  ored in pMem..*/
179f0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
17a00 53 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a  SerialType(Mem *
17a10 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66  pMem, int file_f
17a20 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e  ormat, u32 *pLen
17a30 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  ){.  int flags =
17a40 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20   pMem->flags;.  
17a50 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74  u32 n;..  assert
17a60 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69  ( pLen!=0 );.  i
17a70 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  f( flags&MEM_Nul
17a80 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
17a90 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   0;.    return 0
17aa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
17ab0 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
17ac0 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
17ad0 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
17ae0 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
17af0 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
17b00 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
17b10 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
17b20 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
17b30 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
17b40 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
17b50 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
17b60 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73  u = ~i;.    }els
17b70 65 7b 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a  e{.      u = i;.
17b80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
17b90 3d 31 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66  =127 ){.      if
17ba0 28 20 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69  ( (i&1)==i && fi
17bb0 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a  le_format>=4 ){.
17bc0 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20          *pLen = 
17bd0 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
17be0 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20  n 8+(u32)u;.    
17bf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17c00 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20   *pLen = 1;.    
17c10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
17c20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
17c30 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20  if( u<=32767 ){ 
17c40 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72  *pLen = 2; retur
17c50 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 2; }.    if( u
17c60 3c 3d 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c  <=8388607 ){ *pL
17c70 65 6e 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33  en = 3; return 3
17c80 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32  ; }.    if( u<=2
17c90 31 34 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c  147483647 ){ *pL
17ca0 65 6e 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34  en = 4; return 4
17cb0 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d  ; }.    if( u<=M
17cc0 41 58 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65  AX_6BYTE ){ *pLe
17cd0 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b  n = 6; return 5;
17ce0 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38   }.    *pLen = 8
17cf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a  ;.    return 6;.
17d00 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
17d10 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
17d20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
17d30 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61  eturn 7;.  }.  a
17d40 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d  ssert( pMem->db-
17d50 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
17d60 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c   flags&(MEM_Str|
17d70 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61  MEM_Blob) );.  a
17d80 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d  ssert( pMem->n>=
17d90 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29  0 );.  n = (u32)
17da0 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66  pMem->n;.  if( f
17db0 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20  lags & MEM_Zero 
17dc0 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d  ){.    n += pMem
17dd0 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20  ->u.nZero;.  }. 
17de0 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65   *pLen = n;.  re
17df0 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32  turn ((n*2) + 12
17e00 20 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53   + ((flags&MEM_S
17e10 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a  tr)!=0));.}../*.
17e20 2a 2a 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72  ** The sizes for
17e30 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65   serial types le
17e40 73 73 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73  ss than 128.*/.s
17e50 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73  tatic const u8 s
17e60 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
17e70 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  izes[] = {.     
17e80 20 20 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32     /*  0   1   2
17e90 20 20 20 33 20 20 20 34 20 20 20 35 20 20 20 36     3   4   5   6
17ea0 20 20 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20     7   8   9 */ 
17eb0 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30    ./*   0 */   0
17ec0 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34  ,  1,  2,  3,  4
17ed0 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30  ,  6,  8,  8,  0
17ee0 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20  ,  0,./*  10 */ 
17ef0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c    0,  0,  0,  0,
17f00 20 20 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c    1,  1,  2,  2,
17f10 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20    3,  3,./*  20 
17f20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20  */   4,  4,  5, 
17f30 20 35 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20   5,  6,  6,  7, 
17f40 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20   7,  8,  8,./*  
17f50 33 30 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31  30 */   9,  9, 1
17f60 30 2c 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31  0, 10, 11, 11, 1
17f70 32 2c 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f  2, 12, 13, 13,./
17f80 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34  *  40 */  14, 14
17f90 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36  , 15, 15, 16, 16
17fa0 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38  , 17, 17, 18, 18
17fb0 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c  ,./*  50 */  19,
17fc0 20 31 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c   19, 20, 20, 21,
17fd0 20 32 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c   21, 22, 22, 23,
17fe0 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20   23,./*  60 */  
17ff0 32 34 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20  24, 24, 25, 25, 
18000 32 36 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20  26, 26, 27, 27, 
18010 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a  28, 28,./*  70 *
18020 2f 20 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33  /  29, 29, 30, 3
18030 30 2c 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33  0, 31, 31, 32, 3
18040 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38  2, 33, 33,./*  8
18050 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35  0 */  34, 34, 35
18060 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37  , 35, 36, 36, 37
18070 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a  , 37, 38, 38,./*
18080 20 20 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c    90 */  39, 39,
18090 20 34 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c   40, 40, 41, 41,
180a0 20 34 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c   42, 42, 43, 43,
180b0 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20  ./* 100 */  44, 
180c0 34 34 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20  44, 45, 45, 46, 
180d0 34 36 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20  46, 47, 47, 48, 
180e0 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34  48,./* 110 */  4
180f0 39 2c 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35  9, 49, 50, 50, 5
18100 31 2c 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35  1, 51, 52, 52, 5
18110 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f  3, 53,./* 120 */
18120 20 20 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35    54, 54, 55, 55
18130 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37  , 56, 56, 57, 57
18140 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .};../*.** Retur
18150 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
18160 74 68 65 20 64 61 74 61 20 63 6f 72 72 65 73 70  the data corresp
18170 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75  onding to the su
18180 70 70 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79  pplied serial-ty
18190 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  pe..*/.u32 sqlit
181a0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
181b0 4c 65 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74  Len(u32 serial_t
181c0 79 70 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69  ype){.  if( seri
181d0 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a  al_type>=128 ){.
181e0 20 20 20 20 72 65 74 75 72 6e 20 28 73 65 72 69      return (seri
181f0 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20  al_type-12)/2;. 
18200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
18210 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  rt( serial_type<
18220 31 32 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  12 .            
18230 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  || sqlite3SmallT
18240 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
18250 74 79 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74  type]==(serial_t
18260 79 70 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20  ype - 12)/2 );. 
18270 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
18280 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
18290 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
182a0 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64  }.}.u8 sqlite3Vd
182b0 62 65 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54  beOneByteSerialT
182c0 79 70 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c  ypeLen(u8 serial
182d0 5f 74 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74  _type){.  assert
182e0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
182f0 38 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  8 );.  return sq
18300 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18310 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
18320 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ;  .}../*.** If 
18330 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63  we are on an arc
18340 68 69 74 65 63 74 75 72 65 20 77 69 74 68 20 6d  hitecture with m
18350 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61  ixed-endian floa
18360 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20  ting .** points 
18370 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20  (ex: ARM7) then 
18380 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34  swap the lower 4
18390 20 62 79 74 65 73 20 77 69 74 68 20 74 68 65 20   bytes with the 
183a0 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79 74 65  .** upper 4 byte
183b0 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 72  s.  Return the r
183c0 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  esult..**.** For
183d0 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63 74 75   most architectu
183e0 72 65 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e  res, this is a n
183f0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74  o-op..**.** (lat
18400 65 72 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f  er):  It is repo
18410 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20  rted to me that 
18420 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e  the mixed-endian
18430 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41   problem.** on A
18440 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75 65 20  RM7 is an issue 
18450 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69  with GCC, not wi
18460 74 68 20 74 68 65 20 41 52 4d 37 20 63 68 69 70  th the ARM7 chip
18470 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74  .  It seems.** t
18480 68 61 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f  hat early versio
18490 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64  ns of GCC stored
184a0 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f   the two words o
184b0 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c  f a 64-bit.** fl
184c0 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67  oat in the wrong
184d0 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61   order.  And tha
184e0 74 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e  t error has been
184f0 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65   propagated.** e
18500 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20  ver since.  The 
18510 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63  blame is not nec
18520 65 73 73 61 72 69 6c 79 20 77 69 74 68 20 47 43  essarily with GC
18530 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43  C, though..** GC
18540 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73  C might have jus
18550 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72  t copying the pr
18560 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69  oblem from a pri
18570 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20  or compiler..** 
18580 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74  I am also told t
18590 68 61 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f  hat newer versio
185a0 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74 20 66  ns of GCC that f
185b0 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e  ollow a differen
185c0 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65  t.** ABI get the
185d0 20 62 79 74 65 20 6f 72 64 65 72 20 72 69 67 68   byte order righ
185e0 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70  t..**.** Develop
185f0 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65  ers using SQLite
18600 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75   on an ARM7 shou
18610 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72  ld compile and r
18620 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c  un their.** appl
18630 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44  ication using -D
18640 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61  SQLITE_DEBUG=1 a
18650 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57  t least once.  W
18660 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61  ith DEBUG.** ena
18670 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72  bled, some asser
18680 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e  ts below will en
18690 73 75 72 65 20 74 68 61 74 20 74 68 65 20 62 79  sure that the by
186a0 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66  te order of.** f
186b0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
186c0 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e  lues is correct.
186d0 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d  .**.** (2007-08-
186e0 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56  30)  Frank van V
186f0 75 67 74 20 68 61 73 20 73 74 75 64 69 65 64 20  ugt has studied 
18700 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f  this problem clo
18710 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20  sely.** and has 
18720 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67  send his finding
18730 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20  s to the SQLite 
18740 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61  developers.  Fra
18750 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61  nk.** writes tha
18760 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72  t some Linux ker
18770 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74  nels offer float
18780 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61  ing point hardwa
18790 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20  re.** emulation 
187a0 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33  that uses only 3
187b0 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20  2-bit mantissas 
187c0 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c  instead of a ful
187d0 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73  l .** 48-bits as
187e0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
187f0 20 49 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20   IEEE standard. 
18800 20 28 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a   (This is the.**
18810 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54   CONFIG_FPE_FAST
18820 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e  FPE option.)  On
18830 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66   such systems, f
18840 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a  loating point.**
18850 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 62   byte swapping b
18860 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70  ecomes very comp
18870 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f  licated.  To avo
18880 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20  id problems,.** 
18890 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 62 79  the necessary by
188a0 74 65 20 73 77 61 70 70 69 6e 67 20 69 73 20 63  te swapping is c
188b0 61 72 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67  arried out using
188c0 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
188d0 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e  r.** rather than
188e0 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e   a 64-bit float.
188f0 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20    Frank assures 
18900 75 73 20 74 68 61 74 20 74 68 65 20 63 6f 64 65  us that the code
18910 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66   here.** works f
18920 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65  or him.  We, the
18930 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76   developers, hav
18940 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65  e no way to inde
18950 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72  pendently.** ver
18960 69 66 79 20 74 68 69 73 2c 20 62 75 74 20 46 72  ify this, but Fr
18970 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f  ank seems to kno
18980 77 20 77 68 61 74 20 68 65 20 69 73 20 74 61 6c  w what he is tal
18990 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f  king about.** so
189a0 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a   we trust him..*
189b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
189c0 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42  MIXED_ENDIAN_64B
189d0 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20  IT_FLOAT.static 
189e0 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36  u64 floatSwap(u6
189f0 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b  4 in){.  union {
18a00 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20  .    u64 r;.    
18a10 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b  u32 i[2];.  } u;
18a20 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72  .  u32 t;..  u.r
18a30 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69   = in;.  t = u.i
18a40 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20  [0];.  u.i[0] = 
18a50 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d  u.i[1];.  u.i[1]
18a60 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75   = t;.  return u
18a70 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73  .r;.}.# define s
18a80 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
18a90 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61  oat(X)  X = floa
18aa0 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23  tSwap(X).#else.#
18ab0 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
18ac0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a  dEndianFloat(X).
18ad0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72  #endif../*.** Wr
18ae0 69 74 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a  ite the serializ
18af0 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72  ed data blob for
18b00 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65   the value store
18b10 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a  d in pMem into .
18b20 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20 61 73  ** buf. It is as
18b30 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
18b40 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61  aller has alloca
18b50 74 65 64 20 73 75 66 66 69 63 69 65 6e 74 20 73  ted sufficient s
18b60 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  pace..** Return 
18b70 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18b80 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a  tes written..**.
18b90 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65 20 61  ** nBuf is the a
18ba0 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c  mount of space l
18bb0 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54  eft in buf[].  T
18bc0 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
18bd0 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20  ponsible.** for 
18be0 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67  allocating enoug
18bf0 68 20 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d  h space to buf[]
18c00 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74   to hold the ent
18c10 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75  ire field, exclu
18c20 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  sive.** of the p
18c30 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74  Mem->u.nZero byt
18c40 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72  es for a MEM_Zer
18c50 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52  o value..**.** R
18c60 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18c70 20 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c   of bytes actual
18c80 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  ly written into 
18c90 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62  buf[].  The numb
18ca0 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69  er.** of bytes i
18cb0 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  n the zero-fille
18cc0 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64  d tail is includ
18cd0 65 64 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  ed in the return
18ce0 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69   value only.** i
18cf0 66 20 74 68 6f 73 65 20 62 79 74 65 73 20 77 65  f those bytes we
18d00 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66  re zeroed in buf
18d10 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69  []..*/ .u32 sqli
18d20 74 65 33 56 64 62 65 53 65 72 69 61 6c 50 75 74  te3VdbeSerialPut
18d30 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70  (u8 *buf, Mem *p
18d40 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f  Mem, u32 serial_
18d50 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e  type){.  u32 len
18d60 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  ;..  /* Integer 
18d70 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66  and Real */.  if
18d80 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37  ( serial_type<=7
18d90 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e   && serial_type>
18da0 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a  0 ){.    u64 v;.
18db0 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69      u32 i;.    i
18dc0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
18dd0 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  7 ){.      asser
18de0 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69  t( sizeof(v)==si
18df0 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  zeof(pMem->u.r) 
18e00 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
18e10 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  &v, &pMem->u.r, 
18e20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20  sizeof(v));.    
18e30 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
18e40 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d  nFloat(v);.    }
18e50 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20  else{.      v = 
18e60 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  pMem->u.i;.    }
18e70 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73  .    len = i = s
18e80 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18e90 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18ea0 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  ];.    assert( i
18eb0 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20  >0 );.    do{.  
18ec0 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28      buf[--i] = (
18ed0 75 38 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20  u8)(v&0xFF);.   
18ee0 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20     v >>= 8;.    
18ef0 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20  }while( i );.   
18f00 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
18f10 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72  ..  /* String or
18f20 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73   blob */.  if( s
18f30 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29  erial_type>=12 )
18f40 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  {.    assert( pM
18f50 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e  em->n + ((pMem->
18f60 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
18f70 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a  )?pMem->u.nZero:
18f80 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0).             
18f90 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56  == (int)sqlite3V
18fa0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
18fb0 28 73 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b  (serial_type) );
18fc0 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d  .    len = pMem-
18fd0 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e  >n;.    if( len>
18fe0 30 20 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20  0 ) memcpy(buf, 
18ff0 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20  pMem->z, len);. 
19000 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20     return len;. 
19010 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72   }..  /* NULL or
19020 20 63 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20   constants 0 or 
19030 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  1 */.  return 0;
19040 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22  .}../* Input "x"
19050 20 69 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f   is a sequence o
19060 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61  f unsigned chara
19070 63 74 65 72 73 20 74 68 61 74 20 72 65 70 72 65  cters that repre
19080 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e  sent a.** big-en
19090 64 69 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52  dian integer.  R
190a0 65 74 75 72 6e 20 74 68 65 20 65 71 75 69 76 61  eturn the equiva
190b0 6c 65 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65  lent native inte
190c0 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  ger.*/.#define O
190d0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20  NE_BYTE_INT(x)  
190e0 20 20 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23    ((i8)(x)[0]).#
190f0 64 65 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f  define TWO_BYTE_
19100 49 4e 54 28 78 29 20 20 20 20 28 32 35 36 2a 28  INT(x)    (256*(
19110 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b  i8)((x)[0])|(x)[
19120 31 5d 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45  1]).#define THRE
19130 45 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28  E_BYTE_INT(x)  (
19140 36 35 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30  65536*(i8)((x)[0
19150 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28  ])|((x)[1]<<8)|(
19160 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46  x)[2]).#define F
19170 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29  OUR_BYTE_UINT(x)
19180 20 20 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c    (((u32)(x)[0]<
19190 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36  <24)|((x)[1]<<16
191a0 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78  )|((x)[2]<<8)|(x
191b0 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f  )[3]).#define FO
191c0 55 52 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28  UR_BYTE_INT(x) (
191d0 31 36 37 37 37 32 31 36 2a 28 69 38 29 28 28 78  16777216*(i8)((x
191e0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31  )[0])|((x)[1]<<1
191f0 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28  6)|((x)[2]<<8)|(
19200 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65  x)[3])../*.** De
19210 73 65 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61  serialize the da
19220 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20  ta blob pointed 
19230 74 6f 20 62 79 20 62 75 66 20 61 73 20 73 65 72  to by buf as ser
19240 69 61 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f  ial type serial_
19250 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72  type.** and stor
19260 65 20 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20  e the result in 
19270 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68  pMem.  Return th
19280 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19290 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s read..**.** Th
192a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
192b0 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77  mplemented as tw
192c0 6f 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  o separate routi
192d0 6e 65 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61  nes for performa
192e0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20  nce..** The few 
192f0 63 61 73 65 73 20 74 68 61 74 20 72 65 71 75 69  cases that requi
19300 72 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  re local variabl
19310 65 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75  es are broken ou
19320 74 20 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74  t into a separat
19330 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20  e.** routine so 
19340 74 68 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73  that in most cas
19350 65 73 20 74 68 65 20 6f 76 65 72 68 65 61 64 20  es the overhead 
19360 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74  of moving the st
19370 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69  ack pointer.** i
19380 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73  s avoided..*/ .s
19390 74 61 74 69 63 20 75 33 32 20 53 51 4c 49 54 45  tatic u32 SQLITE
193a0 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c  _NOINLINE serial
193b0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
193c0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
193d0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
193e0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
193f0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19400 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19410 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19420 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19430 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19440 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19450 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19460 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19470 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19480 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
19490 59 54 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20  YTE_UINT(buf);. 
194a0 20 75 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59   u32 y = FOUR_BY
194b0 54 45 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a  TE_UINT(buf+4);.
194c0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20    x = (x<<32) + 
194d0 79 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  y;.  if( serial_
194e0 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f  type==6 ){.    /
194f0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
19500 2d 32 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c  -29851-52272 Val
19510 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
19520 61 6e 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  an 64-bit.    **
19530 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19540 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19550 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69   pMem->u.i = *(i
19560 36 34 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d  64*)&x;.    pMem
19570 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19580 74 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  t;.    testcase(
19590 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
195a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
195b0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
195c0 37 33 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65  7343-49114 Value
195d0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
195e0 20 49 45 45 45 20 37 35 34 2d 32 30 30 38 20 36   IEEE 754-2008 6
195f0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f  4-bit.    ** flo
19600 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62  ating point numb
19610 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  er. */.#if !defi
19620 6e 65 64 28 4e 44 45 42 55 47 29 20 26 26 20 21  ned(NDEBUG) && !
19630 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
19640 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49  MIT_FLOATING_POI
19650 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66  NT).    /* Verif
19660 79 20 74 68 61 74 20 69 6e 74 65 67 65 72 73 20  y that integers 
19670 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  and floating poi
19680 6e 74 20 76 61 6c 75 65 73 20 75 73 65 20 74 68  nt values use th
19690 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79  e same.    ** by
196a0 74 65 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74  te order.  Or, t
196b0 68 61 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49  hat if SQLITE_MI
196c0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
196d0 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a  _FLOAT is.    **
196e0 20 64 65 66 69 6e 65 64 20 74 68 61 74 20 36 34   defined that 64
196f0 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f  -bit floating po
19700 69 6e 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c  int values reall
19710 79 20 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20  y are mixed.    
19720 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a  ** endian..    *
19730 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  /.    static con
19740 73 74 20 75 36 34 20 74 31 20 3d 20 28 28 75 36  st u64 t1 = ((u6
19750 34 29 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33  4)0x3ff00000)<<3
19760 32 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  2;.    static co
19770 6e 73 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20  nst double r1 = 
19780 31 2e 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20  1.0;.    u64 t2 
19790 3d 20 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69  = t1;.    swapMi
197a0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74  xedEndianFloat(t
197b0 32 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  2);.    assert( 
197c0 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65  sizeof(r1)==size
197d0 6f 66 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70  of(t2) && memcmp
197e0 28 26 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f  (&r1, &t2, sizeo
197f0 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e  f(r1))==0 );.#en
19800 64 69 66 0a 20 20 20 20 61 73 73 65 72 74 28 20  dif.    assert( 
19810 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20  sizeof(x)==8 && 
19820 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
19830 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70  )==8 );.    swap
19840 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
19850 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (x);.    memcpy(
19860 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20  &pMem->u.r, &x, 
19870 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20  sizeof(x));.    
19880 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71  pMem->flags = sq
19890 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d  lite3IsNaN(pMem-
198a0 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c  >u.r) ? MEM_Null
198b0 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d   : MEM_Real;.  }
198c0 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75  .  return 8;.}.u
198d0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
198e0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
198f0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
19900 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
19910 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19920 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
19930 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19950 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19960 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19970 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
19980 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
19990 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
199a0 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
199b0 0a 29 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65  .){.  switch( se
199c0 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
199d0 20 63 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52   case 10:   /* R
199e0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
199f0 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
19a00 73 65 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65  se 11:   /* Rese
19a10 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
19a20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  use */.    case 
19a30 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f  0: {  /* Null */
19a40 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19a50 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30  CE-OF: R-24078-0
19a60 39 33 37 35 20 56 61 6c 75 65 20 69 73 20 61 20  9375 Value is a 
19a70 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70  NULL. */.      p
19a80 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19a90 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65  _Null;.      bre
19aa0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
19ab0 73 65 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  se 1: {.      /*
19ac0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19ad0 34 34 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75  44885-25196 Valu
19ae0 65 20 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77  e is an 8-bit tw
19af0 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20  os-complement.  
19b00 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20      ** integer. 
19b10 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19b20 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  .i = ONE_BYTE_IN
19b30 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19b40 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19b50 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19b60 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19b70 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19b80 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   1;.    }.    ca
19b90 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
19ba0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19bb0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19bc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39  DENCE-OF: R-4979
19bd0 34 2d 33 35 30 32 36 20 56 61 6c 75 65 20 69 73  4-35026 Value is
19be0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36   a big-endian 16
19bf0 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19c00 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19c10 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19c20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f  pMem->u.i = TWO_
19c30 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
19c40 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19c50 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19c60 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19c70 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19c80 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d   return 2;.    }
19c90 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
19ca0 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
19cb0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
19cc0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19cd0 20 52 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56   R-37839-54301 V
19ce0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19cf0 64 69 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20  dian 24-bit.    
19d00 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19d10 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19d20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
19d30 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
19d40 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19d50 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19d60 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19d70 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19d80 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19d90 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   3;.    }.    ca
19da0 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
19db0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19dc0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19dd0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34  DENCE-OF: R-0184
19de0 39 2d 32 36 30 37 39 20 56 61 6c 75 65 20 69 73  9-26079 Value is
19df0 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32   a big-endian 32
19e00 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19e10 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19e20 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19e30 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
19e40 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19e50 23 69 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a  #ifdef __HP_cc .
19e60 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72        /* Work ar
19e70 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65  ound a sign-exte
19e80 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65  nsion bug in the
19e90 20 48 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72   HP compiler for
19ea0 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20   HP/UX */.      
19eb0 69 66 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20  if( buf[0]&0x80 
19ec0 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30  ) pMem->u.i |= 0
19ed0 78 66 66 66 66 66 66 66 66 38 30 30 30 30 30 30  xffffffff8000000
19ee0 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  0LL;.#endif.    
19ef0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19f00 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19f10 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19f20 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19f30 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20  turn 4;.    }.  
19f40 20 20 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36    case 5: { /* 6
19f50 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19f60 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19f70 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19f80 35 30 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75  50385-09674 Valu
19f90 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19fa0 6e 20 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 48-bit.      *
19fb0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
19fc0 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
19fd0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19fe0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
19ff0 75 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  uf+2) + (((i64)1
1a000 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1a010 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
1a020 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a030 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a040 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a050 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a060 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 6;.    }.    
1a070 63 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62  case 6:   /* 8-b
1a080 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a090 65 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37  er */.    case 7
1a0a0 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61  : { /* IEEE floa
1a0b0 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20  ting point */.  
1a0c0 20 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65      /* These use
1a0d0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
1a0e0 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20  , so do them in 
1a0f0 61 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69  a separate routi
1a100 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  ne.      ** to a
1a110 76 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d  void having to m
1a120 6f 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f  ove the frame po
1a130 69 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d  inter in the com
1a140 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20  mon case */.    
1a150 20 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47    return serialG
1a160 65 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79  et(buf,serial_ty
1a170 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a  pe,pMem);.    }.
1a180 20 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f      case 8:    /
1a190 2a 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20  * Integer 0 */. 
1a1a0 20 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a     case 9: {  /*
1a1b0 20 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20   Integer 1 */.  
1a1c0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
1a1d0 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39  OF: R-12976-2289
1a1e0 33 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69  3 Value is the i
1a1f0 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20  nteger 0. */.   
1a200 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a210 46 3a 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31  F: R-18143-12121
1a220 20 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e   Value is the in
1a230 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20  teger 1. */.    
1a240 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65    pMem->u.i = se
1a250 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20  rial_type-8;.   
1a260 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a270 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a280 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1a290 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1a2a0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a2b0 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35  -OF: R-14606-315
1a2c0 36 34 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c  64 Value is a BL
1a2d0 4f 42 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32  OB that is (N-12
1a2e0 29 2f 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20  )/2 bytes in.   
1a2f0 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20     ** length..  
1a300 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
1a310 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34  OF: R-28401-0014
1a320 30 20 56 61 6c 75 65 20 69 73 20 61 20 73 74 72  0 Value is a str
1a330 69 6e 67 20 69 6e 20 74 68 65 20 74 65 78 74 20  ing in the text 
1a340 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20  encoding and.   
1a350 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62     ** (N-13)/2 b
1a360 79 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20  ytes in length. 
1a370 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
1a380 63 6f 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b  const u16 aFlag[
1a390 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d  ] = { MEM_Blob|M
1a3a0 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74  EM_Ephem, MEM_St
1a3b0 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20  r|MEM_Ephem };. 
1a3c0 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
1a3d0 63 68 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20  char *)buf;.    
1a3e0 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72    pMem->n = (ser
1a3f0 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a  ial_type-12)/2;.
1a400 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a410 73 20 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c  s = aFlag[serial
1a420 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20  _type&1];.      
1a430 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a  return pMem->n;.
1a440 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a450 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68  rn 0;.}./*.** Th
1a460 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
1a470 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73  ed to allocate s
1a480 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 20  ufficient space 
1a490 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52  for an UnpackedR
1a4a0 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
1a4b0 72 65 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20  re large enough 
1a4c0 74 6f 20 62 65 20 75 73 65 64 20 77 69 74 68 20  to be used with 
1a4d0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1a4e0 64 55 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20  dUnpack() if.** 
1a4f0 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
1a500 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
1a510 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63  to KeyInfo struc
1a520 74 75 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a  ture pKeyInfo..*
1a530 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69  *.** The space i
1a540 73 20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74  s either allocat
1a550 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
1a560 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72  DbMallocRaw() or
1a570 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20   from within.** 
1a580 74 68 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75  the unaligned bu
1a590 66 66 65 72 20 70 61 73 73 65 64 20 76 69 61 20  ffer passed via 
1a5a0 74 68 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74  the second and t
1a5b0 68 69 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28  hird arguments (
1a5c0 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74  presumably.** st
1a5d0 61 63 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74  ack space). If t
1a5e0 68 65 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20  he former, then 
1a5f0 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1a600 6f 20 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74  o a pointer that
1a610 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76   should.** be ev
1a620 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62  entually freed b
1a630 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69  y the caller usi
1a640 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
1a650 28 29 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a  (). Or, if the .
1a660 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f  ** allocation co
1a670 6d 65 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70  mes from the pSp
1a680 61 63 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66  ace/szSpace buff
1a690 65 72 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73  er, *ppFree is s
1a6a0 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65  et to NULL.** be
1a6b0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1a6c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20  **.** If an OOM 
1a6d0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55  error occurs, NU
1a6e0 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  LL is returned..
1a6f0 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  */.UnpackedRecor
1a700 64 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c  d *sqlite3VdbeAl
1a710 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  locUnpackedRecor
1a720 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  d(.  KeyInfo *pK
1a730 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20  eyInfo,         
1a740 20 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74       /* Descript
1a750 69 6f 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72  ion of the recor
1a760 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70  d */.  char *pSp
1a770 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ace,            
1a780 20 20 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67         /* Unalig
1a790 6e 65 64 20 73 70 61 63 65 20 61 76 61 69 6c 61  ned space availa
1a7a0 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  ble */.  int szS
1a7b0 70 61 63 65 2c 20 20 20 20 20 20 20 20 20 20 20  pace,           
1a7c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1a7d0 20 6f 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20   of pSpace[] in 
1a7e0 62 79 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  bytes */.  char 
1a7f0 2a 2a 70 70 46 72 65 65 20 20 20 20 20 20 20 20  **ppFree        
1a800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
1a810 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64  T: Caller should
1a820 20 66 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74   free this point
1a830 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63  er */.){.  Unpac
1a840 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20  kedRecord *p;   
1a850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a860 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f  packed record to
1a870 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
1a880 20 6e 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20   nOff;          
1a890 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a8a0 49 6e 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65  Increment pSpace
1a8b0 20 62 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67   by nOff to alig
1a8c0 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  n it */.  int nB
1a8d0 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
1a8e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1a8f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 71  ber of bytes req
1a900 75 69 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a  uired for *p */.
1a910 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f  .  /* We want to
1a920 20 73 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74   shift the point
1a930 65 72 20 70 53 70 61 63 65 20 75 70 20 73 75 63  er pSpace up suc
1a940 68 20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62  h that it is 8-b
1a950 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a  yte aligned..  *
1a960 2a 20 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20  * Thus, we need 
1a970 74 6f 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76  to calculate a v
1a980 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77  alue, nOff, betw
1a990 65 65 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20  een 0 and 7, to 
1a9a0 73 68 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62  shift .  ** it b
1a9b0 79 2e 20 20 49 66 20 70 53 70 61 63 65 20 69 73  y.  If pSpace is
1a9c0 20 61 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20   already 8-byte 
1a9d0 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68  aligned, nOff sh
1a9e0 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20  ould be zero..  
1a9f0 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d  */.  nOff = (8 -
1aa00 20 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f   (SQLITE_PTR_TO_
1aa10 49 4e 54 28 70 53 70 61 63 65 29 20 26 20 37 29  INT(pSpace) & 7)
1aa20 29 20 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d  ) & 7;.  nByte =
1aa30 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55   ROUND8(sizeof(U
1aa40 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20  npackedRecord)) 
1aa50 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70  + sizeof(Mem)*(p
1aa60 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1aa70 31 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e  1);.  if( nByte>
1aa80 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a  szSpace+nOff ){.
1aa90 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1aaa0 64 52 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65  dRecord *)sqlite
1aab0 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65  3DbMallocRaw(pKe
1aac0 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65  yInfo->db, nByte
1aad0 29 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d  );.    *ppFree =
1aae0 20 28 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20   (char *)p;.    
1aaf0 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
1ab00 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ab10 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1ab20 6f 72 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66  ord*)&pSpace[nOf
1ab30 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20  f];.    *ppFree 
1ab40 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61  = 0;.  }..  p->a
1ab50 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63  Mem = (Mem*)&((c
1ab60 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73  har*)p)[ROUND8(s
1ab70 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65  izeof(UnpackedRe
1ab80 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72  cord))];.  asser
1ab90 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1aba0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1abb0 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b  p->pKeyInfo = pK
1abc0 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69  eyInfo;.  p->nFi
1abd0 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld = pKeyInfo->
1abe0 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65  nField + 1;.  re
1abf0 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1ac00 20 47 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d   Given the nKey-
1ac10 62 79 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66  byte encoding of
1ac20 20 61 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65   a record in pKe
1ac30 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  y[], populate th
1ac40 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65  e .** UnpackedRe
1ac50 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 20 69  cord structure i
1ac60 6e 64 69 63 61 74 65 64 20 62 79 20 74 68 65 20  ndicated by the 
1ac70 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20  fourth argument 
1ac80 77 69 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74  with the.** cont
1ac90 65 6e 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f  ents of the deco
1aca0 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a  ded record..*/ .
1acb0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1acc0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20  RecordUnpack(.  
1acd0 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1ace0 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d  o,     /* Inform
1acf0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1ad00 72 65 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f  record format */
1ad10 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20  .  int nKey,    
1ad20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1ad30 65 20 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20  e of the binary 
1ad40 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
1ad50 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1ad60 20 20 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79     /* The binary
1ad70 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70   record */.  Unp
1ad80 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20  ackedRecord *p  
1ad90 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
1ada0 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 62  this structure b
1adb0 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
1adc0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
1add0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1ade0 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1adf0 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
1ae00 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33  ;.  int d; .  u3
1ae10 32 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  2 idx;          
1ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ae30 20 4f 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b   Offset in aKey[
1ae40 5d 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  ] to read from *
1ae50 2f 0a 20 20 75 31 36 20 75 3b 20 20 20 20 20 20  /.  u16 u;      
1ae60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae70 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20      /* Unsigned 
1ae80 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  loop counter */.
1ae90 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d    u32 szHdr;.  M
1aea0 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d  em *pMem = p->aM
1aeb0 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c  em;..  p->defaul
1aec0 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65  t_rc = 0;.  asse
1aed0 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
1aee0 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29  LIGNMENT(pMem) )
1aef0 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1af00 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1af10 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b  r);.  d = szHdr;
1af20 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c  .  u = 0;.  whil
1af30 65 28 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20  e( idx<szHdr && 
1af40 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75  d<=nKey ){.    u
1af50 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1af60 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56  .    idx += getV
1af70 61 72 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64  arint32(&aKey[id
1af80 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  x], serial_type)
1af90 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20  ;.    pMem->enc 
1afa0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1afb0 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20  .    pMem->db = 
1afc0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1afd0 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73    /* pMem->flags
1afe0 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33   = 0; // sqlite3
1aff0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b000 77 69 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f  will set this fo
1b010 72 20 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  r us */.    pMem
1b020 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a  ->szMalloc = 0;.
1b030 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b      pMem->z = 0;
1b040 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65  .    d += sqlite
1b050 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1b060 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f  aKey[d], serial_
1b070 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20  type, pMem);.   
1b080 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28   pMem++;.    if(
1b090 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c   (++u)>=p->nFiel
1b0a0 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20  d ) break;.  }. 
1b0b0 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79   assert( u<=pKey
1b0c0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1b0d0 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20   );.  p->nField 
1b0e0 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  = u;.}..#if SQLI
1b0f0 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54  TE_DEBUG./*.** T
1b100 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d  his function com
1b110 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20  pares two index 
1b120 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20  or table record 
1b130 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65  keys in the same
1b140 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73   way.** as the s
1b150 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1b160 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e  Compare() routin
1b170 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65  e. Unlike VdbeRe
1b180 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a  cordCompare(),.*
1b190 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
1b1a0 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64  deserializes and
1b1b0 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73   compares values
1b1c0 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71   using the.** sq
1b1d0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b1e0 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  et() and sqlite3
1b1f0 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e  MemCompare() fun
1b200 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73  ctions. It is us
1b210 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  ed.** in assert(
1b220 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
1b230 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
1b240 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69  optimized code i
1b250 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  n.** sqlite3Vdbe
1b260 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1b270 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20  returns results 
1b280 77 69 74 68 20 74 68 65 73 65 20 74 77 6f 20 70  with these two p
1b290 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a  rimitives..**.**
1b2a0 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
1b2b0 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  the result of co
1b2c0 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69  mparison is equi
1b2d0 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65  valent to desire
1b2e0 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75  dResult..** Retu
1b2f0 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68 65 72  rn false if ther
1b300 65 20 69 73 20 61 20 64 69 73 61 67 72 65 65 6d  e is a disagreem
1b310 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1b320 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1b330 70 61 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74  pareDebug(.  int
1b340 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1b350 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1b360 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  ft key */.  cons
1b370 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  t UnpackedRecord
1b380 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67   *pPKey2, /* Rig
1b390 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1b3a0 64 65 73 69 72 65 64 52 65 73 75 6c 74 20 20 20  desiredResult   
1b3b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72            /* Cor
1b3c0 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29  rect answer */.)
1b3d0 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20 20  {.  u32 d1;     
1b3e0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b3f0 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20   into aKey[] of 
1b400 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e  next data elemen
1b410 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  t */.  u32 idx1;
1b420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b430 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b440 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72 20 65  of next header e
1b450 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1b460 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f  szHdr1;        /
1b470 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1b480 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20  s in header */. 
1b490 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e   int i = 0;.  in
1b4a0 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  t rc = 0;.  cons
1b4b0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1b4c0 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1b4d0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1b4e0 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f  pKey1;.  KeyInfo
1b4f0 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65   *pKeyInfo;.  Me
1b500 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49  m mem1;..  pKeyI
1b510 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1b520 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b  eyInfo;.  if( pK
1b530 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20  eyInfo->db==0 ) 
1b540 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31  return 1;.  mem1
1b550 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1b560 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20  >enc;.  mem1.db 
1b570 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a  = pKeyInfo->db;.
1b580 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20    /* mem1.flags 
1b590 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65  = 0;  // Will be
1b5a0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20   initialized by 
1b5b0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1b5c0 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f  lGet() */.  VVA_
1b5d0 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  ONLY( mem1.szMal
1b5e0 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e  loc = 0; ) /* On
1b5f0 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61 73 73  ly needed by ass
1b600 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b610 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c   */..  /* Compil
1b620 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e  ers may complain
1b630 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69   that mem1.u.i i
1b640 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e  s potentially un
1b650 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
1b660 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69  * We could initi
1b670 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f  alize it, as sho
1b680 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65  wn here, to sile
1b690 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61  nce those compla
1b6a0 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69  ints..  ** But i
1b6b0 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69  n fact, mem1.u.i
1b6c0 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75   will never actu
1b6d0 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69  ally be used uni
1b6e0 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20  nitialized, and 
1b6f0 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20  doing .  ** the 
1b700 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74  unnecessary init
1b710 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61  ialization has a
1b720 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61   measurable nega
1b730 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65  tive performance
1b740 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69  .  ** impact, si
1b750 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nce this routine
1b760 20 69 73 20 61 20 76 65 72 79 20 68 69 67 68 20   is a very high 
1b770 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c  runner.  And so,
1b780 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20   we choose.  ** 
1b790 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f  to ignore the co
1b7a0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20  mpiler warnings 
1b7b0 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73 20 76  and leave this v
1b7c0 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61  ariable uninitia
1b7d0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a  lized..  */.  /*
1b7e0 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20    mem1.u.i = 0; 
1b7f0 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20   // not needed, 
1b800 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20  here to silence 
1b810 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1b820 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20   */.  .  idx1 = 
1b830 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1b840 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66  1, szHdr1);.  if
1b850 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29  ( szHdr1>98307 )
1b860 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1b870 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73  ORRUPT;.  d1 = s
1b880 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
1b890 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1b8a0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1b8b0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1b8c0 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
1b8d0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1b8e0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1b8f0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1b900 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1b910 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1b920 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1b930 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1b940 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1b950 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
1b960 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
1b970 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
1b980 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
1b990 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
1b9a0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
1b9b0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
1b9c0 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
1b9d0 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
1b9e0 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
1b9f0 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
1ba00 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
1ba10 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
1ba20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
1ba30 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
1ba40 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
1ba50 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
1ba60 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
1ba70 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
1ba80 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
1ba90 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
1baa0 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
1bab0 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
1bac0 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
1bad0 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
1bae0 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
1baf0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1bb00 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
1bb10 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
1bb20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1bb30 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1bb40 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
1bb50 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
1bb60 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1bb70 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
1bb80 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
1bb90 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
1bba0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
1bbb0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
1bbc0 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
1bbd0 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
1bbe0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1bbf0 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1bc00 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
1bc10 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
1bc20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
1bc30 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
1bc40 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
1bc50 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
1bc60 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
1bc70 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
1bc80 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
1bc90 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1bca0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1bcb0 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
1bcc0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
1bcd0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
1bce0 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
1bcf0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1bd00 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
1bd10 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
1bd20 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
1bd30 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
1bd40 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
1bd50 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
1bd60 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
1bd70 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
1bd80 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1bd90 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1bda0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1bdb0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1bdc0 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1bdd0 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1bde0 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1bdf0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1be00 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1be10 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1be20 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1be30 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1be40 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1be50 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
1be60 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1be70 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1be80 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1be90 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1bea0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1beb0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1bec0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1bed0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1bee0 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1bef0 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1bf00 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1bf10 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
1bf20 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1bf30 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
1bf40 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
1bf50 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
1bf60 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
1bf70 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
1bf80 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
1bf90 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1bfa0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
1bfb0 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
1bfc0 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
1bfd0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
1bfe0 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
1bff0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
1c000 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
1c010 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
1c020 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1c030 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
1c040 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
1c050 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
1c060 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
1c070 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
1c080 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
1c090 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
1c0a0 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
1c0b0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1c0c0 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
1c0d0 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
1c0e0 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49  ->nField + pKeyI
1c0f0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a  nfo->nXField..**
1c100 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73  .** If this cons
1c110 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61  traint is not sa
1c120 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e  tisfied, it mean
1c130 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d  s that the high-
1c140 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63  speed.** vdbeRec
1c150 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
1c160 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f  and vdbeRecordCo
1c170 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f  mpareString() ro
1c180 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  utines will.** n
1c190 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
1c1a0 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65  y.  If this asse
1c1b0 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c  rt() ever fires,
1c1c0 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61   it probably mea
1c1d0 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b  ns.** that the K
1c1e0 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72  eyInfo.nField or
1c1f0 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
1c200 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d   values were com
1c210 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65  puted.** incorre
1c220 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
1c230 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46  void vdbeAssertF
1c240 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1c250 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65  imits(.  int nKe
1c260 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
1c270 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65  Key,   /* The re
1c280 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a  cord to verify *
1c290 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  / .  const KeyIn
1c2a0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1c2b0 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69     /* Compare si
1c2c0 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79  ze with this Key
1c2d0 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Info */.){.  int
1c2e0 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75   nField = 0;.  u
1c2f0 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20  32 szHdr;.  u32 
1c300 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73  idx;.  u32 notUs
1c310 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ed;.  const unsi
1c320 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1c330 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1c340 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20  d char*)pKey;.. 
1c350 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1c360 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20  ) return;.  idx 
1c370 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1c380 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73  ey, szHdr);.  as
1c390 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b  sert( nKey>=0 );
1c3a0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72  .  assert( szHdr
1c3b0 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20  <=(u32)nKey );. 
1c3c0 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1c3d0 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20  r ){.    idx += 
1c3e0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c3f0 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a  +idx, notUsed);.
1c400 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20      nField++;.  
1c410 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  }.  assert( nFie
1c420 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld <= pKeyInfo->
1c430 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
1c440 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  >nXField );.}.#e
1c450 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1c460 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1c470 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1c480 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1c490 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1c4a0 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1c4b0 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1c4c0 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1c4d0 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1c4e0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1c4f0 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1c500 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1c510 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1c520 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1c530 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1c540 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1c550 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1c560 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1c570 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1c580 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1c590 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1c5a0 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1c5b0 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1c5c0 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1c5d0 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1c5e0 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1c5f0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1c600 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1c610 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1c620 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1c630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1c640 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1c650 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1c660 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1c670 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1c680 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1c690 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1c6a0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1c6b0 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1c6c0 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1c6d0 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1c6e0 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1c6f0 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1c700 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1c710 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1c720 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1c730 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1c740 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1c750 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1c760 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69   *v1, *v2;.    i
1c770 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d  nt n1, n2;.    M
1c780 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1c790 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1c7a0 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1c7b0 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1c7c0 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1c7d0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1c7e0 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1c7f0 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1c800 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1c810 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1c820 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1c830 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1c840 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1c850 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1c860 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1c870 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1c880 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1c890 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1c8a0 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20     n1 = v1==0 ? 
1c8b0 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32  0 : c1.n;.    v2
1c8c0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1c8d0 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1c8e0 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1c8f0 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76  enc);.    n2 = v
1c900 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
1c910 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d  .    rc = pColl-
1c920 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1c930 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20  er, n1, v1, n2, 
1c940 76 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  v2);.    if( (v1
1c950 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26  ==0 || v2==0) &&
1c960 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1c970 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1c980 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74  _BKPT;.    sqlit
1c990 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1c9a0 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&c1);.    sqlit
1c9b0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1c9c0 28 26 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72  (&c2);.    retur
1c9d0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
1c9e0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
1c9f0 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
1ca00 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1ca10 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1ca20 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
1ca30 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1ca40 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1ca50 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
1ca60 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
1ca70 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
1ca80 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
1ca90 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
1caa0 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
1cab0 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  sor..*/.static S
1cac0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
1cad0 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
1cae0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1caf0 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
1cb00 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d  *pB2){.  int c =
1cb10 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1cb20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70  pB2->z, pB1->n>p
1cb30 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a  B2->n ? pB2->n :
1cb40 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20   pB1->n);.  if( 
1cb50 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1cb60 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20  return pB1->n - 
1cb70 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pB2->n;.}../*.**
1cb80 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   Do a comparison
1cb90 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69   between a 64-bi
1cba0 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
1cbb0 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c   and a 64-bit fl
1cbc0 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20  oating-point.** 
1cbd0 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
1cbe0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1cbf0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1cc00 68 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69  he first (i64) i
1cc10 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20  s less than,.** 
1cc20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1cc30 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1cc40 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a  cond (double)..*
1cc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1cc60 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1cc70 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c  are(i64 i, doubl
1cc80 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65  e r){.  if( size
1cc90 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59  of(LONGDOUBLE_TY
1cca0 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e  PE)>8 ){.    LON
1ccb0 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d  GDOUBLE_TYPE x =
1ccc0 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50   (LONGDOUBLE_TYP
1ccd0 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72  E)i;.    if( x<r
1cce0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1ccf0 20 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75    if( x>r ) retu
1cd00 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  rn +1;.    retur
1cd10 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
1cd20 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75    i64 y;.    dou
1cd30 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72  ble s;.    if( r
1cd40 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  <-92233720368547
1cd50 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e  75808.0 ) return
1cd60 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39   +1;.    if( r>9
1cd70 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1cd80 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  07.0 ) return -1
1cd90 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72  ;.    y = (i64)r
1cda0 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20  ;.    if( i<y ) 
1cdb0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1cdc0 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20  f( i>y ){.      
1cdd0 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f  if( y==SMALLEST_
1cde0 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29  INT64 && r>0.0 )
1cdf0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1ce00 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20    return +1;.   
1ce10 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62   }.    s = (doub
1ce20 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c  le)i;.    if( s<
1ce30 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1ce40 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74     if( s>r ) ret
1ce50 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1ce60 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
1ce70 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1ce80 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1ce90 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1cea0 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1ceb0 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1cec0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1ced0 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1cee0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1cef0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1cf00 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1cf10 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1cf20 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1cf30 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1cf40 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1cf50 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1cf60 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1cf70 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1cf80 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1cf90 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1cfa0 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1cfb0 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1cfc0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1cfd0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1cfe0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1cff0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1d000 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1d010 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1d020 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1d030 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1d040 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1d050 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1d060 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1d070 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1d080 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1d090 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1d0a0 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1d0b0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1d0c0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1d0d0 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
1d0e0 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
1d0f0 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
1d100 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1d110 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1d120 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1d130 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1d140 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1d150 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1d160 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1d170 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1d180 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1d190 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1d1a0 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1d1b0 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   At least one of
1d1c0 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
1d1d0 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f  is a number.  */
1d1e0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1d1f0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1d200 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1d210 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1d220 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1d230 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1d240 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
1d250 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d260 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1d270 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
1d280 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d290 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1d2a0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  }.    if( (f1 & 
1d2b0 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d  f2 & MEM_Real)!=
1d2c0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1d2d0 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d  Mem1->u.r < pMem
1d2e0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1d2f0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1d300 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32  em1->u.r > pMem2
1d310 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b  ->u.r ) return +
1d320 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1d330 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1d340 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1d350 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1d360 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  2&MEM_Real)!=0 )
1d370 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1d380 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1d390 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75  Compare(pMem1->u
1d3a0 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b  .i, pMem2->u.r);
1d3b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d3c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1d3d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d3e0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1d3f0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1d400 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1d410 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1d420 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49  return -sqlite3I
1d430 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1d440 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31  Mem2->u.i, pMem1
1d450 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1d460 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1d470 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1d480 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1d490 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   +1;.  }..  /* I
1d4a0 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1d4b0 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1d4c0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1d4d0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1d4e0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1d4f0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1d500 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1d510 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1d520 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1d530 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1d540 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1d550 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1d560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1d570 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1d580 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1d590 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1d5a0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d5b0 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1d5c0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1d5d0 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e  ->enc || pMem1->
1d5e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1d5f0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1d600 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d610 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1d620 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1d630 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1d640 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1d650 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1d660 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1d670 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d680 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1d690 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1d6a0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1d6b0 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1d6c0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1d6d0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1d6e0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
1d6f0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
1d700 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
1d710 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
1d720 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
1d730 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
1d740 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
1d750 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1d760 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1d770 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1d780 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
1d790 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
1d7a0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
1d7b0 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
1d7c0 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
1d7d0 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
1d7e0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
1d7f0 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
1d800 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
1d810 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
1d820 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
1d830 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
1d840 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
1d850 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
1d860 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
1d870 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
1d880 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
1d890 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1d8a0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1d8b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d8c0 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
1d8d0 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1d8e0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
1d8f0 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
1d900 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
1d910 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
1d920 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
1d930 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1d940 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
1d950 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
1d960 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
1d970 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
1d980 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
1d990 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1d9a0 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
1d9b0 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
1d9c0 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
1d9d0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
1d9e0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
1d9f0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
1da00 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
1da10 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1da20 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
1da30 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
1da40 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
1da50 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
1da60 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1da70 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
1da80 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
1da90 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1daa0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1dab0 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
1dac0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1dad0 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
1dae0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1daf0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1db00 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
1db10 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1db20 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
1db30 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1db40 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1db50 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1db60 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1db70 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
1db80 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1db90 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
1dba0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1dbb0 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
1dbc0 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
1dbd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1dbe0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
1dbf0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1dc00 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1dc10 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
1dc20 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1dc30 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1dc40 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1dc50 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1dc60 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
1dc70 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1dc80 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1dc90 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1dca0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
1dcb0 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
1dcc0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
1dcd0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1dce0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
1dcf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1dd00 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
1dd10 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
1dd20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1dd30 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
1dd40 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
1dd50 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
1dd60 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
1dd70 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
1dd80 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
1dd90 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
1dda0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1ddb0 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
1ddc0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1ddd0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
1dde0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
1ddf0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
1de00 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
1de10 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
1de20 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
1de30 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1de40 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
1de50 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
1de60 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
1de70 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
1de80 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
1de90 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
1dea0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1deb0 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
1dec0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
1ded0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1dee0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1def0 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
1df00 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1df10 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1df20 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1df30 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
1df40 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
1df50 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1df60 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
1df70 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
1df80 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
1df90 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
1dfa0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
1dfb0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1dfc0 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
1dfd0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
1dfe0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1dff0 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
1e000 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
1e010 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
1e020 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
1e030 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
1e040 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
1e050 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
1e060 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
1e070 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1e080 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
1e090 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1e0a0 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
1e0b0 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
1e0c0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
1e0d0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e0e0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
1e0f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1e100 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
1e110 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1e120 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1e130 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1e140 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1e150 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1e160 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1e170 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1e180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e190 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1e1a0 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1e1b0 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1e1c0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e1e0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1e1f0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1e200 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1e210 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1e220 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e230 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
1e240 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
1e250 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1e280 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
1e290 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
1e2a0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
1e2b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1e2c0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
1e2d0 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
1e2e0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1e310 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
1e320 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
1e330 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1e340 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
1e350 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
1e360 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1e370 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1e380 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
1e390 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1e3a0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1e3b0 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1e3c0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1e3d0 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
1e3e0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
1e3f0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1e400 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
1e410 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
1e420 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1e430 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1e440 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
1e450 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
1e460 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
1e470 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
1e480 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
1e490 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
1e4a0 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
1e4b0 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
1e4c0 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
1e4d0 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
1e4e0 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
1e4f0 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
1e500 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
1e510 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
1e520 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1e530 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
1e540 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
1e550 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
1e560 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1e570 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
1e580 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
1e590 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
1e5a0 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
1e5b0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1e5c0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1e5d0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1e5e0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1e5f0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1e600 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
1e610 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28    }..  VVA_ONLY(
1e620 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1e630 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1e640 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1e650 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1e660 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e670 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1e680 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1e690 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1e6a0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1e6b0 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1e6c0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1e6d0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e6e0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1e6f0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1e700 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1e710 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1e720 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1e730 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1e740 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1e750 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1e760 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1e770 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1e780 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1e790 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1e7a0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1e7b0 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1e7c0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1e7d0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1e7e0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1e7f0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1e800 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1e810 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1e820 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1e830 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1e840 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e850 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1e860 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e870 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1e880 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1e890 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1e8a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71          rc = -sq
1e8b0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1e8c0 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20  pare(pRhs->u.i, 
1e8d0 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20  mem1.u.r);.     
1e8e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e8f0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1e900 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1e910 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1e920 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1e930 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1e940 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1e950 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1e960 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1e970 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e980 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1e990 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1e9a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e9b0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1e9c0 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1e9d0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1e9e0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1e9f0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1ea00 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1ea10 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1ea20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1ea30 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
1ea40 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
1ea50 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
1ea60 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
1ea70 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
1ea80 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
1ea90 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
1eaa0 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
1eab0 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
1eac0 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
1ead0 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
1eae0 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
1eaf0 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
1eb00 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
1eb10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
1eb20 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
1eb30 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
1eb40 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1eb50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1eb60 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1eb70 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1eb80 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1eb90 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1eba0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1ebb0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1ebc0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1ebd0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1ebe0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1ebf0 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
1ec00 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  <pRhs->u.r ){.  
1ec10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1ec20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
1ec30 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
1ec40 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
1ec50 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1ec60 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ec70 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ec80 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1ec90 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1eca0 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68  re(mem1.u.i, pRh
1ecb0 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20  s->u.r);.       
1ecc0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1ecd0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1ece0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
1ecf0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1ed00 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1ed10 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1ed20 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1ed30 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1ed40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ed50 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1ed60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1ed70 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1ed80 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1ed90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1eda0 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1edb0 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1edc0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1edd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1ede0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
1edf0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1ee00 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ee10 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
1ee20 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1ee30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1ee40 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
1ee50 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1ee60 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1ee70 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
1ee80 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1ee90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1eea0 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1eeb0 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1eec0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1eed0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1eee0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1eef0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1ef00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1ef10 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1ef20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1ef30 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1ef40 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1ef50 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1ef60 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1ef70 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1ef80 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1ef90 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1efa0 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1efb0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1efc0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1efd0 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
1efe0 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
1eff0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1f000 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
1f010 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
1f020 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1f030 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1f040 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
1f050 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1f060 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1f070 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1f080 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1f090 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1f0a0 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
1f0b0 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
1f0c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f0d0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1f0e0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
1f0f0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1f100 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1f110 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1f120 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1f130 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1f140 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1f150 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1f160 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1f170 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
1f180 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
1f190 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1f1a0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1f1b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1f1c0 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
1f1d0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1f1e0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f1f0 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
1f200 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f210 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1f220 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
1f230 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f240 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f250 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
1f260 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1f270 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1f280 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1f290 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f2a0 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1f2b0 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f2c0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1f2d0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f2e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1f2f0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1f300 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
1f310 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1f320 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1f330 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1f340 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1f350 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
1f360 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
1f370 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1f380 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1f390 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
1f3a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
1f3b0 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1f3c0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
1f3d0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
1f3e0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
1f3f0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1f400 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1f410 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1f420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1f430 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1f440 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1f450 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1f460 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1f470 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20  Key2, rc) );.   
1f480 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1f490 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1f4a0 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1f4b0 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1f4c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1f4d0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1f4e0 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1f4f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1f500 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1f510 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1f520 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1f530 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1f540 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1f550 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1f560 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1f570 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1f580 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1f590 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1f5a0 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1f5b0 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1f5c0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1f5d0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1f5e0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1f5f0 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1f600 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1f610 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1f620 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1f630 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1f640 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1f650 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
1f660 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1f670 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1f680 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1f690 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
1f6a0 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
1f6b0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1f6c0 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1f6d0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1f6e0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1f6f0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1f700 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1f710 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
1f720 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1f730 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
1f740 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1f750 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1f760 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
1f770 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
1f780 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d      || pKeyInfo-
1f790 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1f7a0 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d  d.  );.  pPKey2-
1f7b0 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72  >eqSeen = 1;.  r
1f7c0 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1f7d0 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20  fault_rc;.}.int 
1f7e0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f7f0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
1f800 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1f810 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1f820 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1f830 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1f840 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2          /* 
1f850 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1f860 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1f870 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f880 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1f890 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f8a0 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
1f8b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1f8c0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1f8d0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1f8e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1f8f0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1f900 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1f910 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
1f920 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
1f930 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
1f940 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
1f950 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1f960 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1f970 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
1f980 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
1f990 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
1f9a0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
1f9b0 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
1f9c0 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
1f9d0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
1f9e0 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
1f9f0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
1fa00 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
1fa10 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
1fa20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
1fa30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1fa40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1fa50 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1fa60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1fa70 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1fa80 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1fa90 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1faa0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1fab0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1fac0 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
1fad0 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
1fae0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
1faf0 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
1fb00 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
1fb10 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
1fb20 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
1fb30 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
1fb40 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d   i64 v = pPKey2-
1fb50 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
1fb60 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
1fb70 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1fb80 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
1fb90 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1fba0 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
1fbb0 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
1fbc0 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
1fbd0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
1fbe0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1fbf0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1fc00 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
1fc10 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1fc20 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
1fc30 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1fc40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fc50 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1fc60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fc70 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-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 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_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 33 3a 20 7b 20  }.    case 3: { 
1fcf0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-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 48 52 45 45 5f 42 59    lhs = THREE_BY
1fd20 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1fd30 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1fd40 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1fd50 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fd60 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1fd70 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1fd80 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
1fd90 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1fda0 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
1fdb0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1fdc0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1fdd0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1fde0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1fdf0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1fe00 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1fe10 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1fe20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1fe30 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
1fe40 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1fe50 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1fe60 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1fe70 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1fe80 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fe90 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
1fea0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1feb0 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
1fec0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1fed0 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
1fee0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1fef0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1ff00 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
1ff10 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
1ff20 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1ff30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ff40 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
1ff50 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
1ff60 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ff70 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
1ff80 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
1ff90 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
1ffa0 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
1ffb0 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
1ffc0 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
1ffd0 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
1ffe0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
1fff0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
20000 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
20010 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
20020 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
20030 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
20040 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
20050 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
20060 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
20070 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
20080 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
20090 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
200a0 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
200b0 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
200c0 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
200d0 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
200e0 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
200f0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
20100 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
20110 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
20120 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
20130 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
20140 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
20150 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20160 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
20170 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
20180 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
20190 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
201a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
201b0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
201c0 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  PKey2);.  }..  i
201d0 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20  f( v>lhs ){.    
201e0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
201f0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c  ;.  }else if( v<
20200 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
20210 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d   pPKey2->r2;.  }
20220 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
20230 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
20240 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
20250 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
20260 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
20270 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69  Compare the trai
20280 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65  ling .    ** fie
20290 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73  lds.  */.    res
202a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
202b0 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
202c0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
202d0 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
202e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
202f0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
20300 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
20310 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65  re equal and the
20320 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69  re are no traili
20330 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  ng.    ** fields
20340 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d  . Return pPKey2-
20350 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74  >default_rc in t
20360 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  his case. */.   
20370 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
20380 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70  efault_rc;.    p
20390 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
203a0 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  1;.  }..  assert
203b0 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
203c0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
203d0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
203e0 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  es) );.  return 
203f0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  res;.}../*.** Th
20400 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
20410 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
20420 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
20430 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
20440 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
20450 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
20460 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74  f pPKey2 is a st
20470 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74  ring, that (b) t
20480 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a  he first field.*
20490 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  * uses the colla
204a0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
204b0 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61  NARY and (c) tha
204c0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
204d0 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20  ader varint .** 
204e0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
204f0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
20500 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
20510 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yte..*/.static i
20520 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
20530 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e  pareString(.  in
20540 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
20550 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
20560 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
20570 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
20580 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
20590 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
205a0 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
205b0 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
205c0 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
205d0 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
205e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  ;..  assert( pPK
205f0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  ey2->aMem[0].fla
20600 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
20610 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
20620 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
20630 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
20640 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20650 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33  o);.  getVarint3
20660 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72  2(&aKey1[1], ser
20670 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28  ial_type);.  if(
20680 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
20690 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
206a0 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a  ey2->r1;      /*
206b0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
206c0 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20  s a number or a 
206d0 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  null */.  }else 
206e0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
206f0 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20  e & 0x01) ){ .  
20700 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20710 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r2;      /* (pKe
20720 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62  y1/nKey1) is a b
20730 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  lob */.  }else{.
20740 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20      int nCmp;.  
20750 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20    int nStr;.    
20760 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79  int szHdr = aKey
20770 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20  1[0];..    nStr 
20780 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
20790 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20  2) / 2;.    if( 
207a0 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e  (szHdr + nStr) >
207b0 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20   nKey1 ){.      
207c0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
207d0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
207e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
207f0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
20800 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
20810 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20     }.    nCmp = 
20820 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  MIN( pPKey2->aMe
20830 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a  m[0].n, nStr );.
20840 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
20850 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20  (&aKey1[szHdr], 
20860 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
20870 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69  z, nCmp);..    i
20880 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
20890 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20     res = nStr - 
208a0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
208b0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  n;.      if( res
208c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
208d0 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
208e0 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
208f0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
20900 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
20910 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
20920 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
20930 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20940 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
20950 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20960 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _rc;.          p
20970 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
20980 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
20990 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
209a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  >0 ){.        re
209b0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
209c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
209d0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
209e0 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20  2->r1;.      }. 
209f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
20a00 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >0 ){.      res 
20a10 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
20a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20a30 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20a40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
20a50 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
20a60 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
20a70 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20a80 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c  2, res).       |
20a90 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20  | CORRUPT_DB.   
20aa0 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70      || pPKey2->p
20ab0 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
20ac0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
20ad0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
20ae0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
20af0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
20b00 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
20b10 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62  mpare() compatib
20b20 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73  le function.** s
20b30 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70  uitable for comp
20b40 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  aring serialized
20b50 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
20b60 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
20b70 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
20b80 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
20b90 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  */.RecordCompare
20ba0 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
20bb0 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64  Compare(Unpacked
20bc0 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a  Record *p){.  /*
20bd0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
20be0 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61  pareInt() and va
20bf0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
20c00 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61  eString() both a
20c10 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20  ssume.  ** that 
20c20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
20c30 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f  er varint that o
20c40 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61  ccurs at the sta
20c50 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72  rt of each recor
20c60 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61  d.  ** fits in a
20c70 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e   single byte (i.
20c80 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73  e. is 127 or les
20c90 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64  s). varintRecord
20ca0 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a  CompareInt().  *
20cb0 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  * also assumes t
20cc0 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
20cd0 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66  o overread a buf
20ce0 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20  fer by at least 
20cf0 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75  the .  ** maximu
20d00 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c  m possible legal
20d10 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75   header size plu
20d20 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75  s 8 bytes. Becau
20d30 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  se there is.  **
20d40 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
20d50 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62  e at least 74 (b
20d60 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65  ut not 136) byte
20d70 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c  s of padding fol
20d80 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a  lowing each.  **
20d90 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
20da0 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  o varintRecordCo
20db0 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20  mpareInt() this 
20dc0 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69  makes it conveni
20dd0 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69  ent to.  ** limi
20de0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
20df0 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62  e header to 64 b
20e00 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68  ytes in cases wh
20e10 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69  ere the first fi
20e20 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69  eld.  ** is an i
20e30 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  nteger..  **.  *
20e40 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61  * The easiest wa
20e50 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69  y to enforce thi
20e60 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f  s limit is to co
20e70 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f  nsider only reco
20e80 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33  rds with.  ** 13
20e90 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e   fields or less.
20ea0 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69   If the first fi
20eb0 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65  eld is an intege
20ec0 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c  r, the maximum l
20ed0 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  egal.  ** header
20ee0 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b   size is (12*5 +
20ef0 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20   1 + 1) bytes.  
20f00 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65  */.  if( (p->pKe
20f10 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
20f20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  p->pKeyInfo->nXF
20f30 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20  ield)<=13 ){.   
20f40 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e   int flags = p->
20f50 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20  aMem[0].flags;. 
20f60 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e     if( p->pKeyIn
20f70 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
20f80 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  ] ){.      p->r1
20f90 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
20fa0 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
20fb0 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
20fc0 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
20fd0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
20fe0 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
20ff0 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
21000 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
21010 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
21020 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
21030 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
21040 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21050 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
21060 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
21070 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
21080 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
21090 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
210a0 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
210b0 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e  Blob))==0 && p->
210c0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
210d0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  0]==0 ){.      a
210e0 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d  ssert( flags & M
210f0 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20  EM_Str );.      
21100 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
21110 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a  dCompareString;.
21120 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
21130 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
21140 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a  ecordCompare;.}.
21150 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
21160 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
21170 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
21180 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
21190 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
211a0 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
211b0 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
211c0 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
211d0 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
211e0 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
211f0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
21200 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
21210 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
21220 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
21230 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
21240 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
21250 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
21260 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
21270 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
21280 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
21290 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
212a0 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
212b0 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
212c0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
212d0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
212e0 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
212f0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
21300 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
21310 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
21320 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
21330 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
21340 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
21350 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
21360 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
21370 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
21380 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
21390 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
213a0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
213b0 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
213c0 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
213d0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
213e0 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
213f0 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
21400 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
21410 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
21420 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
21430 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
21440 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
21450 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
21460 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
21470 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
21480 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
21490 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
214a0 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
214b0 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
214c0 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
214d0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
214e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
214f0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
21500 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
21510 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
21520 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
21530 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
21540 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21550 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75  OK );     /* pCu
21560 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
21570 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
21580 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73  not fail */.  as
21590 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
215a0 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
215b0 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
215c0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
215d0 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
215e0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
215f0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
21600 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
21610 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
21620 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
21630 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
21640 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
21650 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
21660 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
21670 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
21680 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72  * The index entr
21690 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74  y must begin wit
216a0 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20  h a header size 
216b0 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
216c0 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
216d0 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63   szHdr);.  testc
216e0 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b  ase( szHdr==3 );
216f0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
21700 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28  dr==m.n );.  if(
21710 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c   unlikely(szHdr<
21720 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e  3 || (int)szHdr>
21730 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  m.n) ){.    goto
21740 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
21750 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
21760 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20   The last field 
21770 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f  of the index sho
21780 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
21790 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20  r - the ROWID.. 
217a0 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   ** Verify that 
217b0 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72  the last entry r
217c0 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65  eally is an inte
217d0 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29  ger. */.  (void)
217e0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
217f0 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  )&m.z[szHdr-1], 
21800 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
21810 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21820 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  d==1 );.  testca
21830 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32  se( typeRowid==2
21840 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21850 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a  typeRowid==3 );.
21860 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21870 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65  Rowid==4 );.  te
21880 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21890 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61  d==5 );.  testca
218a0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36  se( typeRowid==6
218b0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
218c0 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a  typeRowid==8 );.
218d0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
218e0 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66  Rowid==9 );.  if
218f0 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52  ( unlikely(typeR
21900 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f  owid<1 || typeRo
21910 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77  wid>9 || typeRow
21920 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f  id==7) ){.    go
21930 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
21940 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c  ruption;.  }.  l
21950 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
21960 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
21970 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65  typeRowid];.  te
21980 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
21990 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
219a0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
219b0 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
219c0 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
219d0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
219e0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
219f0 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
21a00 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
21a10 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
21a20 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
21a30 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
21a40 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
21a50 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
21a60 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
21a70 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
21a80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
21a90 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
21aa0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21ab0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
21ac0 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
21ad0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
21ae0 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
21af0 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
21b00 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
21b10 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
21b20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21b30 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
21b40 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
21b50 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f  tcase( m.szMallo
21b60 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
21b70 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
21b80 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
21b90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21ba0 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
21bb0 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
21bc0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
21bd0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
21be0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
21bf0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
21c00 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
21c10 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
21c20 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
21c30 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
21c40 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
21c50 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
21c60 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
21c70 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
21c80 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
21c90 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
21ca0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
21cb0 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
21cc0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
21cd0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
21ce0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
21cf0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
21d00 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
21d10 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
21d20 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
21d30 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
21d40 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
21d50 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
21d60 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
21d70 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
21d80 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
21d90 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
21da0 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
21db0 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
21dc0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
21dd0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
21de0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71  KeyCompare(.  sq
21df0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
21e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21e10 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
21e20 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43  ction */.  VdbeC
21e30 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
21e40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21e50 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
21e60 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
21e70 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
21e80 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20   *pUnpacked,    
21e90 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76     /* Unpacked v
21ea0 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f  ersion of key */
21eb0 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
21ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21ed0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
21ee0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
21ef0 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
21f00 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
21f10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
21f20 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
21f30 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74  Mem m;..  assert
21f40 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
21f50 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
21f60 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63  .  pCur = pC->uc
21f70 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65  .pCursor;.  asse
21f80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21f90 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
21fa0 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
21fb0 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
21fc0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
21fd0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
21fe0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
21ff0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
22000 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
22010 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
22020 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
22030 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
22040 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
22050 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
22060 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
22070 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74  he way.  ** that
22080 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
22090 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
220a0 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
220b0 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
220c0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
220d0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
220e0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
220f0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
22100 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
22110 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
22120 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
22130 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
22140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
22150 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
22160 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
22170 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
22180 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
22190 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
221a0 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
221b0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
221c0 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
221d0 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
221e0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
221f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
22200 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
22210 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
22220 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
22230 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
22240 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
22250 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
22260 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
22270 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
22280 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
22290 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
222a0 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
222b0 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
222c0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
222d0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
222e0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
222f0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
22300 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
22310 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
22320 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
22330 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
22340 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
22350 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
22360 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
22370 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
22380 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
22390 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
223a0 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
223b0 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
223c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
223d0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
223e0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
223f0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
22400 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
22410 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
22420 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
22430 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
22440 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
22450 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
22460 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
22470 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
22480 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
22490 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
224a0 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
224b0 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
224c0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
224d0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
224e0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
224f0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
22500 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
22510 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
22520 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
22530 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
22540 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
22550 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
22560 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
22570 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
22580 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
22590 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
225a0 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
225b0 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
225c0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
225d0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
225e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
225f0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
22600 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
22610 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
22620 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
22630 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
22640 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
22650 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22660 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
22670 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
22680 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
22690 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
226a0 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
226b0 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
226c0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
226d0 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
226e0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
226f0 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
22700 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
22710 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
22720 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
22730 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
22740 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
22750 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
22760 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
22770 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
22780 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
22790 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
227a0 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
227b0 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
227c0 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
227d0 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
227e0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
227f0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
22800 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
22810 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
22820 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
22830 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
22840 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
22850 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
22860 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22870 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
22880 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
22890 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
228a0 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
228b0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
228c0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
228d0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
228e0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
228f0 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
22900 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
22910 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22920 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20  return pRet;.   
22930 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22940 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  0;.}../*.** Conf
22950 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62  igure SQL variab
22960 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20  le iVar so that 
22970 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61  binding a new va
22980 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c  lue to it signal
22990 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  s.** to sqlite3_
229a0 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61  reoptimize() tha
229b0 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74  t re-preparing t
229c0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  he statement may
229d0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20   result.** in a 
229e0 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61  better query pla
229f0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
22a00 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
22a10 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
22a20 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ar){.  assert( i
22a30 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  Var>0 );.  if( i
22a40 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d  Var>32 ){.    v-
22a50 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66  >expmask = 0xfff
22a60 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fffff;.  }else{.
22a70 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c      v->expmask |
22a80 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56  = ((u32)1 << (iV
22a90 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  ar-1));.  }.}..#
22aa0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22ab0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
22ac0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
22ad0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
22ae0 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
22af0 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
22b00 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
22b10 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
22b20 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
22b30 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
22b40 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
22b50 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
22b60 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
22b70 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
22b80 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
22b90 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
22ba0 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
22bb0 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
22bc0 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61 62 2d  b){.  if( pVtab-
22bd0 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  >zErrMsg ){.    
22be0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
22bf0 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  >db;.    sqlite3
22c00 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
22c10 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a  rrMsg);.    p->z
22c20 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
22c30 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
22c40 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
22c50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22c60 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
22c70 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d      pVtab->zErrM
22c80 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23 65  sg = 0;.  }.}.#e
22c90 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
22ca0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
22cb0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
22cc0 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44  TE_ENABLE_PREUPD
22cd0 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a 2a 20  ATE_HOOK../*.** 
22ce0 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
22cf0 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
22d00 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e 79 20  LL, release any 
22d10 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73 73 6f  allocations asso
22d20 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20  ciated .** with 
22d30 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  the memory cells
22d40 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65 6d 5b   in the p->aMem[
22d50 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20 66 72  ] array. Also fr
22d60 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65 64 52  ee the UnpackedR
22d70 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75  ecord.** structu
22d80 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69 6e 67  re itself, using
22d90 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
22da0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
22db0 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
22dc0 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64 52 65   free UnpackedRe
22dd0 63 6f 72 64 20 73 74 72 75 63 74 75 72 65 73 20  cord structures 
22de0 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
22df0 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b 52 65  the vdbeUnpackRe
22e00 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f 6e 20  cord() function 
22e10 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61 70 69  found in vdbeapi
22e20 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  .c..*/.static vo
22e30 69 64 20 76 64 62 65 46 72 65 65 55 6e 70 61 63  id vdbeFreeUnpac
22e40 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ked(sqlite3 *db,
22e50 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
22e60 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29 7b 0a  *p){.  if( p ){.
22e70 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
22e80 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 46 69  or(i=0; i<p->nFi
22e90 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  eld; i++){.     
22ea0 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
22eb0 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20 20 20  >aMem[i];.      
22ec0 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c 6c 6f  if( pMem->zMallo
22ed0 63 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c ) sqlite3VdbeM
22ee0 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d 29 3b  emRelease(pMem);
22ef0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22f00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b  e3DbFree(db, p);
22f10 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  .  }.}../*.** In
22f20 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
22f30 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
22f40 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
22f50 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
22f60 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
22f70 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
22f80 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
22f90 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
22fa0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
22fb0 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
22fc0 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
22fd0 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
22fe0 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
22ff0 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
23000 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
23010 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
23020 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
23030 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
23040 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
23050 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
23060 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
23070 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
23080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23090 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
230a0 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
230b0 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
230c0 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
230d0 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
230e0 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
230f0 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
23100 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
23110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23120 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
23130 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
23140 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
23150 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
23160 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
23170 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
23180 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
23190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
231a0 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
231b0 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231d0 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
231e0 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
231f0 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
23200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23210 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
23220 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
23230 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23240 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
23250 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
23260 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
23270 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
23280 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
23290 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
232a0 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
232b0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
232c0 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
232d0 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
232e0 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
232f0 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
23300 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  .  if( op==SQLIT
23310 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  E_UPDATE ){.    
23320 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b  iKey2 = v->aMem[
23330 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c  iReg].u.i;.  }el
23340 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20  se{.    iKey2 = 
23350 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  iKey1;.  }..  as
23360 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65  sert( pCsr->nFie
23370 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a  ld==pTab->nCol .
23380 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d         || (pCsr-
23390 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
233a0 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c  Col+1 && op==SQL
233b0 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52  ITE_DELETE && iR
233c0 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20  eg==-1).  );..  
233d0 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b  preupdate.v = v;
233e0 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73  .  preupdate.pCs
233f0 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75  r = pCsr;.  preu
23400 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20  pdate.op = op;. 
23410 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52   preupdate.iNewR
23420 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65  eg = iReg;.  pre
23430 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64  update.keyinfo.d
23440 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64  b = db;.  preupd
23450 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20  ate.keyinfo.enc 
23460 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65  = ENC(db);.  pre
23470 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
23480 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43  Field = pTab->nC
23490 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  ol;.  preupdate.
234a0 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64  keyinfo.aSortOrd
234b0 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53  er = (u8*)&fakeS
234c0 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75  ortOrder;.  preu
234d0 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b  pdate.iKey1 = iK
234e0 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey1;.  preupdate
234f0 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a  .iKey2 = iKey2;.
23500 20 20 70 72 65 75 70 64 61 74 65 2e 69 50 4b 65    preupdate.iPKe
23510 79 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  y = pTab->iPKey;
23520 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ..  db->pPreUpda
23530 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b  te = &preupdate;
23540 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74  .  db->xPreUpdat
23550 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50  eCallback(db->pP
23560 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c  reUpdateArg, db,
23570 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20   op, zDb, zTbl, 
23580 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20  iKey1, iKey2);. 
23590 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20   db->pPreUpdate 
235a0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
235b0 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61  Free(db, preupda
235c0 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76  te.aRecord);.  v
235d0 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
235e0 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  db, preupdate.pU
235f0 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
23600 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
23610 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55   preupdate.pNewU
23620 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20  npacked);.  if( 
23630 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29  preupdate.aNew )
23640 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23650 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
23660 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nField; i++){.
23670 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23680 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65  eMemRelease(&pre
23690 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b  update.aNew[i]);
236a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
236b0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
236c0 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20  update.aNew);.  
236d0 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
236e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
236f0 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a        PDATE_HOOK */.