/ Hex Artifact Content
Login

Artifact 51aaf15e5c29512423429cc0e0477e08f7181514:


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 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
0800: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0810: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0820: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0830: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0840: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0850: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0860: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0870: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0880: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0890: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
08a0: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
08b0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
08c0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
08d0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
08e0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
08f0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
0900: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0910: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0920: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0930: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0940: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0950: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0960: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0970: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0980: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0990: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
09a0: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
09b0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
09c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
09d0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
09e0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
09f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
0a00: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0a10: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0a20: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0a30: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0a40: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0a50: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0a60: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0a70: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0a80: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0a90: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0aa0: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
0ab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
0ac0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
0ad0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
0ae0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
0af0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
0b00: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0b10: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0b20: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0b30: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0b40: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0b50: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0b60: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0b70: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0b80: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0b90: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0ba0: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0bb0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0bc0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0bd0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0be0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0bf0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0c00: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0c10: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0c20: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0c30: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0c40: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0c50: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0c60: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0c70: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0c80: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0c90: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0ca0: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0cb0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0cc0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0cd0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0ce0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0cf0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0d00: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0d10: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0d20: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0d30: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0d40: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0d50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0d60: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0d70: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0d80: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0d90: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0da0: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0db0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0dc0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0dd0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0de0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0df0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0e10: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0e20: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0e30: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0e40: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0e50: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0e60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0e70: 20 20 20 20 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63      p->szOpAlloc
0e80: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
0e90: 6f 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e  ocSize(p->db, pN
0ea0: 65 77 29 3b 0a 20 20 20 20 70 2d 3e 6e 4f 70 41  ew);.    p->nOpA
0eb0: 6c 6c 6f 63 20 3d 20 70 2d 3e 73 7a 4f 70 41 6c  lloc = p->szOpAl
0ec0: 6c 6f 63 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a  loc/sizeof(Op);.
0ed0: 20 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65      v->aOp = pNe
0ee0: 77 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  w;.  }.  return 
0ef0: 28 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f  (pNew ? SQLITE_O
0f00: 4b 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  K : SQLITE_NOMEM
0f10: 5f 42 4b 50 54 29 3b 0a 7d 0a 0a 23 69 66 64 65  _BKPT);.}..#ifde
0f20: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
0f30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
0f40: 73 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69  s just a conveni
0f50: 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74  ent place to set
0f60: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 68   a breakpoint th
0f70: 61 74 20 77 69 6c 6c 0a 2a 2a 20 66 69 72 65 20  at will.** fire 
0f80: 61 66 74 65 72 20 65 61 63 68 20 6f 70 63 6f 64  after each opcod
0f90: 65 20 69 73 20 69 6e 73 65 72 74 65 64 20 61 6e  e is inserted an
0fa0: 64 20 64 69 73 70 6c 61 79 65 64 20 75 73 69 6e  d displayed usin
0fb0: 67 0a 2a 2a 20 22 50 52 41 47 4d 41 20 76 64 62  g.** "PRAGMA vdb
0fc0: 65 5f 61 64 64 6f 70 74 72 61 63 65 3d 6f 6e 22  e_addoptrace=on"
0fd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
0fe0: 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72 65 61   test_addop_brea
0ff0: 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20  kpoint(void){.  
1000: 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20 30  static int n = 0
1010: 3b 0a 20 20 6e 2b 2b 3b 0a 7d 0a 23 65 6e 64 69  ;.  n++;.}.#endi
1020: 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  f../*.** Add a n
1030: 65 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  ew instruction t
1040: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 6e  o the list of in
1050: 73 74 72 75 63 74 69 6f 6e 73 20 63 75 72 72 65  structions curre
1060: 6e 74 20 69 6e 20 74 68 65 0a 2a 2a 20 56 44 42  nt in the.** VDB
1070: 45 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  E.  Return the a
1080: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65  ddress of the ne
1090: 77 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  w instruction..*
10a0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 73 3a  *.** Parameters:
10b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 20 20 20 20 20  .**.**    p     
10c0: 20 20 20 20 20 20 20 20 20 20 50 6f 69 6e 74 65            Pointe
10d0: 72 20 74 6f 20 74 68 65 20 56 44 42 45 0a 2a 2a  r to the VDBE.**
10e0: 0a 2a 2a 20 20 20 20 6f 70 20 20 20 20 20 20 20  .**    op       
10f0: 20 20 20 20 20 20 20 54 68 65 20 6f 70 63 6f 64         The opcod
1100: 65 20 66 6f 72 20 74 68 69 73 20 69 6e 73 74 72  e for this instr
1110: 75 63 74 69 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20  uction.**.**    
1120: 70 31 2c 20 70 32 2c 20 70 33 20 20 20 20 20 20  p1, p2, p3      
1130: 4f 70 65 72 61 6e 64 73 0a 2a 2a 0a 2a 2a 20 55  Operands.**.** U
1140: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  se the sqlite3Vd
1150: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 29  beResolveLabel()
1160: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 66 69 78   function to fix
1170: 20 61 6e 20 61 64 64 72 65 73 73 20 61 6e 64 0a   an address and.
1180: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  ** the sqlite3Vd
1190: 62 65 43 68 61 6e 67 65 50 34 28 29 20 66 75 6e  beChangeP4() fun
11a0: 63 74 69 6f 6e 20 74 6f 20 63 68 61 6e 67 65 20  ction to change 
11b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
11c0: 20 50 34 0a 2a 2a 20 6f 70 65 72 61 6e 64 2e 0a   P4.** operand..
11d0: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
11e0: 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 67 72  _NOINLINE int gr
11f0: 6f 77 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69  owOp3(Vdbe *p, i
1200: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
1210: 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a  nt p2, int p3){.
1220: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 50 61    assert( p->pPa
1230: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 70  rse->nOpAlloc<=p
1240: 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 67  ->nOp );.  if( g
1250: 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31 29  rowOpArray(p, 1)
1260: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61   ) return 1;.  a
1270: 73 73 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65  ssert( p->pParse
1280: 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f  ->nOpAlloc>p->nO
1290: 70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  p );.  return sq
12a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
12b0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
12c0: 33 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  3);.}.int sqlite
12d0: 33 56 64 62 65 41 64 64 4f 70 33 28 56 64 62 65  3VdbeAddOp3(Vdbe
12e0: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
12f0: 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74   p1, int p2, int
1300: 20 70 33 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   p3){.  int i;. 
1310: 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 0a 20   VdbeOp *pOp;.. 
1320: 20 69 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 61   i = p->nOp;.  a
1330: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
1340: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
1350: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 70   );.  assert( op
1360: 3e 3d 30 20 26 26 20 6f 70 3c 30 78 66 66 20 29  >=0 && op<0xff )
1370: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 61 72 73  ;.  if( p->pPars
1380: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3c 3d 69 20 29  e->nOpAlloc<=i )
1390: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 67 72 6f  {.    return gro
13a0: 77 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  wOp3(p, op, p1, 
13b0: 70 32 2c 20 70 33 29 3b 0a 20 20 7d 0a 20 20 70  p2, p3);.  }.  p
13c0: 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70 20 3d  ->nOp++;.  pOp =
13d0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 70   &p->aOp[i];.  p
13e0: 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28 75 38  Op->opcode = (u8
13f0: 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35 20 3d  )op;.  pOp->p5 =
1400: 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20 3d 20   0;.  pOp->p1 = 
1410: 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20 3d 20  p1;.  pOp->p2 = 
1420: 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20 3d 20  p2;.  pOp->p3 = 
1430: 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 70 20  p3;.  pOp->p4.p 
1440: 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34 74 79  = 0;.  pOp->p4ty
1450: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
1460: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1470: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
1480: 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e 7a 43  MMENTS.  pOp->zC
1490: 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64  omment = 0;.#end
14a0: 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14b0: 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70 2d 3e  _DEBUG.  if( p->
14c0: 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c 49  db->flags & SQLI
14d0: 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61 63  TE_VdbeAddopTrac
14e0: 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a 6a 2c  e ){.    int jj,
14f0: 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65 20 2a   kk;.    Parse *
1500: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
1510: 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a 3d 6b  se;.    for(jj=k
1520: 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45 5f 4e  k=0; jj<SQLITE_N
1530: 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b 2b 29  _COLCACHE; jj++)
1540: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 79  {.      struct y
1550: 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20 70 50  ColCache *x = pP
1560: 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 20  arse->aColCache 
1570: 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66 28 20  + jj;.      if( 
1580: 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  x->iLevel>pParse
1590: 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 7c 7c  ->iCacheLevel ||
15a0: 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20 63 6f   x->iReg==0 ) co
15b0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 72  ntinue;.      pr
15c0: 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b 25 64  intf(" r[%d]={%d
15d0: 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67 2c 20  :%d}", x->iReg, 
15e0: 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e 69 43  x->iTable, x->iC
15f0: 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 6b 6b  olumn);.      kk
1600: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ++;.    }.    if
1610: 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28 22 5c  ( kk ) printf("\
1620: 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1630: 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69  VdbePrintOp(0, i
1640: 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
1650: 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f 62 72     test_addop_br
1660: 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 7d 0a  eakpoint();.  }.
1670: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 56 44  #endif.#ifdef VD
1680: 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70 4f 70  BE_PROFILE.  pOp
1690: 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ->cycles = 0;.  
16a0: 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a 23 65  pOp->cnt = 0;.#e
16b0: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
16c0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
16d0: 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69 6e 65  .  pOp->iSrcLine
16e0: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 72   = 0;.#endif.  r
16f0: 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74 20 73  eturn i;.}.int s
1700: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
1710: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1720: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1730: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1740: 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d   op, 0, 0, 0);.}
1750: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1760: 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70 2c 20  AddOp1(Vdbe *p, 
1770: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 29 7b  int op, int p1){
1780: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1790: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
17a0: 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a 7d 0a  p, p1, 0, 0);.}.
17b0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41  int sqlite3VdbeA
17c0: 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c 20 69  ddOp2(Vdbe *p, i
17d0: 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69  nt op, int p1, i
17e0: 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75 72 6e  nt p2){.  return
17f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1800: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1810: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65  , 0);.}../* Gene
1820: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 6e  rate code for an
1830: 20 75 6e 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 6a   unconditional j
1840: 75 6d 70 20 74 6f 20 69 6e 73 74 72 75 63 74 69  ump to instructi
1850: 6f 6e 20 69 44 65 73 74 0a 2a 2f 0a 69 6e 74 20  on iDest.*/.int 
1860: 73 71 6c 69 74 65 33 56 64 62 65 47 6f 74 6f 28  sqlite3VdbeGoto(
1870: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1880: 73 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  st){.  return sq
1890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
18a0: 70 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 69  p, OP_Goto, 0, i
18b0: 44 65 73 74 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 20  Dest, 0);.}../* 
18c0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
18d0: 20 63 61 75 73 65 20 74 68 65 20 73 74 72 69 6e   cause the strin
18e0: 67 20 7a 53 74 72 20 74 6f 20 62 65 20 6c 6f 61  g zStr to be loa
18f0: 64 65 64 20 69 6e 74 6f 0a 2a 2a 20 72 65 67 69  ded into.** regi
1900: 73 74 65 72 20 69 44 65 73 74 0a 2a 2f 0a 69 6e  ster iDest.*/.in
1910: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 6f 61  t sqlite3VdbeLoa
1920: 64 53 74 72 69 6e 67 28 56 64 62 65 20 2a 70 2c  dString(Vdbe *p,
1930: 20 69 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73   int iDest, cons
1940: 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a 20  t char *zStr){. 
1950: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1960: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
1970: 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44 65 73  String8, 0, iDes
1980: 74 2c 20 30 2c 20 7a 53 74 72 2c 20 30 29 3b 0a  t, 0, zStr, 0);.
1990: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
19a0: 65 20 63 6f 64 65 20 74 68 61 74 20 69 6e 69 74  e code that init
19b0: 69 61 6c 69 7a 65 73 20 6d 75 6c 74 69 70 6c 65  ializes multiple
19c0: 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 73 74   registers to st
19d0: 72 69 6e 67 20 6f 72 20 69 6e 74 65 67 65 72 0a  ring or integer.
19e0: 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
19f0: 68 65 20 72 65 67 69 73 74 65 72 73 20 62 65 67  he registers beg
1a00: 69 6e 20 77 69 74 68 20 69 44 65 73 74 20 61 6e  in with iDest an
1a10: 64 20 69 6e 63 72 65 61 73 65 20 63 6f 6e 73 65  d increase conse
1a20: 63 75 74 69 76 65 6c 79 2e 0a 2a 2a 20 4f 6e 65  cutively..** One
1a30: 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e 69   register is ini
1a40: 74 69 61 6c 69 7a 65 64 20 66 6f 72 20 65 61 63  tialized for eac
1a50: 68 20 63 68 61 72 61 63 67 74 65 72 20 69 6e 20  h characgter in 
1a60: 7a 54 79 70 65 73 5b 5d 2e 20 20 46 6f 72 20 65  zTypes[].  For e
1a70: 61 63 68 0a 2a 2a 20 22 73 22 20 63 68 61 72 61  ach.** "s" chara
1a80: 63 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d  cter in zTypes[]
1a90: 2c 20 74 68 65 20 72 65 67 69 73 74 65 72 20 69  , the register i
1aa0: 73 20 61 20 73 74 72 69 6e 67 20 69 66 20 74 68  s a string if th
1ab0: 65 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a  e argument is.**
1ac0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 6f 72 20 4f 50   not NULL, or OP
1ad0: 5f 4e 75 6c 6c 20 69 66 20 74 68 65 20 76 61 6c  _Null if the val
1ae0: 75 65 20 69 73 20 61 20 6e 75 6c 6c 20 70 6f 69  ue is a null poi
1af0: 6e 74 65 72 2e 20 20 46 6f 72 20 65 61 63 68 20  nter.  For each 
1b00: 22 69 22 20 63 68 61 72 61 63 74 65 72 0a 2a 2a  "i" character.**
1b10: 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68   in zTypes[], th
1b20: 65 20 72 65 67 69 73 74 65 72 20 69 73 20 69 6e  e register is in
1b30: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6e 20  itialized to an 
1b40: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 76 6f 69 64  integer..*/.void
1b50: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 75 6c 74   sqlite3VdbeMult
1b60: 69 4c 6f 61 64 28 56 64 62 65 20 2a 70 2c 20 69  iLoad(Vdbe *p, i
1b70: 6e 74 20 69 44 65 73 74 2c 20 63 6f 6e 73 74 20  nt iDest, const 
1b80: 63 68 61 72 20 2a 7a 54 79 70 65 73 2c 20 2e 2e  char *zTypes, ..
1b90: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
1ba0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
1bb0: 72 20 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  r c;.  va_start(
1bc0: 61 70 2c 20 7a 54 79 70 65 73 29 3b 0a 20 20 66  ap, zTypes);.  f
1bd0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 54 79  or(i=0; (c = zTy
1be0: 70 65 73 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  pes[i])!=0; i++)
1bf0: 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 73 27  {.    if( c=='s'
1c00: 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   ){.      const 
1c10: 63 68 61 72 20 2a 7a 20 3d 20 76 61 5f 61 72 67  char *z = va_arg
1c20: 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1c30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c40: 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 7a 3d  VdbeAddOp4(p, z=
1c50: 3d 30 20 3f 20 4f 50 5f 4e 75 6c 6c 20 3a 20 4f  =0 ? OP_Null : O
1c60: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 69 44  P_String8, 0, iD
1c70: 65 73 74 2b 2b 2c 20 30 2c 20 7a 2c 20 30 29 3b  est++, 0, z, 0);
1c80: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c90: 20 20 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27    assert( c=='i'
1ca0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
1cb0: 33 56 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f  3VdbeAddOp2(p, O
1cc0: 50 5f 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72  P_Integer, va_ar
1cd0: 67 28 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73  g(ap, int), iDes
1ce0: 74 2b 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t++);.    }.  }.
1cf0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a    va_end(ap);.}.
1d00: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70  ./*.** Add an op
1d10: 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64  code that includ
1d20: 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20  es the p4 value 
1d30: 61 73 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  as a pointer..*/
1d40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1d50: 41 64 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a  AddOp4(.  Vdbe *
1d60: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  p,            /*
1d70: 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20   Add the opcode 
1d80: 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20  to this VM */.  
1d90: 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20  int op,         
1da0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f      /* The new o
1db0: 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70  pcode */.  int p
1dc0: 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  1,             /
1dd0: 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64  * The P1 operand
1de0: 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20   */.  int p2,   
1df0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1e00: 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P2 operand */. 
1e10: 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20   int p3,        
1e20: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f       /* The P3 o
1e30: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73  perand */.  cons
1e40: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20  t char *zP4,    
1e50: 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e  /* The P4 operan
1e60: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70  d */.  int p4typ
1e70: 65 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34  e          /* P4
1e80: 20 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f   operand type */
1e90: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
1ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
1eb0: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
1ec0: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
1ed0: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
1ee0: 61 64 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70  addr, zP4, p4typ
1ef0: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64  e);.  return add
1f00: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  r;.}../*.** Add 
1f10: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1f20: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1f30: 61 6c 75 65 20 77 69 74 68 20 61 20 50 34 5f 49  alue with a P4_I
1f40: 4e 54 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45  NT64 or.** P4_RE
1f50: 41 4c 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20  AL type..*/.int 
1f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f70: 34 44 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70  4Dup8(.  Vdbe *p
1f80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
1f90: 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74  Add the opcode t
1fa0: 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69  o this VM */.  i
1fb0: 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20  nt op,          
1fc0: 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70     /* The new op
1fd0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31  code */.  int p1
1fe0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1ff0: 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20   The P1 operand 
2000: 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20  */.  int p2,    
2010: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2020: 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P2 operand */.  
2030: 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20  int p3,         
2040: 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70      /* The P3 op
2050: 65 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  erand */.  const
2060: 20 75 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f   u8 *zP4,      /
2070: 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64  * The P4 operand
2080: 20 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65   */.  int p4type
2090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20            /* P4 
20a0: 6f 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a  operand type */.
20b0: 29 7b 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70  ){.  char *p4cop
20c0: 79 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  y = sqlite3DbMal
20d0: 6c 6f 63 52 61 77 4e 4e 28 73 71 6c 69 74 65 33  locRawNN(sqlite3
20e0: 56 64 62 65 44 62 28 70 29 2c 20 38 29 3b 0a 20  VdbeDb(p), 8);. 
20f0: 20 69 66 28 20 70 34 63 6f 70 79 20 29 20 6d 65   if( p4copy ) me
2100: 6d 63 70 79 28 70 34 63 6f 70 79 2c 20 7a 50 34  mcpy(p4copy, zP4
2110: 2c 20 38 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  , 8);.  return s
2120: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
2130: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2140: 70 33 2c 20 70 34 63 6f 70 79 2c 20 70 34 74 79  p3, p4copy, p4ty
2150: 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  pe);.}../*.** Ad
2160: 64 20 61 6e 20 4f 50 5f 50 61 72 73 65 53 63 68  d an OP_ParseSch
2170: 65 6d 61 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  ema opcode.  Thi
2180: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 62 72 6f  s routine is bro
2190: 6b 65 6e 20 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20  ken out from.** 
21a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
21b0: 34 28 29 20 73 69 6e 63 65 20 69 74 20 6e 65 65  4() since it nee
21c0: 64 73 20 74 6f 20 61 6c 73 6f 20 6e 65 65 64 73  ds to also needs
21d0: 20 74 6f 20 6d 61 72 6b 20 61 6c 6c 20 62 74 72   to mark all btr
21e0: 65 65 73 0a 2a 2a 20 61 73 20 68 61 76 69 6e 67  ees.** as having
21f0: 20 62 65 65 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a   been used..**.*
2200: 2a 20 54 68 65 20 7a 57 68 65 72 65 20 73 74 72  * The zWhere str
2210: 69 6e 67 20 6d 75 73 74 20 68 61 76 65 20 62 65  ing must have be
2220: 65 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  en obtained from
2230: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
2240: 29 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  )..** This routi
2250: 6e 65 20 77 69 6c 6c 20 74 61 6b 65 20 6f 77 6e  ne will take own
2260: 65 72 73 68 69 70 20 6f 66 20 74 68 65 20 61 6c  ership of the al
2270: 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e 0a  located memory..
2280: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
2290: 64 62 65 41 64 64 50 61 72 73 65 53 63 68 65 6d  dbeAddParseSchem
22a0: 61 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  aOp(Vdbe *p, int
22b0: 20 69 44 62 2c 20 63 68 61 72 20 2a 7a 57 68 65   iDb, char *zWhe
22c0: 72 65 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  re){.  int j;.  
22d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
22e0: 34 28 70 2c 20 4f 50 5f 50 61 72 73 65 53 63 68  4(p, OP_ParseSch
22f0: 65 6d 61 2c 20 69 44 62 2c 20 30 2c 20 30 2c 20  ema, iDb, 0, 0, 
2300: 7a 57 68 65 72 65 2c 20 50 34 5f 44 59 4e 41 4d  zWhere, P4_DYNAM
2310: 49 43 29 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  IC);.  for(j=0; 
2320: 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b  j<p->db->nDb; j+
2330: 2b 29 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  +) sqlite3VdbeUs
2340: 65 73 42 74 72 65 65 28 70 2c 20 6a 29 3b 0a 7d  esBtree(p, j);.}
2350: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f  ../*.** Add an o
2360: 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75  pcode that inclu
2370: 64 65 73 20 74 68 65 20 70 34 20 76 61 6c 75 65  des the p4 value
2380: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   as an integer..
2390: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
23a0: 62 65 41 64 64 4f 70 34 49 6e 74 28 0a 20 20 56  beAddOp4Int(.  V
23b0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
23c0: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
23d0: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
23e0: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
23f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2400: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2410: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
2420: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
2430: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
2440: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
2450: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
2460: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
2470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2480: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2490: 20 69 6e 74 20 70 34 20 20 20 20 20 20 20 20 20   int p4         
24a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
24b0: 70 65 72 61 6e 64 20 61 73 20 61 6e 20 69 6e 74  perand as an int
24c0: 65 67 65 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  eger */.){.  int
24d0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
24e0: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c  dbeAddOp3(p, op,
24f0: 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20   p1, p2, p3);.  
2500: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
2510: 65 50 34 28 70 2c 20 61 64 64 72 2c 20 53 51 4c  eP4(p, addr, SQL
2520: 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 70  ITE_INT_TO_PTR(p
2530: 34 29 2c 20 50 34 5f 49 4e 54 33 32 29 3b 0a 20  4), P4_INT32);. 
2540: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
2550: 0a 2f 2a 20 49 6e 73 65 72 74 20 74 68 65 20 65  ./* Insert the e
2560: 6e 64 20 6f 66 20 61 20 63 6f 2d 72 6f 75 74 69  nd of a co-routi
2570: 6e 65 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  ne.*/.void sqlit
2580: 65 33 56 64 62 65 45 6e 64 43 6f 72 6f 75 74 69  e3VdbeEndCorouti
2590: 6e 65 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ne(Vdbe *v, int 
25a0: 72 65 67 59 69 65 6c 64 29 7b 0a 20 20 73 71 6c  regYield){.  sql
25b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
25c0: 2c 20 4f 50 5f 45 6e 64 43 6f 72 6f 75 74 69 6e  , OP_EndCoroutin
25d0: 65 2c 20 72 65 67 59 69 65 6c 64 29 3b 0a 0a 20  e, regYield);.. 
25e0: 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 74 65   /* Clear the te
25f0: 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72  mporary register
2600: 20 63 61 63 68 65 2c 20 74 68 65 72 65 62 79 20   cache, thereby 
2610: 65 6e 73 75 72 69 6e 67 20 74 68 61 74 20 65 61  ensuring that ea
2620: 63 68 0a 20 20 2a 2a 20 63 6f 2d 72 6f 75 74 69  ch.  ** co-routi
2630: 6e 65 20 68 61 73 20 69 74 73 20 6f 77 6e 20 69  ne has its own i
2640: 6e 64 65 70 65 6e 64 65 6e 74 20 73 65 74 20 6f  ndependent set o
2650: 66 20 72 65 67 69 73 74 65 72 73 2c 20 62 65 63  f registers, bec
2660: 61 75 73 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73  ause co-routines
2670: 0a 20 20 2a 2a 20 6d 69 67 68 74 20 65 78 70 65  .  ** might expe
2680: 63 74 20 74 68 65 69 72 20 72 65 67 69 73 74 65  ct their registe
2690: 72 73 20 74 6f 20 62 65 20 70 72 65 73 65 72 76  rs to be preserv
26a0: 65 64 20 61 63 72 6f 73 73 20 61 6e 20 4f 50 5f  ed across an OP_
26b0: 59 69 65 6c 64 2c 20 61 6e 64 0a 20 20 2a 2a 20  Yield, and.  ** 
26c0: 74 68 61 74 20 63 6f 75 6c 64 20 63 61 75 73 65  that could cause
26d0: 20 70 72 6f 62 6c 65 6d 73 20 69 66 20 74 77 6f   problems if two
26e0: 20 6f 72 20 6d 6f 72 65 20 63 6f 2d 72 6f 75 74   or more co-rout
26f0: 69 6e 65 73 20 61 72 65 20 75 73 69 6e 67 20 74  ines are using t
2700: 68 65 20 73 61 6d 65 0a 20 20 2a 2a 20 74 65 6d  he same.  ** tem
2710: 70 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 2e  porary register.
2720: 0a 20 20 2a 2f 0a 20 20 76 2d 3e 70 50 61 72 73  .  */.  v->pPars
2730: 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
2740: 0a 20 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 52  .  v->pParse->nR
2750: 61 6e 67 65 52 65 67 20 3d 20 30 3b 0a 7d 0a 0a  angeReg = 0;.}..
2760: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
2770: 65 77 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65  ew symbolic labe
2780: 6c 20 66 6f 72 20 61 6e 20 69 6e 73 74 72 75 63  l for an instruc
2790: 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 79 65  tion that has ye
27a0: 74 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64  t to be.** coded
27b0: 2e 20 20 54 68 65 20 73 79 6d 62 6f 6c 69 63 20  .  The symbolic 
27c0: 6c 61 62 65 6c 20 69 73 20 72 65 61 6c 6c 79 20  label is really 
27d0: 6a 75 73 74 20 61 20 6e 65 67 61 74 69 76 65 20  just a negative 
27e0: 6e 75 6d 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20  number.  The.** 
27f0: 6c 61 62 65 6c 20 63 61 6e 20 62 65 20 75 73 65  label can be use
2800: 64 20 61 73 20 74 68 65 20 50 32 20 76 61 6c 75  d as the P2 valu
2810: 65 20 6f 66 20 61 6e 20 6f 70 65 72 61 74 69 6f  e of an operatio
2820: 6e 2e 20 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a  n.  Later, when.
2830: 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 73 20  ** the label is 
2840: 72 65 73 6f 6c 76 65 64 20 74 6f 20 61 20 73 70  resolved to a sp
2850: 65 63 69 66 69 63 20 61 64 64 72 65 73 73 2c 20  ecific address, 
2860: 74 68 65 20 56 44 42 45 20 77 69 6c 6c 20 73 63  the VDBE will sc
2870: 61 6e 0a 2a 2a 20 74 68 72 6f 75 67 68 20 69 74  an.** through it
2880: 73 20 6f 70 65 72 61 74 69 6f 6e 20 6c 69 73 74  s operation list
2890: 20 61 6e 64 20 63 68 61 6e 67 65 20 61 6c 6c 20   and change all 
28a0: 76 61 6c 75 65 73 20 6f 66 20 50 32 20 77 68 69  values of P2 whi
28b0: 63 68 20 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20  ch match.** the 
28c0: 6c 61 62 65 6c 20 69 6e 74 6f 20 74 68 65 20 72  label into the r
28d0: 65 73 6f 6c 76 65 64 20 61 64 64 72 65 73 73 2e  esolved address.
28e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 56 44 42 45 20  .**.** The VDBE 
28f0: 6b 6e 6f 77 73 20 74 68 61 74 20 61 20 50 32 20  knows that a P2 
2900: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
2910: 20 62 65 63 61 75 73 65 20 6c 61 62 65 6c 73 20   because labels 
2920: 61 72 65 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65  are.** always ne
2930: 67 61 74 69 76 65 20 61 6e 64 20 50 32 20 76 61  gative and P2 va
2940: 6c 75 65 73 20 61 72 65 20 73 75 70 70 6f 73 65  lues are suppose
2950: 20 74 6f 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74   to be non-negat
2960: 69 76 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61  ive..** Hence, a
2970: 20 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c   negative P2 val
2980: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 74 68  ue is a label th
2990: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
29a0: 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a   resolved..**.**
29b0: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
29c0: 64 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  d if a malloc() 
29d0: 66 61 69 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fails..*/.int sq
29e0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
29f0: 65 6c 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 50  el(Vdbe *v){.  P
2a00: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
2a10: 72 73 65 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70  rse;.  int i = p
2a20: 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73  ->nLabel++;.  as
2a30: 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d  sert( v->magic==
2a40: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
2a50: 29 3b 0a 20 20 69 66 28 20 28 69 20 26 20 28 69  );.  if( (i & (i
2a60: 2d 31 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  -1))==0 ){.    p
2a70: 2d 3e 61 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74  ->aLabel = sqlit
2a80: 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65  e3DbReallocOrFre
2a90: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62  e(p->db, p->aLab
2aa0: 65 6c 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  el, .           
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 28 69 2a 32              (i*2
2ad0: 2b 31 29 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c  +1)*sizeof(p->aL
2ae0: 61 62 65 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20  abel[0]));.  }. 
2af0: 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29   if( p->aLabel )
2b00: 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b  {.    p->aLabel[
2b10: 69 5d 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72  i] = -1;.  }.  r
2b20: 65 74 75 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d  eturn ADDR(i);.}
2b30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ../*.** Resolve 
2b40: 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62 65 20  label "x" to be 
2b50: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
2b60: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
2b70: 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73  ion to.** be ins
2b80: 65 72 74 65 64 2e 20 20 54 68 65 20 70 61 72 61  erted.  The para
2b90: 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74 20 68  meter "x" must h
2ba0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
2bb0: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f  d from.** a prio
2bc0: 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  r call to sqlite
2bd0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29  3VdbeMakeLabel()
2be0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2bf0: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
2c00: 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 78  l(Vdbe *v, int x
2c10: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
2c20: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
2c30: 20 6a 20 3d 20 41 44 44 52 28 78 29 3b 0a 20 20   j = ADDR(x);.  
2c40: 61 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63  assert( v->magic
2c50: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
2c60: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a  T );.  assert( j
2c70: 3c 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20  <p->nLabel );.  
2c80: 61 73 73 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a  assert( j>=0 );.
2c90: 20 20 69 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20    if( p->aLabel 
2ca0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
2cb0: 5b 6a 5d 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  [j] = v->nOp;.  
2cc0: 7d 0a 20 20 70 2d 3e 69 46 69 78 65 64 4f 70 20  }.  p->iFixedOp 
2cd0: 3d 20 76 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a  = v->nOp - 1;.}.
2ce0: 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20  ./*.** Mark the 
2cf0: 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68 61 74  VDBE as one that
2d00: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e   can only be run
2d10: 20 6f 6e 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f   one time..*/.vo
2d20: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 75  id sqlite3VdbeRu
2d30: 6e 4f 6e 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a  nOnlyOnce(Vdbe *
2d40: 70 29 7b 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79  p){.  p->runOnly
2d50: 4f 6e 63 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66  Once = 1;.}..#if
2d60: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
2d70: 20 2f 2a 20 73 71 6c 69 74 65 33 41 73 73 65 72   /* sqlite3Asser
2d80: 74 4d 61 79 41 62 6f 72 74 28 29 20 6c 6f 67 69  tMayAbort() logi
2d90: 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c */../*.** The 
2da0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 79 70 65 20 61  following type a
2db0: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20  nd function are 
2dc0: 75 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20  used to iterate 
2dd0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
2de0: 64 65 73 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65  des.** in a Vdbe
2df0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e   main program an
2e00: 64 20 65 61 63 68 20 6f 66 20 74 68 65 20 73 75  d each of the su
2e10: 62 2d 70 72 6f 67 72 61 6d 73 20 28 74 72 69 67  b-programs (trig
2e20: 67 65 72 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a  gers) it may .**
2e30: 20 69 6e 76 6f 6b 65 20 64 69 72 65 63 74 6c 79   invoke directly
2e40: 20 6f 72 20 69 6e 64 69 72 65 63 74 6c 79 2e 20   or indirectly. 
2e50: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  It should be use
2e60: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
2e70: 0a 2a 2a 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a  .**   Op *pOp;.*
2e80: 2a 20 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  *   VdbeOpIter s
2e90: 49 74 65 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65  Iter;.**.**   me
2ea0: 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20  mset(&sIter, 0, 
2eb0: 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a  sizeof(sIter));.
2ec0: 2a 2a 20 20 20 73 49 74 65 72 2e 76 20 3d 20 76  **   sIter.v = v
2ed0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
2ef0: 76 20 69 73 20 6f 66 20 74 79 70 65 20 56 64 62  v is of type Vdb
2f00: 65 2a 20 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20  e* .**   while( 
2f10: 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78  (pOp = opIterNex
2f20: 74 28 26 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a  t(&sIter)) ){.**
2f30: 20 20 20 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74       // Do somet
2f40: 68 69 6e 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a  hing with pOp.**
2f50: 20 20 20 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65     }.**   sqlite
2f60: 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73  3DbFree(v->db, s
2f70: 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20  Iter.apSub);.** 
2f80: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
2f90: 63 74 20 56 64 62 65 4f 70 49 74 65 72 20 56 64  ct VdbeOpIter Vd
2fa0: 62 65 4f 70 49 74 65 72 3b 0a 73 74 72 75 63 74  beOpIter;.struct
2fb0: 20 56 64 62 65 4f 70 49 74 65 72 20 7b 0a 20 20   VdbeOpIter {.  
2fc0: 56 64 62 65 20 2a 76 3b 20 20 20 20 20 20 20 20  Vdbe *v;        
2fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
2fe0: 62 65 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  be to iterate th
2ff0: 72 6f 75 67 68 20 74 68 65 20 6f 70 63 6f 64 65  rough the opcode
3000: 73 20 6f 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f  s of */.  SubPro
3010: 67 72 61 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20  gram **apSub;   
3020: 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
3030: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
3040: 20 20 69 6e 74 20 6e 53 75 62 3b 20 20 20 20 20    int nSub;     
3050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3060: 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
3070: 73 20 69 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20  s in apSub */.  
3080: 69 6e 74 20 69 41 64 64 72 3b 20 20 20 20 20 20  int iAddr;      
3090: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
30a0: 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 69 6e  dress of next in
30b0: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 72 65 74  struction to ret
30c0: 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75  urn */.  int iSu
30d0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
30e0: 20 20 20 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20      /* 0 = main 
30f0: 70 72 6f 67 72 61 6d 2c 20 31 20 3d 20 66 69 72  program, 1 = fir
3100: 73 74 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 65  st sub-program e
3110: 74 63 2e 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  tc. */.};.static
3120: 20 4f 70 20 2a 6f 70 49 74 65 72 4e 65 78 74 28   Op *opIterNext(
3130: 56 64 62 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a  VdbeOpIter *p){.
3140: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76    Vdbe *v = p->v
3150: 3b 0a 20 20 4f 70 20 2a 70 52 65 74 20 3d 20 30  ;.  Op *pRet = 0
3160: 3b 0a 20 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69  ;.  Op *aOp;.  i
3170: 6e 74 20 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70  nt nOp;..  if( p
3180: 2d 3e 69 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20  ->iSub<=p->nSub 
3190: 29 7b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ){..    if( p->i
31a0: 53 75 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sub==0 ){.      
31b0: 61 4f 70 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20  aOp = v->aOp;.  
31c0: 20 20 20 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70      nOp = v->nOp
31d0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
31e0: 20 20 20 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75     aOp = p->apSu
31f0: 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f  b[p->iSub-1]->aO
3200: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 70  p;.      nOp = p
3210: 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d  ->apSub[p->iSub-
3220: 31 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20  1]->nOp;.    }. 
3230: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 41     assert( p->iA
3240: 64 64 72 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20  ddr<nOp );..    
3250: 70 52 65 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69  pRet = &aOp[p->i
3260: 41 64 64 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41  Addr];.    p->iA
3270: 64 64 72 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  ddr++;.    if( p
3280: 2d 3e 69 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a  ->iAddr==nOp ){.
3290: 20 20 20 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b        p->iSub++;
32a0: 0a 20 20 20 20 20 20 70 2d 3e 69 41 64 64 72 20  .      p->iAddr 
32b0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  = 0;.    }.  .  
32c0: 20 20 69 66 28 20 70 52 65 74 2d 3e 70 34 74 79    if( pRet->p4ty
32d0: 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41  pe==P4_SUBPROGRA
32e0: 4d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  M ){.      int n
32f0: 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b  Byte = (p->nSub+
3300: 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  1)*sizeof(SubPro
3310: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e  gram*);.      in
3320: 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
3330: 3d 30 3b 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a  =0; j<p->nSub; j
3340: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
3350: 20 70 2d 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52   p->apSub[j]==pR
3360: 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  et->p4.pProgram 
3370: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
3380: 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d  .      if( j==p-
3390: 3e 6e 53 75 62 20 29 7b 0a 20 20 20 20 20 20 20  >nSub ){.       
33a0: 20 70 2d 3e 61 70 53 75 62 20 3d 20 73 71 6c 69   p->apSub = sqli
33b0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72  te3DbReallocOrFr
33c0: 65 65 28 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53  ee(v->db, p->apS
33d0: 75 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  ub, nByte);.    
33e0: 20 20 20 20 69 66 28 20 21 70 2d 3e 61 70 53 75      if( !p->apSu
33f0: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  b ){.          p
3400: 52 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Ret = 0;.       
3410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
3420: 20 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53    p->apSub[p->nS
3430: 75 62 2b 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34  ub++] = pRet->p4
3440: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
3450: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3460: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
3470: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
3480: 43 68 65 63 6b 20 69 66 20 74 68 65 20 70 72 6f  Check if the pro
3490: 67 72 61 6d 20 73 74 6f 72 65 64 20 69 6e 20 74  gram stored in t
34a0: 68 65 20 56 4d 20 61 73 73 6f 63 69 61 74 65 64  he VM associated
34b0: 20 77 69 74 68 20 70 50 61 72 73 65 20 6d 61 79   with pParse may
34c0: 0a 2a 2a 20 74 68 72 6f 77 20 61 6e 20 41 42 4f  .** throw an ABO
34d0: 52 54 20 65 78 63 65 70 74 69 6f 6e 20 28 63 61  RT exception (ca
34e0: 75 73 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  using the statem
34f0: 65 6e 74 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74  ent, but not ent
3500: 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ire transaction.
3510: 2a 2a 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ** to be rolled 
3520: 62 61 63 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64  back). This cond
3530: 69 74 69 6f 6e 20 69 73 20 74 72 75 65 20 69 66  ition is true if
3540: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
3550: 6d 20 6f 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d  m or any.** sub-
3560: 70 72 6f 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e  programs contain
3570: 73 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  s any of the fol
3580: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
3590: 2a 20 20 4f 50 5f 48 61 6c 74 20 77 69 74 68 20  *  OP_Halt with 
35a0: 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  P1=SQLITE_CONSTR
35b0: 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41  AINT and P2=OE_A
35c0: 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50  bort..**   *  OP
35d0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68  _HaltIfNull with
35e0: 20 50 31 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54   P1=SQLITE_CONST
35f0: 52 41 49 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f  RAINT and P2=OE_
3600: 41 62 6f 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f  Abort..**   *  O
3610: 50 5f 44 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a  P_Destroy.**   *
3620: 20 20 4f 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20    OP_VUpdate.** 
3630: 20 20 2a 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a    *  OP_VRename.
3640: 2a 2a 20 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75  **   *  OP_FkCou
3650: 6e 74 65 72 20 77 69 74 68 20 50 32 3d 3d 30 20  nter with P2==0 
3660: 28 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69  (immediate forei
3670: 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
3680: 74 29 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72  t).**   *  OP_Cr
3690: 65 61 74 65 54 61 62 6c 65 20 61 6e 64 20 4f 50  eateTable and OP
36a0: 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 28  _InitCoroutine (
36b0: 66 6f 72 20 43 52 45 41 54 45 20 54 41 42 4c 45  for CREATE TABLE
36c0: 20 41 53 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a   AS SELECT ...).
36d0: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
36e0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
36f0: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
3700: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
3710: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
3720: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
3730: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
3740: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
3750: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
3760: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3770: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3780: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
3790: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
37a0: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
37b0: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
37c0: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
37d0: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
37e0: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
37f0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
3800: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
3810: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
3820: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
3830: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
3840: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
3850: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
3860: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
3870: 20 20 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74    int hasFkCount
3880: 65 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  er = 0;.  int ha
3890: 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 30  sCreateTable = 0
38a0: 3b 0a 20 20 69 6e 74 20 68 61 73 49 6e 69 74 43  ;.  int hasInitC
38b0: 6f 72 6f 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20  oroutine = 0;.  
38c0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f  Op *pOp;.  VdbeO
38d0: 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20 20 6d  pIter sIter;.  m
38e0: 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20 30 2c  emset(&sIter, 0,
38f0: 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29 29 3b   sizeof(sIter));
3900: 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a  .  sIter.v = v;.
3910: 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d  .  while( (pOp =
3920: 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74   opIterNext(&sIt
3930: 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  er))!=0 ){.    i
3940: 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  nt opcode = pOp-
3950: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69 66 28  >opcode;.    if(
3960: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74   opcode==OP_Dest
3970: 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  roy || opcode==O
3980: 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f 70 63  P_VUpdate || opc
3990: 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20  ode==OP_VRename 
39a0: 0a 20 20 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64  .     || ((opcod
39b0: 65 3d 3d 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70  e==OP_Halt || op
39c0: 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e  code==OP_HaltIfN
39d0: 75 6c 6c 29 20 0a 20 20 20 20 20 20 26 26 20 28  ull) .      && (
39e0: 28 70 4f 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d  (pOp->p1&0xff)==
39f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
3a00: 54 20 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45  T && pOp->p2==OE
3a10: 5f 41 62 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a  _Abort)).    ){.
3a20: 20 20 20 20 20 20 68 61 73 41 62 6f 72 74 20 3d        hasAbort =
3a30: 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
3a40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6f  .    }.    if( o
3a50: 70 63 6f 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65  pcode==OP_Create
3a60: 54 61 62 6c 65 20 29 20 68 61 73 43 72 65 61 74  Table ) hasCreat
3a70: 65 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  eTable = 1;.    
3a80: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  if( opcode==OP_I
3a90: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 29 20 68  nitCoroutine ) h
3aa0: 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20  asInitCoroutine 
3ab0: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
3ac0: 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
3ad0: 5f 4b 45 59 0a 20 20 20 20 69 66 28 20 6f 70 63  _KEY.    if( opc
3ae0: 6f 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65  ode==OP_FkCounte
3af0: 72 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20  r && pOp->p1==0 
3b00: 26 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b  && pOp->p2==1 ){
3b10: 0a 20 20 20 20 20 20 68 61 73 46 6b 43 6f 75 6e  .      hasFkCoun
3b20: 74 65 72 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23  ter = 1;.    }.#
3b30: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
3b40: 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
3b50: 20 73 49 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a   sIter.apSub);..
3b60: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 72 75 65    /* Return true
3b70: 20 69 66 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61   if hasAbort==ma
3b80: 79 41 62 6f 72 74 2e 20 4f 72 20 69 66 20 61 20  yAbort. Or if a 
3b90: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f  malloc failure o
3ba0: 63 63 75 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66  ccurred..  ** If
3bb0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20   malloc failed, 
3bc0: 74 68 65 6e 20 74 68 65 20 77 68 69 6c 65 28 29  then the while()
3bd0: 20 6c 6f 6f 70 20 61 62 6f 76 65 20 6d 61 79 20   loop above may 
3be0: 6e 6f 74 20 68 61 76 65 20 69 74 65 72 61 74 65  not have iterate
3bf0: 64 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61  d.  ** through a
3c00: 6c 6c 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 68  ll opcodes and h
3c10: 61 73 41 62 6f 72 74 20 6d 61 79 20 62 65 20 73  asAbort may be s
3c20: 65 74 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20  et incorrectly. 
3c30: 52 65 74 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65  Return.  ** true
3c40: 20 66 6f 72 20 74 68 69 73 20 63 61 73 65 20 74   for this case t
3c50: 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20 61 73  o prevent the as
3c60: 73 65 72 74 28 29 20 69 6e 20 74 68 65 20 63 61  sert() in the ca
3c70: 6c 6c 65 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a  llers frame.  **
3c80: 20 66 72 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20   from failing.  
3c90: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28 20 76 2d  */.  return ( v-
3ca0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
3cb0: 64 20 7c 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d  d || hasAbort==m
3cc0: 61 79 41 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b  ayAbort || hasFk
3cd0: 43 6f 75 6e 74 65 72 0a 20 20 20 20 20 20 20 20  Counter.        
3ce0: 20 20 20 20 20 20 7c 7c 20 28 68 61 73 43 72 65        || (hasCre
3cf0: 61 74 65 54 61 62 6c 65 20 26 26 20 68 61 73 49  ateTable && hasI
3d00: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b  nitCoroutine) );
3d10: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3d20: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
3d30: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
3d40: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
3d50: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
3d60: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
3d70: 64 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f  d after all opco
3d80: 64 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e  des have been in
3d90: 73 65 72 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70  serted.  It loop
3da0: 73 0a 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c  s.** through all
3db0: 20 74 68 65 20 6f 70 63 6f 64 65 73 20 61 6e 64   the opcodes and
3dc0: 20 66 69 78 65 73 20 75 70 20 73 6f 6d 65 20 64   fixes up some d
3dd0: 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31  etails..**.** (1
3de0: 29 20 46 6f 72 20 65 61 63 68 20 6a 75 6d 70 20  ) For each jump 
3df0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 77 69 74 68  instruction with
3e00: 20 61 20 6e 65 67 61 74 69 76 65 20 50 32 20 76   a negative P2 v
3e10: 61 6c 75 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a  alue (a label).*
3e20: 2a 20 20 20 20 20 72 65 73 6f 6c 76 65 20 74 68  *     resolve th
3e30: 65 20 50 32 20 76 61 6c 75 65 20 74 6f 20 61 6e  e P2 value to an
3e40: 20 61 63 74 75 61 6c 20 61 64 64 72 65 73 73 2e   actual address.
3e50: 0a 2a 2a 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75  .**.** (2) Compu
3e60: 74 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  te the maximum n
3e70: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
3e80: 74 73 20 75 73 65 64 20 62 79 20 61 6e 79 20 53  ts used by any S
3e90: 51 4c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20  QL function.**  
3ea0: 20 20 20 61 6e 64 20 73 74 6f 72 65 20 74 68 61     and store tha
3eb0: 74 20 76 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78  t value in *pMax
3ec0: 46 75 6e 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20  FuncArgs..**.** 
3ed0: 28 33 29 20 55 70 64 61 74 65 20 74 68 65 20 56  (3) Update the V
3ee0: 64 62 65 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64  dbe.readOnly and
3ef0: 20 56 64 62 65 2e 62 49 73 52 65 61 64 65 72 20   Vdbe.bIsReader 
3f00: 66 6c 61 67 73 20 74 6f 20 61 63 63 75 72 61 74  flags to accurat
3f10: 65 6c 79 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63  ely.**     indic
3f20: 61 74 65 20 77 68 61 74 20 74 68 65 20 70 72 65  ate what the pre
3f30: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
3f40: 61 63 74 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a  actually does..*
3f50: 2a 0a 2a 2a 20 28 34 29 20 49 6e 69 74 69 61 6c  *.** (4) Initial
3f60: 69 7a 65 20 74 68 65 20 70 34 2e 78 41 64 76 61  ize the p4.xAdva
3f70: 6e 63 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f  nce pointer on o
3f80: 70 63 6f 64 65 73 20 74 68 61 74 20 75 73 65 20  pcodes that use 
3f90: 69 74 2e 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65  it..**.** (5) Re
3fa0: 63 6c 61 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79  claim the memory
3fb0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 73   allocated for s
3fc0: 74 6f 72 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a  toring labels..*
3fd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
3fe0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64  solveP2Values(Vd
3ff0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78  be *p, int *pMax
4000: 46 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74  FuncArgs){.  int
4010: 20 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72   i;.  int nMaxAr
4020: 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72  gs = *pMaxFuncAr
4030: 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  gs;.  Op *pOp;. 
4040: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
4050: 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e   p->pParse;.  in
4060: 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72  t *aLabel = pPar
4070: 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d  se->aLabel;.  p-
4080: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20  >readOnly = 1;. 
4090: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
40a0: 30 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e  0;.  for(pOp=p->
40b0: 61 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b  aOp, i=p->nOp-1;
40c0: 20 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b   i>=0; i--, pOp+
40d0: 2b 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64  +){.    u8 opcod
40e0: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
40f0: 0a 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42  ..    /* NOTE: B
4100: 65 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65  e sure to update
4110: 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 77   mkopcodeh.tcl w
4120: 68 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65  hen adding or re
4130: 6d 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  moving.    ** ca
4140: 73 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77  ses from this sw
4150: 69 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69  itch! */.    swi
4160: 74 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20  tch( opcode ){. 
4170: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
4180: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
4190: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 21      if( pOp->p2!
41a0: 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79  =0 ) p->readOnly
41b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a   = 0;.        /*
41c0: 20 66 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20   fall thru */.  
41d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
41e0: 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a   OP_AutoCommit:.
41f0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53 61        case OP_Sa
4200: 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20  vepoint: {.     
4210: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
4220: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
4230: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
4240: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
4250: 57 41 4c 0a 20 20 20 20 20 20 63 61 73 65 20 4f  WAL.      case O
4260: 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65  P_Checkpoint:.#e
4270: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
4280: 4f 50 5f 56 61 63 75 75 6d 3a 0a 20 20 20 20 20  OP_Vacuum:.     
4290: 20 63 61 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c   case OP_Journal
42a0: 4d 6f 64 65 3a 20 7b 0a 20 20 20 20 20 20 20 20  Mode: {.        
42b0: 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  p->readOnly = 0;
42c0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52  .        p->bIsR
42d0: 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20  eader = 1;.     
42e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
42f0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
4300: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
4310: 4c 45 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  LE.      case OP
4320: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
4330: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e      if( pOp->p2>
4340: 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41  nMaxArgs ) nMaxA
4350: 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20  rgs = pOp->p2;. 
4360: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4370: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
4380: 20 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20   OP_VFilter: {. 
4390: 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
43a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
43b0: 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b  >nOp - i >= 3 );
43c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
43d0: 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d   pOp[-1].opcode=
43e0: 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20  =OP_Integer );. 
43f0: 20 20 20 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d         n = pOp[-
4400: 31 5d 2e 70 31 3b 0a 20 20 20 20 20 20 20 20 69  1].p1;.        i
4410: 66 28 20 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20  f( n>nMaxArgs ) 
4420: 6e 4d 61 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20  nMaxArgs = n;.  
4430: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4440: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
4450: 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a    case OP_Next:.
4460: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
4470: 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20  xtIfOpen:.      
4480: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
4490: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  xt: {.        pO
44a0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
44b0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
44c0: 74 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e  t;.        pOp->
44d0: 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41  p4type = P4_ADVA
44e0: 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65  NCE;.        bre
44f0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4500: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a    case OP_Prev:.
4510: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
4520: 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20  evIfOpen: {.    
4530: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76      pOp->p4.xAdv
4540: 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74  ance = sqlite3Bt
4550: 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20  reePrevious;.   
4560: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
4570: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
4580: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4590: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
45a0: 20 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20   pOp->opflags = 
45b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
45c0: 70 65 72 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20  perty[opcode];. 
45d0: 20 20 20 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66     if( (pOp->opf
45e0: 6c 61 67 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d  lags & OPFLG_JUM
45f0: 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32  P)!=0 && pOp->p2
4600: 3c 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  <0 ){.      asse
4610: 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32  rt( ADDR(pOp->p2
4620: 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  )<pParse->nLabel
4630: 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70   );.      pOp->p
4640: 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28  2 = aLabel[ADDR(
4650: 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 7d  pOp->p2)];.    }
4660: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62  .  }.  sqlite3Db
4670: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72  Free(p->db, pPar
4680: 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70  se->aLabel);.  p
4690: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20  Parse->aLabel = 
46a0: 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61  0;.  pParse->nLa
46b0: 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78  bel = 0;.  *pMax
46c0: 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41  FuncArgs = nMaxA
46d0: 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rgs;.  assert( p
46e0: 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c  ->bIsReader!=0 |
46f0: 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  | DbMaskAllZero(
4700: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
4710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4720: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
4730: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
4740: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72  tion to be inser
4750: 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
4760: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
4770: 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61  dr(Vdbe *p){.  a
4780: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
4790: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
47a0: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   );.  return p->
47b0: 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65  nOp;.}../*.** Ve
47c0: 72 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61  rify that at lea
47d0: 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74  st N opcode slot
47e0: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
47f0: 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20  in p without.** 
4800: 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63  having to malloc
4810: 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20   for more space 
4820: 28 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d  (except when com
4830: 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53  piled using.** S
4840: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
4850: 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69  OC_STRESS).  Thi
4860: 73 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75  s interface is u
4870: 73 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69  sed during testi
4880: 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20  ng.** to verify 
4890: 74 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c  that certain cal
48a0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ls to sqlite3Vdb
48b0: 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e  eAddOpList() can
48c0: 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64   never.** fail d
48d0: 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c  ue to a OOM faul
48e0: 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74  t and hence that
48f0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
4900: 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  e from.** sqlite
4910: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29  3VdbeAddOpList()
4920: 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20   will always be 
4930: 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66  non-NULL..*/.#if
4940: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
4950: 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
4960: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52  ed(SQLITE_TEST_R
4970: 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76  EALLOC_STRESS).v
4980: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56  oid sqlite3VdbeV
4990: 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71  erifyNoMallocReq
49a0: 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69  uired(Vdbe *p, i
49b0: 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28  nt N){.  assert(
49c0: 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70   p->nOp + N <= p
49d0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
49e0: 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oc );.}.#endif..
49f0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4a00: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
4a10: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
4a20: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
4a30: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
4a40: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
4a50: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
4a60: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
4a70: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
4a80: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
4a90: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
4aa0: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
4ab0: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
4ac0: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
4ad0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
4ae0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
4af0: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
4b00: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
4b10: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
4b20: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4b30: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
4b40: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
4b50: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
4b60: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
4b70: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
4b80: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
4b90: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
4ba0: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
4bb0: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
4bc0: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
4bd0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
4be0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
4bf0: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
4c00: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
4c10: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
4c20: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
4c30: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
4c40: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
4c50: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
4c60: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
4c70: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
4c80: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
4c90: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
4ca0: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
4cb0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  */.  assert( DbM
4cc0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
4cd0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72  reeMask) );..  r
4ce0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
4cf0: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a  , pnMaxArg);.  *
4d00: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  pnOp = p->nOp;. 
4d10: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72   p->aOp = 0;.  r
4d20: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a  eturn aOp;.}../*
4d30: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20  .** Add a whole 
4d40: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f  list of operatio
4d50: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ns to the operat
4d60: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75  ion stack.  Retu
4d70: 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20  rn a.** pointer 
4d80: 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65  to the first ope
4d90: 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e  ration inserted.
4da0: 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20  .**.** Non-zero 
4db0: 50 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  P2 arguments to 
4dc0: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
4dd0: 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
4de0: 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20  lly adjusted.** 
4df0: 73 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70  so that the jump
4e00: 20 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74   target is relat
4e10: 69 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74  ive to the first
4e20: 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72   operation inser
4e30: 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a  ted..*/.VdbeOp *
4e40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4e50: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  List(.  Vdbe *p,
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f       /* Add opco
4e80: 64 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61  des to the prepa
4e90: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  red statement */
4ea0: 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20  .  int nOp,     
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ec0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63  /* Number of opc
4ed0: 6f 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20  odes to add */. 
4ee0: 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73   VdbeOpList cons
4ef0: 74 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a  t *aOp,       /*
4f00: 20 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20   The opcodes to 
4f10: 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e  be added */.  in
4f20: 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20  t iLineno       
4f30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f             /* So
4f40: 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e  urce-file line n
4f50: 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f  umber of first o
4f60: 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  pcode */.){.  in
4f70: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
4f80: 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20  Out, *pFirst;.  
4f90: 61 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b  assert( nOp>0 );
4fa0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
4fb0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
4fc0: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d  INIT );.  if( p-
4fd0: 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e  >nOp + nOp > p->
4fe0: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
4ff0: 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28   && growOpArray(
5000: 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72  p, nOp) ){.    r
5010: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
5020: 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26  First = pOut = &
5030: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a  p->aOp[p->nOp];.
5040: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70    for(i=0; i<nOp
5050: 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f  ; i++, aOp++, pO
5060: 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d  ut++){.    pOut-
5070: 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f  >opcode = aOp->o
5080: 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d  pcode;.    pOut-
5090: 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20  >p1 = aOp->p1;. 
50a0: 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f     pOut->p2 = aO
50b0: 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72  p->p2;.    asser
50c0: 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b  t( aOp->p2>=0 );
50d0: 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65  .    if( (sqlite
50e0: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
50f0: 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f  aOp->opcode] & O
5100: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
5110: 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20   aOp->p2>0 ){.  
5120: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20      pOut->p2 += 
5130: 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  p->nOp;.    }.  
5140: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70    pOut->p3 = aOp
5150: 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  ->p3;.    pOut->
5160: 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55  p4type = P4_NOTU
5170: 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  SED;.    pOut->p
5180: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75  4.p = 0;.    pOu
5190: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
51a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
51b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
51c0: 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d  .    pOut->zComm
51d0: 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ent = 0;.#endif.
51e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
51f0: 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20  BE_COVERAGE.    
5200: 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d  pOut->iSrcLine =
5210: 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73   iLineno+i;.#els
5220: 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e  e.    (void)iLin
5230: 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  eno;.#endif.#ifd
5240: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
5250: 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66      if( p->db->f
5260: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
5270: 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
5280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
5290: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d  ePrintOp(0, i+p-
52a0: 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  >nOp, &p->aOp[i+
52b0: 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a  p->nOp]);.    }.
52c0: 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e  #endif.  }.  p->
52d0: 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65  nOp += nOp;.  re
52e0: 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a  turn pFirst;.}..
52f0: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5300: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
5310: 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a  CANSTATUS)./*.**
5320: 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   Add an entry to
5330: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f   the array of co
5340: 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62  unters managed b
5350: 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  y sqlite3_stmt_s
5360: 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a  canstatus()..*/.
5370: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5380: 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64  ScanStatus(.  Vd
5390: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
53b0: 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73   VM to add scans
53c0: 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20  tatus() to */.  
53d0: 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c  int addrExplain,
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
5400: 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20  _Explain (or 0) 
5410: 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f  */.  int addrLoo
5420: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5430: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5440: 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  of loop counter 
5450: 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69  */ .  int addrVi
5460: 73 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  sit,            
5470: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
5480: 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64   of rows visited
5490: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f   counter */.  Lo
54a0: 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20  gEst nEst,      
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
54c0: 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65   Estimated numbe
54d0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
54e0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
54f0: 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20   *zName         
5500: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
5510: 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20   table or index 
5520: 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f  being scanned */
5530: 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20  .){.  int nByte 
5540: 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a  = (p->nScan+1) *
5550: 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74   sizeof(ScanStat
5560: 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75  us);.  ScanStatu
5570: 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20  s *aNew;.  aNew 
5580: 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73  = (ScanStatus*)s
5590: 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28  qlite3DbRealloc(
55a0: 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c  p->db, p->aScan,
55b0: 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61   nByte);.  if( a
55c0: 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53  New ){.    ScanS
55d0: 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61  tatus *pNew = &a
55e0: 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b  New[p->nScan++];
55f0: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45  .    pNew->addrE
5600: 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70  xplain = addrExp
5610: 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  lain;.    pNew->
5620: 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c  addrLoop = addrL
5630: 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  oop;.    pNew->a
5640: 64 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56  ddrVisit = addrV
5650: 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  isit;.    pNew->
5660: 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20  nEst = nEst;.   
5670: 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73   pNew->zName = s
5680: 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70  qlite3DbStrDup(p
5690: 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ->db, zName);.  
56a0: 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65    p->aScan = aNe
56b0: 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  w;.  }.}.#endif.
56c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
56d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
56e0: 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50  opcode, or P1, P
56f0: 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65  2, P3, or P5 ope
5700: 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73  rands.** for a s
5710: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
5720: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
5730: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70  ite3VdbeChangeOp
5740: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33  code(Vdbe *p, u3
5750: 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f  2 addr, u8 iNewO
5760: 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65  pcode){.  sqlite
5770: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5780: 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65  r)->opcode = iNe
5790: 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20  wOpcode;.}.void 
57a0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
57b0: 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP1(Vdbe *p, u32
57c0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
57d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
57e0: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20  tOp(p,addr)->p1 
57f0: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
5800: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5810: 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  2(Vdbe *p, u32 a
5820: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
5830: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5840: 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20  p(p,addr)->p2 = 
5850: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
5860: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
5870: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
5880: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
5890: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
58a0: 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61  p,addr)->p3 = va
58b0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
58c0: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64  3VdbeChangeP5(Vd
58d0: 62 65 20 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20  be *p, u8 p5){. 
58e0: 20 69 66 28 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c   if( !p->db->mal
58f0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 70 2d 3e 61  locFailed ) p->a
5900: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20  Op[p->nOp-1].p5 
5910: 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  = p5;.}../*.** C
5920: 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65  hange the P2 ope
5930: 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74  rand of instruct
5940: 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74  ion addr so that
5950: 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a   it points to.**
5960: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
5970: 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63  the next instruc
5980: 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64  tion to be coded
5990: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
59a0: 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64  3VdbeJumpHere(Vd
59b0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
59c0: 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  {.  p->pParse->i
59d0: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
59e0: 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 56   - 1;.  sqlite3V
59f0: 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61  dbeChangeP2(p, a
5a00: 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a  ddr, p->nOp);.}.
5a10: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69  ../*.** If the i
5a20: 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72  nput FuncDef str
5a30: 75 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65  ucture is epheme
5a40: 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69  ral, then free i
5a50: 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75  t.  If.** the Fu
5a60: 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68  ncDef is not eph
5a70: 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e  ermal, then do n
5a80: 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  othing..*/.stati
5a90: 63 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d  c void freeEphem
5aa0: 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c  eralFunction(sql
5ab0: 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65  ite3 *db, FuncDe
5ac0: 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20  f *pDef){.  if( 
5ad0: 41 4c 57 41 59 53 28 70 44 65 66 29 20 26 26 20  ALWAYS(pDef) && 
5ae0: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
5af0: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
5b00: 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20  PHEM)!=0 ){.    
5b10: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5b20: 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a  , pDef);.  }.}..
5b30: 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
5b40: 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69  FreeOpArray(sqli
5b50: 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74  te3 *, Op *, int
5b60: 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  );../*.** Delete
5b70: 20 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e   a P4 value if n
5b80: 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61  ecessary..*/.sta
5b90: 74 69 63 20 76 6f 69 64 20 66 72 65 65 50 34 28  tic void freeP4(
5ba0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
5bb0: 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20 2a 70   p4type, void *p
5bc0: 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29 7b 0a  4){.  if( p4 ){.
5bd0: 20 20 20 20 61 73 73 65 72 74 28 20 64 62 20 29      assert( db )
5be0: 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 70 34  ;.    switch( p4
5bf0: 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 63 61  type ){.      ca
5c00: 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a 20 7b  se P4_FUNCCTX: {
5c10: 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70 68  .        freeEph
5c20: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
5c30: 62 2c 20 28 28 73 71 6c 69 74 65 33 5f 63 6f 6e  b, ((sqlite3_con
5c40: 74 65 78 74 2a 29 70 34 29 2d 3e 70 46 75 6e 63  text*)p4)->pFunc
5c50: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61  );.        /* Fa
5c60: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
5c70: 74 68 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f  the next case */
5c80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5c90: 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20  ase P4_REAL:.   
5ca0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34     case P4_INT64
5cb0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  :.      case P4_
5cc0: 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20 63  DYNAMIC:.      c
5cd0: 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a  ase P4_INTARRAY:
5ce0: 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
5cf0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34 29  e3DbFree(db, p4)
5d00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
5d10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
5d20: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
5d30: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5d40: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5d50: 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 ) sqlite3KeyIn
5d60: 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f  foUnref((KeyInfo
5d70: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62  *)p4);.        b
5d80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69  reak;.      }.#i
5d90: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5da0: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a  LE_CURSOR_HINTS.
5db0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 45 58        case P4_EX
5dc0: 50 52 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  PR: {.        sq
5dd0: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5de0: 64 62 2c 20 28 45 78 70 72 2a 29 70 34 29 3b 0a  db, (Expr*)p4);.
5df0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5e00: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
5e10: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49      case P4_MPRI
5e20: 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  NTF: {.        i
5e30: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
5e40: 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33  eed==0 ) sqlite3
5e50: 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20  _free(p4);.     
5e60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5e70: 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f  }.      case P4_
5e80: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
5e90: 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c     freeEphemeral
5ea0: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46 75  Function(db, (Fu
5eb0: 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20 20  ncDef*)p4);.    
5ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5ed0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
5ee0: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20 20  _MEM: {.        
5ef0: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
5f00: 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  reed==0 ){.     
5f10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75       sqlite3Valu
5f20: 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f 76  eFree((sqlite3_v
5f30: 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20 20  alue*)p4);.     
5f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5f50: 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d 65      Mem *p = (Me
5f60: 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20 20  m*)p4;.         
5f70: 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63   if( p->szMalloc
5f80: 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65   ) sqlite3DbFree
5f90: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
5fa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
5fb0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
5fc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
5fe0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
5ff0: 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20 20  _VTAB : {.      
6000: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
6010: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
6020: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28 56  te3VtabUnlock((V
6030: 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20 20  Table *)p4);.   
6040: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6050: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a    }.    }.  }.}.
6060: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
6070: 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  space allocated 
6080: 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20  for aOp and any 
6090: 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61  p4 values alloca
60a0: 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f  ted for the.** o
60b0: 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64  pcodes contained
60c0: 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20   within. If aOp 
60d0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69  is not NULL it i
60e0: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e  s assumed to con
60f0: 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74  tain .** nOp ent
6100: 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  ries. .*/.static
6110: 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70   void vdbeFreeOp
6120: 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64  Array(sqlite3 *d
6130: 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20  b, Op *aOp, int 
6140: 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20  nOp){.  if( aOp 
6150: 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  ){.    Op *pOp;.
6160: 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b      for(pOp=aOp;
6170: 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20   pOp<&aOp[nOp]; 
6180: 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  pOp++){.      if
6190: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 20  ( pOp->p4type ) 
61a0: 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e  freeP4(db, pOp->
61b0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
61c0: 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  p);.#ifdef SQLIT
61d0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
61e0: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
61f0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
6200: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
6210: 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20  ;.#endif     .  
6220: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
6230: 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29  3DbFree(db, aOp)
6240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20  ;.}../*.** Link 
6250: 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f  the SubProgram o
6260: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
6270: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
6280: 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e  ent into the lin
6290: 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56  ked.** list at V
62a0: 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e  dbe.pSubProgram.
62b0: 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73   This list is us
62c0: 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c  ed to delete all
62d0: 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20   sub-program.** 
62e0: 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65  objects when the
62f0: 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72   VM is no longer
6300: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f   required..*/.vo
6310: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  id sqlite3VdbeLi
6320: 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62  nkSubProgram(Vdb
6330: 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f  e *pVdbe, SubPro
6340: 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70  gram *p){.  p->p
6350: 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50  Next = pVdbe->pP
6360: 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d  rogram;.  pVdbe-
6370: 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d  >pProgram = p;.}
6380: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
6390: 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64  he opcode at add
63a0: 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a  r into OP_Noop.*
63b0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
63c0: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
63d0: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
63e0: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  {.  VdbeOp *pOp;
63f0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
6400: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
6410: 75 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28  urn 0;.  assert(
6420: 20 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72   addr>=0 && addr
6430: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70  <p->nOp );.  pOp
6440: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
6450: 3b 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62  ;.  freeP4(p->db
6460: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
6470: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70  Op->p4.p);.  pOp
6480: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
6490: 54 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34  TUSED;.  pOp->p4
64a0: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f  .z = 0;.  pOp->o
64b0: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
64c0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
64d0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73  /*.** If the las
64e0: 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22  t opcode is "op"
64f0: 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61   and it is not a
6500: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
6510: 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76  n,.** then remov
6520: 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72  e it.  Return tr
6530: 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ue if and only i
6540: 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20  f an opcode was 
6550: 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
6560: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
6570: 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62  ePriorOpcode(Vdb
6580: 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20  e *p, u8 op){.  
6590: 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28  if( (p->nOp-1)>(
65a0: 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65  p->pParse->iFixe
65b0: 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70  dOp) && p->aOp[p
65c0: 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d  ->nOp-1].opcode=
65d0: 3d 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  =op ){.    retur
65e0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  n sqlite3VdbeCha
65f0: 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e  ngeToNoop(p, p->
6600: 6e 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  nOp-1);.  }else{
6610: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
6620: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e   }.}../*.** Chan
6630: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
6640: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66  the P4 operand f
6650: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
6660: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
6670: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
6680: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
6690: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
66a0: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
66b0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
66c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
66d0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
66e0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
66f0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
6700: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
6710: 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74  .**.** If n>=0 t
6720: 68 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61  hen the P4 opera
6730: 6e 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d  nd is dynamic, m
6740: 65 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f  eaning that a co
6750: 70 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72  py of.** the str
6760: 69 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f  ing is made into
6770: 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
6780: 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
6790: 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c  lloc()..** A val
67a0: 75 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73  ue of n==0 means
67b0: 20 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a   copy bytes of z
67c0: 50 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63  P4 up to and inc
67d0: 6c 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69  luding the.** fi
67e0: 72 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20  rst null byte.  
67f0: 49 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79  If n>0 then copy
6800: 20 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50   n+1 bytes of zP
6810: 34 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20  4..** .** Other 
6820: 76 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f  values of n (P4_
6830: 53 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53  STATIC, P4_COLLS
6840: 45 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74  EQ etc.) indicat
6850: 65 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74  e that zP4 point
6860: 73 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67  s.** to a string
6870: 20 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68   or structure th
6880: 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
6890: 20 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68   to exist for th
68a0: 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a  e lifetime of.**
68b0: 20 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68   the Vdbe. In th
68c0: 65 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e  ese cases we can
68d0: 20 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70   just copy the p
68e0: 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  ointer..**.** If
68f0: 20 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61   addr<0 then cha
6900: 6e 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  nge P4 on the mo
6910: 73 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65  st recently inse
6920: 72 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e  rted instruction
6930: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6940: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
6950: 20 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c   vdbeChangeP4Ful
6960: 6c 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20  l(.  Vdbe *p,.  
6970: 4f 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74  Op *pOp,.  const
6980: 20 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e   char *zP4,.  in
6990: 74 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70  t n.){.  if( pOp
69a0: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
69b0: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
69c0: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
69d0: 70 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  p4.p);.    pOp->
69e0: 70 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20  p4type = 0;.    
69f0: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
6a00: 20 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a   }.  if( n<0 ){.
6a10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
6a20: 68 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29  hangeP4(p, (int)
6a30: 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20  (pOp - p->aOp), 
6a40: 7a 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  zP4, n);.  }else
6a50: 7b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29  {.    if( n==0 )
6a60: 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
6a70: 65 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70  en30(zP4);.    p
6a80: 4f 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74  Op->p4.z = sqlit
6a90: 65 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64  e3DbStrNDup(p->d
6aa0: 62 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20  b, zP4, n);.    
6ab0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
6ac0: 5f 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a  _DYNAMIC;.  }.}.
6ad0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6ae0: 43 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70  ChangeP4(Vdbe *p
6af0: 2c 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73  , int addr, cons
6b00: 74 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74  t char *zP4, int
6b10: 20 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a   n){.  Op *pOp;.
6b20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
6b30: 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b   assert( p!=0 );
6b40: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
6b50: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
6b60: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
6b70: 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  IT );.  assert( 
6b80: 70 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d  p->aOp!=0 || db-
6b90: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
6ba0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
6bb0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
6bc0: 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20  f( n!=P4_VTAB ) 
6bd0: 66 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76  freeP4(db, n, (v
6be0: 6f 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a  oid*)*(char**)&z
6bf0: 50 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  P4);.    return;
6c00: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
6c10: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73  ->nOp>0 );.  ass
6c20: 65 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70  ert( addr<p->nOp
6c30: 20 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30   );.  if( addr<0
6c40: 20 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70   ){.    addr = p
6c50: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20  ->nOp - 1;.  }. 
6c60: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61   pOp = &p->aOp[a
6c70: 64 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30  ddr];.  if( n>=0
6c80: 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20   || pOp->p4type 
6c90: 29 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67  ){.    vdbeChang
6ca0: 65 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20  eP4Full(p, pOp, 
6cb0: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74  zP4, n);.    ret
6cc0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  urn;.  }.  if( n
6cd0: 3d 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20  ==P4_INT32 ){.  
6ce0: 20 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20    /* Note: this 
6cf0: 63 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65  cast is safe, be
6d00: 63 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e  cause the origin
6d10: 20 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20   data point was 
6d20: 61 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68  an int.    ** th
6d30: 61 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61  at was cast to a
6d40: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e   (const char *).
6d50: 20 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   */.    pOp->p4.
6d60: 69 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  i = SQLITE_PTR_T
6d70: 4f 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20  O_INT(zP4);.    
6d80: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
6d90: 5f 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20  _INT32;.  }else 
6da0: 69 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20  if( zP4!=0 ){.  
6db0: 20 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b    assert( n<0 );
6dc0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d  .    pOp->p4.p =
6dd0: 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20   (void*)zP4;.   
6de0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28   pOp->p4type = (
6df0: 73 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20  signed char)n;. 
6e00: 20 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41     if( n==P4_VTA
6e10: 42 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c  B ) sqlite3VtabL
6e20: 6f 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34  ock((VTable*)zP4
6e30: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
6e40: 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68  Set the P4 on th
6e50: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6e60: 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20  added opcode to 
6e70: 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20  the KeyInfo for 
6e80: 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76  the.** index giv
6e90: 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  en..*/.void sqli
6ea0: 74 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49  te3VdbeSetP4KeyI
6eb0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
6ec0: 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b  e, Index *pIdx){
6ed0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
6ee0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73  rse->pVdbe;.  as
6ef0: 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20  sert( v!=0 );.  
6f00: 61 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20  assert( pIdx!=0 
6f10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
6f20: 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20  ChangeP4(v, -1, 
6f30: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65  (char*)sqlite3Ke
6f40: 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61  yInfoOfIndex(pPa
6f50: 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20  rse, pIdx),.    
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d    P4_KEYINFO);.}
6f80: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6f90: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6fa0: 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68  OMMENTS./*.** Ch
6fb0: 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ange the comment
6fc0: 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   on the most rec
6fd0: 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ently coded inst
6fe0: 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20  ruction.  Or.** 
6ff0: 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61  insert a No-op a
7000: 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65  nd add the comme
7010: 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69  nt to that new i
7020: 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69  nstruction.  Thi
7030: 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63  s.** makes the c
7040: 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65  ode easier to re
7050: 61 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67  ad during debugg
7060: 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68  ing.  None of th
7070: 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e  is happens.** in
7080: 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
7090: 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ild..*/.static v
70a0: 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74  oid vdbeVComment
70b0: 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20  (Vdbe *p, const 
70c0: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76  char *zFormat, v
70d0: 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73  a_list ap){.  as
70e0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c  sert( p->nOp>0 |
70f0: 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20  | p->aOp==0 );. 
7100: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d   assert( p->aOp=
7110: 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e  =0 || p->aOp[p->
7120: 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d  nOp-1].zComment=
7130: 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c  =0 || p->db->mal
7140: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
7150: 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  f( p->nOp ){.   
7160: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20   assert( p->aOp 
7170: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
7180: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61  Free(p->db, p->a
7190: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
71a0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61  mment);.    p->a
71b0: 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f  Op[p->nOp-1].zCo
71c0: 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56  mment = sqlite3V
71d0: 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a  MPrintf(p->db, z
71e0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d  Format, ap);.  }
71f0: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
7200: 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20  dbeComment(Vdbe 
7210: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
7220: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
7230: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
7240: 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73  f( p ){.    va_s
7250: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
7260: 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d  );.    vdbeVComm
7270: 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20  ent(p, zFormat, 
7280: 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28  ap);.    va_end(
7290: 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20  ap);.  }.}.void 
72a0: 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43  sqlite3VdbeNoopC
72b0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
72c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
72d0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
72e0: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
72f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
7300: 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f  dbeAddOp0(p, OP_
7310: 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74  Noop);.    va_st
7320: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
7330: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
7340: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
7350: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
7360: 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66  p);.  }.}.#endif
7370: 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a    /* NDEBUG */..
7380: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44  #ifdef SQLITE_VD
7390: 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a  BE_COVERAGE./*.*
73a0: 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
73b0: 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20  if the iSrcLine 
73c0: 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72  field for the pr
73d0: 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69  eviously coded i
73e0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
73f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
7400: 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62  etLineNumber(Vdb
7410: 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29  e *v, int iLine)
7420: 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47  {.  sqlite3VdbeG
7430: 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63  etOp(v,-1)->iSrc
7440: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a  Line = iLine;.}.
7450: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7460: 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a  _VDBE_COVERAGE *
7470: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
7480: 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61  the opcode for a
7490: 20 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20   given address. 
74a0: 20 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20   If the address 
74b0: 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72  is -1, then.** r
74c0: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
74d0: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
74e0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49   opcode..**.** I
74f0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
7500: 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20  ation error has 
7510: 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74  occurred prior t
7520: 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66  o the calling of
7530: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
7540: 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72  , then a pointer
7550: 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65   to a dummy Vdbe
7560: 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  Op will be retur
7570: 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64  ned.  That opcod
7580: 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65  e.** is readable
7590: 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c   but not writabl
75a0: 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20  e, though it is 
75b0: 63 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62  cast to a writab
75c0: 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65  le value..** The
75d0: 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d   return of a dum
75e0: 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73  my opcode allows
75f0: 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e   the call to con
7600: 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e  tinue functionin
7610: 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f  g.** after an OO
7620: 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20  M fault without 
7630: 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20  having to check 
7640: 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65  to see if the re
7650: 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68  turn from .** th
7660: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
7670: 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20  valid pointer.  
7680: 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20  But because the 
7690: 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20  dummy.opcode is 
76a0: 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c  0,.** dummy will
76b0: 20 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65   never be writte
76c0: 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76  n to.  This is v
76d0: 65 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20  erified by code 
76e0: 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a  inspection and.*
76f0: 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74  * by running wit
7700: 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56  h Valgrind..*/.V
7710: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
7720: 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c  beGetOp(Vdbe *p,
7730: 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a   int addr){.  /*
7740: 20 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74   C89 specifies t
7750: 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74  hat the constant
7760: 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65   "dummy" will be
7770: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
7780: 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20  all.  ** zeros, 
7790: 77 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74  which is correct
77a0: 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65  .  MSVC generate
77b0: 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76  s a warning, nev
77c0: 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20  ertheless. */.  
77d0: 73 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75  static VdbeOp du
77e0: 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  mmy;  /* Ignore 
77f0: 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67  the MSVC warning
7800: 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61   about no initia
7810: 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72  lizer */.  asser
7820: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
7830: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
7840: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
7850: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
7860: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73  p - 1;.  }.  ass
7870: 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26  ert( (addr>=0 &&
7880: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c   addr<p->nOp) ||
7890: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
78a0: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d  iled );.  if( p-
78b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
78c0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
78d0: 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b  (VdbeOp*)&dummy;
78e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
78f0: 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64  turn &p->aOp[add
7900: 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  r];.  }.}..#if d
7910: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
7920: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
7930: 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74  MENTS)./*.** Ret
7940: 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76  urn an integer v
7950: 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20  alue for one of 
7960: 74 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74  the parameters t
7970: 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70  o the opcode pOp
7980: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
7990: 79 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a  y character c..*
79a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61  /.static int tra
79b0: 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20  nslateP(char c, 
79c0: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a  const Op *pOp){.
79d0: 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72    if( c=='1' ) r
79e0: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20  eturn pOp->p1;. 
79f0: 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65   if( c=='2' ) re
7a00: 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20  turn pOp->p2;.  
7a10: 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74  if( c=='3' ) ret
7a20: 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69  urn pOp->p3;.  i
7a30: 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75  f( c=='4' ) retu
7a40: 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20  rn pOp->p4.i;.  
7a50: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a  return pOp->p5;.
7a60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
7a70: 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68   a string for th
7a80: 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c  e "comment" fiel
7a90: 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f  d of a VDBE opco
7aa0: 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a  de listing..**.*
7ab0: 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20  * The Synopsis: 
7ac0: 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74  field in comment
7ad0: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
7ae0: 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73  source file gets
7af0: 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f   converted.** to
7b00: 20 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67   an extra string
7b10: 20 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65   that is appende
7b20: 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
7b30: 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49  OpcodeName().  I
7b40: 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65  n the.** absence
7b50: 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e   of other commen
7b60: 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69  ts, this synopsi
7b70: 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f  s becomes the co
7b80: 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63  mment on the opc
7b90: 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61  ode..** Some tra
7ba0: 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a  nslation occurs:
7bb0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  .**.**       "PX
7bc0: 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d  "      ->  "r[X]
7bd0: 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50  ".**       "PX@P
7be0: 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58  Y"   ->  "r[X..X
7bf0: 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d  +Y-1]"  or "r[x]
7c00: 22 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31  " if y is 0 or 1
7c10: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
7c20: 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  +1" ->  "r[X..X+
7c30: 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22  Y]"    or "r[x]"
7c40: 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20   if y is 0.**   
7c50: 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e      "PY..PY"  ->
7c60: 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20    "r[X..Y]"     
7c70: 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c   or "r[x]" if y<
7c80: 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  =x.*/.static int
7c90: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
7ca0: 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70  .  const Op *pOp
7cb0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63  ,     /* The opc
7cc0: 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e  ode to be commen
7cd0: 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ted */.  const c
7ce0: 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50  har *zP4,   /* P
7cf0: 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e  reviously obtain
7d00: 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20  ed value for P4 
7d10: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70  */.  char *zTemp
7d20: 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65  ,       /* Write
7d30: 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
7d40: 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20    int nTemp     
7d50: 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76       /* Space av
7d60: 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70  ailable in zTemp
7d70: 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  [] */.){.  const
7d80: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a   char *zOpName;.
7d90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
7da0: 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e  ynopsis;.  int n
7db0: 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69  OpName;.  int ii
7dc0: 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  , jj;.  zOpName 
7dd0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
7de0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
7df0: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
7e00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
7e10: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
7e20: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
7e30: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
7e40: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
7e50: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
7e60: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
7e70: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
7e80: 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a   for(ii=jj=0; jj
7e90: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d  <nTemp-1 && (c =
7ea0: 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21   zSynopsis[ii])!
7eb0: 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  =0; ii++){.     
7ec0: 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20   if( c=='P' ){. 
7ed0: 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f         c = zSyno
7ee0: 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20  psis[++ii];.    
7ef0: 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29      if( c=='4' )
7f00: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7f10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7f20: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
7f30: 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20   "%s", zP4);.   
7f40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
7f50: 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20  =='X' ){.       
7f60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7f70: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
7f80: 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f  emp+jj, "%s", pO
7f90: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
7fa0: 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20          seenCom 
7fb0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
7fc0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
7fd0: 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65  t v1 = translate
7fe0: 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  P(c, pOp);.     
7ff0: 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20       int v2;.   
8000: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8010: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a  nprintf(nTemp-jj
8020: 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22  , zTemp+jj, "%d"
8030: 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20  , v1);.         
8040: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
8050: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50  nopsis+ii+1, "@P
8060: 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 2)==0 ){.    
8070: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b          ii += 3;
8080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20  .            jj 
8090: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
80a0: 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20  30(zTemp+jj);.  
80b0: 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74            v2 = t
80c0: 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70  ranslateP(zSynop
80d0: 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20  sis[ii], pOp);. 
80e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
80f0: 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73  trncmp(zSynopsis
8100: 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30  +ii+1,"+1",2)==0
8110: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8120: 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20    ii += 2;.     
8130: 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20           v2++;. 
8140: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
8150: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e           if( v2>
8160: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
8170: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8180: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8190: 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20  emp+jj, "..%d", 
81a0: 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20  v1+v2-1);.      
81b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
81c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
81d0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
81e0: 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d  +1, "..P3", 4)==
81f0: 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20  0 && pOp->p3==0 
8200: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
8210: 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  i += 4;.        
8220: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
8230: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
8240: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
8250: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  p+jj);.      }el
8260: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  se{.        zTem
8270: 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20  p[jj++] = c;.   
8280: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
8290: 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a  f( !seenCom && j
82a0: 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70  j<nTemp-5 && pOp
82b0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
82c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
82d0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
82e0: 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c  Temp+jj, "; %s",
82f0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
8300: 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c  .      jj += sql
8310: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
8320: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20  mp+jj);.    }.  
8330: 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29    if( jj<nTemp )
8340: 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a   zTemp[jj] = 0;.
8350: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d    }else if( pOp-
8360: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
8370: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8380: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8390: 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  "%s", pOp->zComm
83a0: 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73  ent);.    jj = s
83b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
83c0: 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Temp);.  }else{.
83d0: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
83e0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20  ;.    jj = 0;.  
83f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d  }.  return jj;.}
8400: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
8410: 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20  E_DEBUG */..#if 
8420: 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20  VDBE_DISPLAY_P4 
8430: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
8440: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
8450: 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61  HINTS)./*.** Tra
8460: 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45  nslate the P4.pE
8470: 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e  xpr value for an
8480: 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f   OP_CursorHint o
8490: 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a  pcode into text.
84a0: 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64  ** that can be d
84b0: 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20  isplayed in the 
84c0: 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50  P4 column of EXP
84d0: 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a  LAIN output..*/.
84e0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
84f0: 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63 63  layP4Expr(StrAcc
8500: 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45 78  um *p, Expr *pEx
8510: 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  pr){.  const cha
8520: 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73 77  r *zOp = 0;.  sw
8530: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8540: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ){.    case TK_S
8550: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c  TRING:.      sql
8560: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8570: 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  %Q", pExpr->u.zT
8580: 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  oken);.      bre
8590: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
85a0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73  INTEGER:.      s
85b0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
85c0: 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%d", pExpr->u.
85d0: 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62  iValue);.      b
85e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
85f0: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71  K_NULL:.      sq
8600: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8610: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 62  "NULL");.      b
8620: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8630: 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
8640: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
8650: 74 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20 70  tf(p, "r[%d]", p
8660: 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20  Expr->iTable);. 
8670: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8680: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
8690: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  LUMN: {.      if
86a0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
86b0: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  <0 ){.        sq
86c0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
86d0: 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20 20  "rowid");.      
86e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
86f0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8700: 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78   "c%d", (int)pEx
8710: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
8720: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8730: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8740: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f  e TK_LT:      zO
8750: 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62  p = "LT";      b
8760: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8770: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LE:      zOp =
8780: 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61   "LE";      brea
8790: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
87a0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  T:      zOp = "G
87b0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
87c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
87d0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b       zOp = "GE";
87e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
87f0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
8800: 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20    zOp = "NE";   
8810: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8820: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
8830: 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20  Op = "EQ";      
8840: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8850: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20  TK_IS:      zOp 
8860: 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65  = "IS";      bre
8870: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8880: 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22  ISNOT:   zOp = "
8890: 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b  ISNOT";   break;
88a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
88b0: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44  :     zOp = "AND
88c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
88d0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
88e0: 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20     zOp = "OR";  
88f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8900: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
8910: 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  zOp = "ADD";    
8920: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8930: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70   TK_STAR:    zOp
8940: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72   = "MUL";     br
8950: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8960: 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _MINUS:   zOp = 
8970: 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b  "SUB";     break
8980: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
8990: 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45  M:     zOp = "RE
89a0: 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  M";     break;. 
89b0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
89c0: 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e  D:  zOp = "BITAN
89d0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
89e0: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
89f0: 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20   zOp = "BITOR"; 
8a00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8a10: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f  e TK_SLASH:   zO
8a20: 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62  p = "DIV";     b
8a30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8a40: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_LSHIFT:  zOp =
8a50: 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61   "LSHIFT";  brea
8a60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8a70: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52  SHIFT:  zOp = "R
8a80: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
8a90: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
8aa0: 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43  AT:  zOp = "CONC
8ab0: 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AT";  break;.   
8ac0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
8ad0: 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b    zOp = "MINUS";
8ae0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8af0: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
8b00: 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20  Op = "PLUS";    
8b10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8b20: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20  TK_BITNOT:  zOp 
8b30: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65  = "BITNOT";  bre
8b40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8b50: 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  NOT:     zOp = "
8b60: 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  NOT";     break;
8b70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
8b80: 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e  ULL:  zOp = "ISN
8b90: 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ULL";  break;.  
8ba0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
8bb0: 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  L: zOp = "NOTNUL
8bc0: 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
8bd0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
8be0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8bf0: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
8c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
8c10: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
8c20: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8c30: 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29  f(p, "%s(", zOp)
8c40: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34 45  ;.    displayP4E
8c50: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 4c  xpr(p, pExpr->pL
8c60: 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45  eft);.    if( pE
8c70: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
8c80: 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41       sqlite3StrA
8c90: 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 2c  ccumAppend(p, ",
8ca0: 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69 73  ", 1);.      dis
8cb0: 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70 45  playP4Expr(p, pE
8cc0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
8cd0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 53    }.    sqlite3S
8ce0: 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c  trAccumAppend(p,
8cf0: 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a   ")", 1);.  }.}.
8d00: 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44  #endif /* VDBE_D
8d10: 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66  ISPLAY_P4 && def
8d20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
8d30: 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29  LE_CURSOR_HINTS)
8d40: 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f 44   */...#if VDBE_D
8d50: 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20  ISPLAY_P4./*.** 
8d60: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
8d70: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
8d80: 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65 72  the P4 parameter
8d90: 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a   for an opcode..
8da0: 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72  ** Use zTemp for
8db0: 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74 65   any required te
8dc0: 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20 73  mporary buffer s
8dd0: 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pace..*/.static 
8de0: 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28  char *displayP4(
8df0: 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a  Op *pOp, char *z
8e00: 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29  Temp, int nTemp)
8e10: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20  {.  char *zP4 = 
8e20: 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63 75  zTemp;.  StrAccu
8e30: 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  m x;.  assert( n
8e40: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 71  Temp>=20 );.  sq
8e50: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e 69  lite3StrAccumIni
8e60: 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c 20  t(&x, 0, zTemp, 
8e70: 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77 69  nTemp, 0);.  swi
8e80: 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70 65  tch( pOp->p4type
8e90: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34 5f   ){.    case P4_
8ea0: 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20  KEYINFO: {.     
8eb0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b 65   int j;.      Ke
8ec0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
8ed0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
8ee0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8ef0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8f00: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
8f10: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
8f20: 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70 4b  f(&x, "k(%d", pK
8f30: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
8f40: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
8f50: 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  j<pKeyInfo->nFie
8f60: 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ld; j++){.      
8f70: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
8f80: 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f   = pKeyInfo->aCo
8f90: 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63  ll[j];.        c
8fa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c  onst char *zColl
8fb0: 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c   = pColl ? pColl
8fc0: 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20 20  ->zName : "";.  
8fd0: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
8fe0: 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59 22  (zColl, "BINARY"
8ff0: 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20 22  )==0 ) zColl = "
9000: 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  B";.        sqli
9010: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9020: 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66 6f  ,%s%s", pKeyInfo
9030: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
9040: 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f 6c  ? "-" : "", zCol
9050: 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  l);.      }.    
9060: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
9070: 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22 2c  mAppend(&x, ")",
9080: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
9090: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
90a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
90b0: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
90c0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
90d0: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
90e0: 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70 45  r(&x, pOp->p4.pE
90f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  xpr);.      brea
9100: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
9110: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
9120: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
9130: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
9140: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
9150: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9160: 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22 2c  f(&x, "(%.20s)",
9170: 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a   pColl->zName);.
9180: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9190: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46   }.    case P4_F
91a0: 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20 20  UNCDEF: {.      
91b0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
91c0: 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a 20  pOp->p4.pFunc;. 
91d0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
91e0: 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22  ntf(&x, "%s(%d)"
91f0: 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70  , pDef->zName, p
9200: 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20  Def->nArg);.    
9210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9220: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
9230: 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46  UG.    case P4_F
9240: 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20  UNCCTX: {.      
9250: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20  FuncDef *pDef = 
9260: 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46  pOp->p4.pCtx->pF
9270: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
9280: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9290: 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e  s(%d)", pDef->zN
92a0: 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29  ame, pDef->nArg)
92b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
92c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
92d0: 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b  case P4_INT64: {
92e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
92f0: 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64 22  rintf(&x, "%lld"
9300: 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34 29  , *pOp->p4.pI64)
9310: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9320: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9330: 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20 20  _INT32: {.      
9340: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9350: 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34  x, "%d", pOp->p4
9360: 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .i);.      break
9370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9380: 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20   P4_REAL: {.    
9390: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
93a0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70  (&x, "%.16g", *p
93b0: 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20  Op->p4.pReal);. 
93c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
93d0: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
93e0: 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  M: {.      Mem *
93f0: 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  pMem = pOp->p4.p
9400: 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Mem;.      if( p
9410: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9420: 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20  _Str ){.        
9430: 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20  zP4 = pMem->z;. 
9440: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9450: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9460: 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  _Int ){.        
9470: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9480: 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d  x, "%lld", pMem-
9490: 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c  >u.i);.      }el
94a0: 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61  se if( pMem->fla
94b0: 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
94c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
94d0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e 31  XPrintf(&x, "%.1
94e0: 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b  6g", pMem->u.r);
94f0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9500: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9510: 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  EM_Null ){.     
9520: 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22 3b     zP4 = "NULL";
9530: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
9540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d        assert( pM
9550: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9560: 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20  Blob );.        
9570: 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a  zP4 = "(blob)";.
9580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9590: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
95a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
95b0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
95c0: 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a  case P4_VTAB: {.
95d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74        sqlite3_vt
95e0: 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d  ab *pVtab = pOp-
95f0: 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62  >p4.pVtab->pVtab
9600: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  ;.      sqlite3X
9610: 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61 62  Printf(&x, "vtab
9620: 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20  :%p", pVtab);.  
9630: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9640: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
9650: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
9660: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
9670: 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f 70     int *ai = pOp
9680: 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20 69  ->p4.ai;.      i
9690: 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20 20  nt n = ai[0];   
96a0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c 65  /* The first ele
96b0: 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41 52  ment of an INTAR
96c0: 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74 68  RAY is always th
96d0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e.              
96e0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e           ** coun
96f0: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
9700: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20 66  of elements to f
9710: 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 66  ollow */.      f
9720: 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=1; i<n; i++
9730: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
9740: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 2c  e3XPrintf(&x, ",
9750: 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20 20  %d", ai[i]);.   
9760: 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70     }.      zTemp
9770: 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20 20  [0] = '[';.     
9780: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
9790: 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c 20  Append(&x, "]", 
97a0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
97b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
97c0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b  P4_SUBPROGRAM: {
97d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
97e0: 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f 67 72  rintf(&x, "progr
97f0: 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  am");.      brea
9800: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9810: 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b 0a  e P4_ADVANCE: {.
9820: 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d        zTemp[0] =
9830: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
9840: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
9850: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20  lt: {.      zP4 
9860: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
9870: 20 20 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b     if( zP4==0 ){
9880: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a  .        zP4 = z
9890: 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54  Temp;.        zT
98a0: 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[0] = 0;.    
98b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
98c0: 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46  sqlite3StrAccumF
98d0: 69 6e 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73  inish(&x);.  ass
98e0: 65 72 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20  ert( zP4!=0 );. 
98f0: 20 72 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23   return zP4;.}.#
9900: 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49  endif /* VDBE_DI
9910: 53 50 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a  SPLAY_P4 */../*.
9920: 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68  ** Declare to th
9930: 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65 20  e Vdbe that the 
9940: 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20  BTree object at 
9950: 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73  db->aDb[i] is us
9960: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ed..**.** The pr
9970: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
9980: 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69  s need to know i
9990: 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f  n advance the co
99a0: 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a  mplete set of.**
99b0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
99c0: 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ses that will be
99d0: 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66   use.  A mask of
99e0: 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65 73   these databases
99f0: 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65  .** is maintaine
9a00: 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  d in p->btreeMas
9a10: 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d  k.  The p->lockM
9a20: 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65  ask value is the
9a30: 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d   subset of.** p-
9a40: 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61  >btreeMask of da
9a50: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
9a60: 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b  l require a lock
9a70: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9a80: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 56  3VdbeUsesBtree(V
9a90: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a  dbe *p, int i){.
9aa0: 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
9ab0: 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26  & i<p->db->nDb &
9ac0: 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  & i<(int)sizeof(
9ad0: 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20  yDbMask)*8 );.  
9ae0: 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73  assert( i<(int)s
9af0: 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61  izeof(p->btreeMa
9b00: 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73  sk)*8 );.  DbMas
9b10: 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73  kSet(p->btreeMas
9b20: 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d  k, i);.  if( i!=
9b30: 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72 65  1 && sqlite3Btre
9b40: 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d  eSharable(p->db-
9b50: 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a  >aDb[i].pBt) ){.
9b60: 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d      DbMaskSet(p-
9b70: 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20  >lockMask, i);. 
9b80: 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e   }.}..#if !defin
9b90: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
9ba0: 48 41 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a  HARED_CACHE)./*.
9bb0: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
9bc0: 63 6f 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70  compiled to supp
9bd0: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
9be0: 20 6d 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20   mode and to be 
9bf0: 74 68 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74  threadsafe,.** t
9c00: 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61  his routine obta
9c10: 69 6e 73 20 74 68 65 20 6d 75 74 65 78 20 61 73  ins the mutex as
9c20: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 65 61  sociated with ea
9c30: 63 68 20 42 74 53 68 61 72 65 64 20 73 74 72 75  ch BtShared stru
9c40: 63 74 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61  cture.** that ma
9c50: 79 20 62 65 20 61 63 63 65 73 73 65 64 20 62 79  y be accessed by
9c60: 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
9c70: 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49  s an argument. I
9c80: 6e 20 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c  n doing so it al
9c90: 73 6f 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42  so.** sets the B
9ca0: 74 53 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65  tShared.db membe
9cb0: 72 20 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65  r of each of the
9cc0: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
9cd0: 75 72 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a  ures, ensuring.*
9ce0: 2a 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65  * that the corre
9cf0: 63 74 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  ct busy-handler 
9d00: 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
9d10: 6b 65 64 20 69 66 20 72 65 71 75 69 72 65 64 2e  ked if required.
9d20: 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  .**.** If SQLite
9d30: 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61   is not threadsa
9d40: 66 65 20 62 75 74 20 64 6f 65 73 20 73 75 70 70  fe but does supp
9d50: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
9d60: 20 6d 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73   mode, then.** s
9d70: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
9d80: 28 29 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  () is invoked to
9d90: 20 73 65 74 20 74 68 65 20 42 74 53 68 61 72 65   set the BtShare
9da0: 64 2e 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a  d.db variables.*
9db0: 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68  * of all of BtSh
9dc0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 20  ared structures 
9dd0: 61 63 63 65 73 73 69 62 6c 65 20 76 69 61 20 74  accessible via t
9de0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
9df0: 6c 65 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65  le .** associate
9e00: 64 20 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a  d with the VM..*
9e10: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
9e20: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
9e30: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75   and does not su
9e40: 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63  pport shared-cac
9e50: 68 65 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a  he mode, this.**
9e60: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
9e70: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  o-op..**.** The 
9e80: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65  p->btreeMask fie
9e90: 6c 64 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  ld is a bitmask 
9ea0: 6f 66 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68  of all btrees th
9eb0: 61 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20  at the prepared 
9ec0: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20  .** statement p 
9ed0: 77 69 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20  will ever use.  
9ee0: 4c 65 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d  Let N be the num
9ef0: 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70  ber of bits in p
9f00: 2d 3e 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63  ->btreeMask.** c
9f10: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
9f20: 62 74 72 65 65 73 20 74 68 61 74 20 75 73 65 20  btrees that use 
9f30: 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20 54  shared cache.  T
9f40: 68 65 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20  hen the runtime 
9f50: 6f 66 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  of.** this routi
9f60: 6e 65 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20  ne is N*N.  But 
9f70: 61 73 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d  as N is rarely m
9f80: 6f 72 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73  ore than 1, this
9f90: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62   should not.** b
9fa0: 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  e a problem..*/.
9fb0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
9fc0: 45 6e 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a  Enter(Vdbe *p){.
9fd0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
9fe0: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
9ff0: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
a000: 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72  if( DbMaskAllZer
a010: 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29  o(p->lockMask) )
a020: 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65   return;  /* The
a030: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
a040: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a050: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
a060: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
a070: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
a080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
a090: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
a0a0: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
a0b0: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
a0c0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
a0d0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a0e0: 45 6e 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74  Enter(aDb[i].pBt
a0f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23  );.    }.  }.}.#
a100: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
a110: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a120: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
a130: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
a140: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  FE>0./*.** Unloc
a150: 6b 20 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72  k all of the btr
a160: 65 65 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c  ees previously l
a170: 6f 63 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20  ocked by a call 
a180: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  to sqlite3VdbeEn
a190: 74 65 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ter()..*/.static
a1a0: 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45   SQLITE_NOINLINE
a1b0: 20 76 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28   void vdbeLeave(
a1c0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
a1d0: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
a1e0: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
a1f0: 6e 74 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70  nt nDb;.  db = p
a200: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
a210: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
a220: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
a230: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
a240: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
a250: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
a260: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
a270: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
a280: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
a290: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 61 44  te3BtreeLeave(aD
a2a0: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
a2b0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
a2c0: 74 65 33 56 64 62 65 4c 65 61 76 65 28 56 64 62  te3VdbeLeave(Vdb
a2d0: 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d  e *p){.  if( DbM
a2e0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
a2f0: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
a300: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
a310: 20 63 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c   case */.  vdbeL
a320: 65 61 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69  eave(p);.}.#endi
a330: 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56  f..#if defined(V
a340: 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20  DBE_PROFILE) || 
a350: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
a360: 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  EBUG)./*.** Prin
a370: 74 20 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64  t a single opcod
a380: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
a390: 20 69 73 20 75 73 65 64 20 66 6f 72 20 64 65 62   is used for deb
a3a0: 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a  ugging only..*/.
a3b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a3c0: 50 72 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f  PrintOp(FILE *pO
a3d0: 75 74 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a  ut, int pc, Op *
a3e0: 70 4f 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  pOp){.  char *zP
a3f0: 34 3b 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35  4;.  char zPtr[5
a400: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b  0];.  char zCom[
a410: 31 30 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63  100];.  static c
a420: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
a430: 61 74 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73  at1 = "%4d %-13s
a440: 20 25 34 64 20 25 34 64 20 25 34 64 20 25 2d 31   %4d %4d %4d %-1
a450: 33 73 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20  3s %.2X %s\n";. 
a460: 20 69 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70   if( pOut==0 ) p
a470: 4f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20  Out = stdout;.  
a480: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
a490: 70 4f 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f  pOp, zPtr, sizeo
a4a0: 66 28 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66  f(zPtr));.#ifdef
a4b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
a4c0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
a4d0: 20 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74    displayComment
a4e0: 28 70 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c  (pOp, zP4, zCom,
a4f0: 20 73 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a   sizeof(zCom));.
a500: 23 65 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20  #else.  zCom[0] 
a510: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a  = 0;.#endif.  /*
a520: 20 4e 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65   NB:  The sqlite
a530: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75  3OpcodeName() fu
a540: 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
a550: 65 6e 74 65 64 20 62 79 20 63 6f 64 65 20 63 72  ented by code cr
a560: 65 61 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68  eated.  ** by th
a570: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
a580: 61 6e 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77  and mkopcodec.aw
a590: 6b 20 73 63 72 69 70 74 73 20 77 68 69 63 68 20  k scripts which 
a5a0: 65 78 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a  extract the.  **
a5b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
a5c0: 6d 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  m the vdbe.c sou
a5d0: 72 63 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70  rce text */.  fp
a5e0: 72 69 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72  rintf(pOut, zFor
a5f0: 6d 61 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20  mat1, pc, .     
a600: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
a610: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c  me(pOp->opcode),
a620: 20 70 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70   pOp->p1, pOp->p
a630: 32 2c 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c  2, pOp->p3, zP4,
a640: 20 70 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20   pOp->p5,.      
a650: 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75  zCom.  );.  fflu
a660: 73 68 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64  sh(pOut);.}.#end
a670: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  if../*.** Releas
a680: 65 20 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20  e an array of N 
a690: 4d 65 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a  Mem elements.*/.
a6a0: 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65  static void rele
a6b0: 61 73 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20  aseMemArray(Mem 
a6c0: 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66  *p, int N){.  if
a6d0: 28 20 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20  ( p && N ){.    
a6e0: 4d 65 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e  Mem *pEnd = &p[N
a6f0: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ];.    sqlite3 *
a700: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
a710: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
a720: 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f  reed ){.      do
a730: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
a740: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
a750: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
a760: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20  >zMalloc);.     
a770: 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70   }while( (++p)<p
a780: 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  End );.      ret
a790: 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  urn;.    }.    d
a7a0: 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  o{.      assert(
a7b0: 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c   (&p[1])==pEnd |
a7c0: 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e  | p[0].db==p[1].
a7d0: 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  db );.      asse
a7e0: 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43  rt( sqlite3VdbeC
a7f0: 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74  heckMemInvariant
a800: 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f  s(p) );..      /
a810: 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20  * This block is 
a820: 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65  really an inline
a830: 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c  d version of sql
a840: 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61  ite3VdbeMemRelea
a850: 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68  se().      ** th
a860: 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61  at takes advanta
a870: 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  ge of the fact t
a880: 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63  hat the memory c
a890: 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20  ell value is .  
a8a0: 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74      ** being set
a8b0: 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72   to NULL after r
a8c0: 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e  eleasing any dyn
a8d0: 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a  amic resources..
a8e0: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
a8f0: 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74  * The justificat
a900: 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74  ion for duplicat
a910: 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74  ing code is that
a920: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20   according to . 
a930: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e       ** callgrin
a940: 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61  d, this causes a
a950: 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61   certain test ca
a960: 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50  se to hit the CP
a970: 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20  U 4.7 .      ** 
a980: 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38  percent less (x8
a990: 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72  6 linux, gcc ver
a9a0: 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29  sion 4.1.2, -O6)
a9b0: 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20   than if .      
a9c0: 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c  ** sqlite3MemRel
a9d0: 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c  ease() were call
a9e0: 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69  ed from here. Wi
a9f0: 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d  th -O2, this jum
aa00: 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36  ps.      ** to 6
aa10: 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20  .6 percent. The 
aa20: 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73  test case is ins
aa30: 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73  erting 1000 rows
aa40: 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20   into a table . 
aa50: 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20       ** with no 
aa60: 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20  indexes using a 
aa70: 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20  single prepared 
aa80: 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74  INSERT statement
aa90: 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20  , bind() .      
aaa0: 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20  ** and reset(). 
aab0: 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75  Inserts are grou
aac0: 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73  ped into a trans
aad0: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
aae0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
aaf0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f   p->flags & MEM_
ab00: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73  Agg );.      tes
ab10: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
ab20: 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20  & MEM_Dyn );.   
ab30: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
ab40: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d  flags & MEM_Fram
ab50: 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  e );.      testc
ab60: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
ab70: 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20  MEM_RowSet );.  
ab80: 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73      if( p->flags
ab90: 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79  &(MEM_Agg|MEM_Dy
aba0: 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f  n|MEM_Frame|MEM_
abb0: 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20  RowSet) ){.     
abc0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
abd0: 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20  mRelease(p);.   
abe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
abf0: 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  szMalloc ){.    
ac00: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
ac10: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
ac20: 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a  );.        p->sz
ac30: 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
ac40: 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c    }..      p->fl
ac50: 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69  ags = MEM_Undefi
ac60: 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ned;.    }while(
ac70: 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20   (++p)<pEnd );. 
ac80: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
ac90: 74 65 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  te the linked li
aca0: 73 74 20 6f 66 20 41 75 78 44 61 74 61 20 73 74  st of AuxData st
acb0: 72 75 63 74 75 72 65 73 20 61 74 74 61 63 68 65  ructures attache
acc0: 64 20 74 6f 20 66 72 61 6d 65 20 2a 70 2e 0a 2a  d to frame *p..*
acd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 65  /.static void de
ace0: 6c 65 74 65 41 75 78 64 61 74 61 49 6e 46 72 61  leteAuxdataInFra
acf0: 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
ad00: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
ad10: 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d   AuxData *pAux =
ad20: 20 70 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20   p->pAuxData;.  
ad30: 77 68 69 6c 65 28 20 70 41 75 78 20 29 7b 0a 20  while( pAux ){. 
ad40: 20 20 20 41 75 78 44 61 74 61 20 2a 70 4e 65 78     AuxData *pNex
ad50: 74 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b  t = pAux->pNext;
ad60: 0a 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78  .    if( pAux->x
ad70: 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
ad80: 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
ad90: 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 7d  ux->pAux);.    }
ada0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
adb0: 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  ee(db, pAux);.  
adc0: 20 20 70 41 75 78 20 3d 20 70 4e 65 78 74 3b 0a    pAux = pNext;.
add0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c    }.}../*.** Del
ade0: 65 74 65 20 61 20 56 64 62 65 46 72 61 6d 65 20  ete a VdbeFrame 
adf0: 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63  object and its c
ae00: 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61  ontents. VdbeFra
ae10: 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a  me objects are.*
ae20: 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  * allocated by t
ae30: 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70  he OP_Program op
ae40: 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56  code in sqlite3V
ae50: 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f  dbeExec()..*/.vo
ae60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  id sqlite3VdbeFr
ae70: 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72  ameDelete(VdbeFr
ae80: 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  ame *p){.  int i
ae90: 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20  ;.  Mem *aMem = 
aea0: 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b  VdbeFrameMem(p);
aeb0: 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a  .  VdbeCursor **
aec0: 61 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72  apCsr = (VdbeCur
aed0: 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e  sor **)&aMem[p->
aee0: 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f  nChildMem];.  fo
aef0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69  r(i=0; i<p->nChi
af00: 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ldCsr; i++){.   
af10: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65   sqlite3VdbeFree
af20: 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43  Cursor(p->v, apC
af30: 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  sr[i]);.  }.  re
af40: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d  leaseMemArray(aM
af50: 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  em, p->nChildMem
af60: 29 3b 0a 20 20 64 65 6c 65 74 65 41 75 78 64 61  );.  deleteAuxda
af70: 74 61 49 6e 46 72 61 6d 65 28 70 2d 3e 76 2d 3e  taInFrame(p->v->
af80: 64 62 2c 20 70 29 3b 0a 20 20 73 71 6c 69 74 65  db, p);.  sqlite
af90: 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62  3DbFree(p->v->db
afa0: 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  , p);.}..#ifndef
afb0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
afc0: 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20  LAIN./*.** Give 
afd0: 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65  a listing of the
afe0: 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20   program in the 
aff0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
b000: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72  .**.** The inter
b010: 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65  face is the same
b020: 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45   as sqlite3VdbeE
b030: 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74  xec().  But inst
b040: 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e  ead of.** runnin
b050: 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69  g the code, it i
b060: 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62  nvokes the callb
b070: 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63  ack once for eac
b080: 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  h instruction..*
b090: 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69  * This feature i
b0a0: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
b0b0: 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a  ent "EXPLAIN"..*
b0c0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
b0d0: 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e  lain==1, each in
b0e0: 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73  struction is lis
b0f0: 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d  ted.  When.** p-
b100: 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c  >explain==2, onl
b110: 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73  y OP_Explain ins
b120: 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69  tructions are li
b130: 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a  sted and these.*
b140: 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61  * are shown in a
b150: 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61   different forma
b160: 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  t.  p->explain==
b170: 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  2 is used to imp
b180: 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49  lement.** EXPLAI
b190: 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a  N QUERY PLAN..**
b1a0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
b1b0: 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68  ain==1, first th
b1c0: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69  e main program i
b1d0: 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65  s listed, then e
b1e0: 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72  ach of.** the tr
b1f0: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b200: 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65  s are listed one
b210: 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20   by one..*/.int 
b220: 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28  sqlite3VdbeList(
b230: 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20  .  Vdbe *p      
b240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b250: 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20  The VDBE */.){. 
b260: 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20   int nRow;      
b270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b280: 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68        /* Stop wh
b290: 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61  en row count rea
b2a0: 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69  ches this */.  i
b2b0: 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20  nt nSub = 0;    
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2d0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b2e0: 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20   sub-vdbes seen 
b2f0: 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50  so far */.  SubP
b300: 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d  rogram **apSub =
b310: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
b320: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
b330: 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20  -vdbes */.  Mem 
b340: 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20  *pSub = 0;      
b350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b360: 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
b370: 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75  hold array of su
b380: 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69  bprogs */.  sqli
b390: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
b3c0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
b3d0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3f0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b400: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
b410: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
b440: 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20  /.  Mem *pMem = 
b450: 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20  &p->aMem[1];    
b460: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
b470: 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20  t Mem of result 
b480: 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  set */..  assert
b490: 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a  ( p->explain );.
b4a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
b4b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
b4c0: 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  UN );.  assert( 
b4d0: 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
b4e0: 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54   || p->rc==SQLIT
b4f0: 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d  E_BUSY || p->rc=
b500: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
b510: 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75  ..  /* Even thou
b520: 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64  gh this opcode d
b530: 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61  oes not use dyna
b540: 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a  mic strings for.
b550: 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c    ** the result,
b560: 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20   result columns 
b570: 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d  may become dynam
b580: 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63  ic if the user c
b590: 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65  alls.  ** sqlite
b5a0: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28  3_column_text16(
b5b0: 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61  ), causing a tra
b5c0: 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d  nslation to UTF-
b5d0: 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a  16 encoding..  *
b5e0: 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  /.  releaseMemAr
b5f0: 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20  ray(pMem, 8);.  
b600: 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20  p->pResultSet = 
b610: 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d  0;..  if( p->rc=
b620: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b  =SQLITE_NOMEM_BK
b630: 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  PT ){.    /* Thi
b640: 73 20 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d  s happens if a m
b650: 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61  alloc() inside a
b660: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
b670: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f  _column_text() o
b680: 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  r.    ** sqlite3
b690: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
b6a0: 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20   failed.  */.   
b6b0: 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74   sqlite3OomFault
b6c0: 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (db);.    return
b6d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
b6e0: 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68   }..  /* When th
b6f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  e number of outp
b700: 75 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20  ut rows reaches 
b710: 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73  nRow, that means
b720: 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e   the.  ** listin
b730: 67 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61  g has finished a
b740: 6e 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nd sqlite3_step(
b750: 29 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20  ) should return 
b760: 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a  SQLITE_DONE..  *
b770: 2a 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75  * nRow is the su
b780: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
b790: 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d  of rows in the m
b7a0: 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75  ain program, plu
b7b0: 73 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f  s.  ** the sum o
b7c0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b7d0: 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67  rows in all trig
b7e0: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
b7f0: 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a  encountered.  **
b800: 20 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52   so far.  The nR
b810: 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e  ow value will in
b820: 63 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72  crease as new tr
b830: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b840: 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75  s are.  ** encou
b850: 6e 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70  ntered, but p->p
b860: 63 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c  c will eventuall
b870: 79 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52  y catch up to nR
b880: 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20  ow..  */.  nRow 
b890: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20  = p->nOp;.  if( 
b8a0: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b  p->explain==1 ){
b8b0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73  .    /* The firs
b8c0: 74 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  t 8 memory cells
b8d0: 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68   are used for th
b8e0: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53  e result set.  S
b8f0: 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  o we will.    **
b900: 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20   commandeer the 
b910: 39 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20  9th cell to use 
b920: 61 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  as storage for a
b930: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
b940: 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72  ers.    ** to tr
b950: 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d  igger subprogram
b960: 73 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20  s.  The VDBE is 
b970: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61  guaranteed to ha
b980: 76 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20  ve at least 9.  
b990: 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a    ** cells.  */.
b9a0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e      assert( p->n
b9b0: 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75  Mem>9 );.    pSu
b9c0: 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b  b = &p->aMem[9];
b9d0: 0a 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66  .    if( pSub->f
b9e0: 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b  lags&MEM_Blob ){
b9f0: 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65  .      /* On the
ba00: 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73   first call to s
ba10: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70  qlite3_step(), p
ba20: 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20  Sub will hold a 
ba30: 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20  NULL.  It is.   
ba40: 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65     ** initialize
ba50: 64 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74  d to a BLOB by t
ba60: 68 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d  he P4_SUBPROGRAM
ba70: 20 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69   processing logi
ba80: 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20  c below */.     
ba90: 20 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f   nSub = pSub->n/
baa0: 73 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20  sizeof(Vdbe*);. 
bab0: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
bac0: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
bad0: 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ->z;.    }.    f
bae0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20  or(i=0; i<nSub; 
baf0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77  i++){.      nRow
bb00: 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f   += apSub[i]->nO
bb10: 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  p;.    }.  }..  
bb20: 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70  do{.    i = p->p
bb30: 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  c++;.  }while( i
bb40: 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c  <nRow && p->expl
bb50: 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70  ain==2 && p->aOp
bb60: 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45  [i].opcode!=OP_E
bb70: 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20  xplain );.  if( 
bb80: 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70  i>=nRow ){.    p
bb90: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
bba0: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
bbb0: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20  E_DONE;.  }else 
bbc0: 69 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  if( db->u1.isInt
bbd0: 65 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20  errupted ){.    
bbe0: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49  p->rc = SQLITE_I
bbf0: 4e 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63  NTERRUPT;.    rc
bc00: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
bc10: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
bc20: 45 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33  Error(p, sqlite3
bc30: 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a  ErrStr(p->rc));.
bc40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
bc50: 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a  r *zP4;.    Op *
bc60: 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70  pOp;.    if( i<p
bc70: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f  ->nOp ){.      /
bc80: 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e  * The output lin
bc90: 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c  e number is smal
bca0: 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65  l enough that we
bcb0: 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68   are still in th
bcc0: 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20  e.      ** main 
bcd0: 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20  program. */.    
bce0: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
bcf0: 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  i];.    }else{. 
bd00: 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63       /* We are c
bd10: 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67  urrently listing
bd20: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46   subprograms.  F
bd30: 69 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20  igure out which 
bd40: 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  one and.      **
bd50: 20 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70   pick up the app
bd60: 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e  ropriate opcode.
bd70: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b   */.      int j;
bd80: 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e  .      i -= p->n
bd90: 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d  Op;.      for(j=
bda0: 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e  0; i>=apSub[j]->
bdb0: 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  nOp; j++){.     
bdc0: 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d     i -= apSub[j]
bdd0: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20  ->nOp;.      }. 
bde0: 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75       pOp = &apSu
bdf0: 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20  b[j]->aOp[i];.  
be00: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65    }.    if( p->e
be10: 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20  xplain==1 ){.   
be20: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
be30: 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
be40: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20  pMem->u.i = i;  
be50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be70: 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72   Program counter
be80: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b   */.      pMem++
be90: 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ;.  .      pMem-
bea0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61  >flags = MEM_Sta
beb0: 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  tic|MEM_Str|MEM_
bec0: 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d  Term;.      pMem
bed0: 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c  ->z = (char*)sql
bee0: 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70  ite3OpcodeName(p
bef0: 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20  Op->opcode); /* 
bf00: 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  Opcode */.      
bf10: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
bf20: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
bf30: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
bf40: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
bf50: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
bf60: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
bf70: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20       pMem++;..  
bf80: 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f      /* When an O
bf90: 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65  P_Program opcode
bfa0: 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74   is encounter (t
bfb0: 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74  he only opcode t
bfc0: 68 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a  hat has.      **
bfd0: 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d   a P4_SUBPROGRAM
bfe0: 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61   argument), expa
bff0: 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  nd the size of t
c000: 68 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  he array of subp
c010: 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a  rograms.      **
c020: 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d   kept in p->aMem
c030: 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68  [9].z to hold th
c040: 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20  e new program - 
c050: 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75  assuming this su
c060: 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a  bprogram.      *
c070: 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64  * has not alread
c080: 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20  y been seen..   
c090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
c0a0: 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  pOp->p4type==P4_
c0b0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
c0c0: 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20        int nByte 
c0d0: 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  = (nSub+1)*sizeo
c0e0: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
c0f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20          int j;. 
c100: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
c110: 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  j<nSub; j++){.  
c120: 20 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75          if( apSu
c130: 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50  b[j]==pOp->p4.pP
c140: 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a  rogram ) break;.
c150: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c160: 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26    if( j==nSub &&
c170: 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69   SQLITE_OK==sqli
c180: 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70  te3VdbeMemGrow(p
c190: 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62  Sub, nByte, nSub
c1a0: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  !=0) ){.        
c1b0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
c1c0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
c1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75  ;.          apSu
c1e0: 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d  b[nSub++] = pOp-
c1f0: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20  >p4.pProgram;.  
c200: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c          pSub->fl
c210: 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b  ags |= MEM_Blob;
c220: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
c230: 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66  >n = nSub*sizeof
c240: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
c250: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
c260: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d  .    }..    pMem
c270: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c280: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
c290: 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20   = pOp->p1;     
c2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c2b0: 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20       /* P1 */.  
c2c0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
c2d0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c2e0: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
c2f0: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20  u.i = pOp->p2;  
c300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c310: 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f          /* P2 */
c320: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
c330: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c340: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
c350: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33  m->u.i = pOp->p3
c360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33             /* P3
c380: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
c390: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c3a0: 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52  VdbeMemClearAndR
c3b0: 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29  esize(pMem, 100)
c3c0: 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20   ){ /* P4 */.   
c3d0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
c3e0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c3f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
c400: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
c410: 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61   }.    pMem->fla
c420: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
c430: 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d  _Term;.    zP4 =
c440: 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20   displayP4(pOp, 
c450: 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73  pMem->z, pMem->s
c460: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  zMalloc);.    if
c470: 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29  ( zP4!=pMem->z )
c480: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
c490: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65  dbeMemSetStr(pMe
c4a0: 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49  m, zP4, -1, SQLI
c4b0: 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20  TE_UTF8, 0);.   
c4c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
c4d0: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
c4e0: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
c4f0: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
c500: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
c510: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c520: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
c530: 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a   }.    pMem++;..
c540: 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61      if( p->expla
c550: 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69  in==1 ){.      i
c560: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
c570: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
c580: 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20  pMem, 4) ){.    
c590: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
c5a0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c5b0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c5c0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
c5e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c5f0: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
c600: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b      pMem->n = 2;
c610: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
c620: 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d  nprintf(3, pMem-
c630: 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d  >z, "%.2x", pOp-
c640: 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f  >p5);   /* P5 */
c650: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
c660: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
c670: 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20        pMem++;.  
c680: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
c690: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
c6a0: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28  MMENTS.      if(
c6b0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
c6c0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
c6d0: 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20  em, 500) ){.    
c6e0: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
c6f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c700: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
c710: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d        }.      pM
c730: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c740: 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20  Str|MEM_Term;.  
c750: 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69      pMem->n = di
c760: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70  splayComment(pOp
c770: 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20  , zP4, pMem->z, 
c780: 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  500);.      pMem
c790: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c7a0: 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  TF8;.#else.     
c7b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c7c0: 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20  EM_Null;        
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c7e0: 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e  * Comment */.#en
c7f0: 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  dif.    }..    p
c800: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38  ->nResColumn = 8
c810: 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e   - 4*(p->explain
c820: 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73  -1);.    p->pRes
c830: 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65  ultSet = &p->aMe
c840: 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20  m[1];.    p->rc 
c850: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
c860: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57   rc = SQLITE_ROW
c870: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
c880: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
c890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
c8a0: 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  IN */..#ifdef SQ
c8b0: 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
c8c0: 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74   Print the SQL t
c8d0: 68 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20  hat was used to 
c8e0: 67 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20  generate a VDBE 
c8f0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64  program..*/.void
c900: 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
c910: 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20  tSql(Vdbe *p){. 
c920: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
c930: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71   0;.  if( p->zSq
c940: 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e  l ){.    z = p->
c950: 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66  zSql;.  }else if
c960: 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20  ( p->nOp>=1 ){. 
c970: 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20     const VdbeOp 
c980: 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30  *pOp = &p->aOp[0
c990: 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  ];.    if( pOp->
c9a0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20  opcode==OP_Init 
c9b0: 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20  && pOp->p4.z!=0 
c9c0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70  ){.      z = pOp
c9d0: 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68  ->p4.z;.      wh
c9e0: 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70  ile( sqlite3Issp
c9f0: 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20  ace(*z) ) z++;. 
ca00: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a     }.  }.  if( z
ca10: 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20   ) printf("SQL: 
ca20: 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23  [%s]\n", z);.}.#
ca30: 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69  endif..#if !defi
ca40: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
ca50: 54 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65  TRACE) && define
ca60: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
ca70: 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50  IOTRACE)./*.** P
ca80: 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20  rint an IOTRACE 
ca90: 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20  message showing 
caa0: 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a  SQL content..*/.
cab0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
cac0: 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20  IOTraceSql(Vdbe 
cad0: 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d  *p){.  int nOp =
cae0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f   p->nOp;.  VdbeO
caf0: 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71  p *pOp;.  if( sq
cb00: 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20  lite3IoTrace==0 
cb10: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
cb20: 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a  nOp<1 ) return;.
cb30: 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b    pOp = &p->aOp[
cb40: 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f  0];.  if( pOp->o
cb50: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
cb60: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
cb70: 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  {.    int i, j;.
cb80: 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d      char z[1000]
cb90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
cba0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
cbb0: 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  , z, "%s", pOp->
cbc0: 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69  p4.z);.    for(i
cbd0: 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61  =0; sqlite3Isspa
cbe0: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
cbf0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b  .    for(j=0; z[
cc00: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
cc10: 69 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  if( sqlite3Isspa
cc20: 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20  ce(z[i]) ){.    
cc30: 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d      if( z[i-1]!=
cc40: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ' ' ){.         
cc50: 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20   z[j++] = ' ';. 
cc60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cc70: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b  else{.        z[
cc80: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20  j++] = z[i];.   
cc90: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a     }.    }.    z
cca0: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  [j] = 0;.    sql
ccb0: 69 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c  ite3IoTrace("SQL
ccc0: 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a   %s\n", z);.  }.
ccd0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c  }.#endif /* !SQL
cce0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26  ITE_OMIT_TRACE &
ccf0: 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
cd00: 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41  IOTRACE */../* A
cd10: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
cd20: 69 73 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69  is object descri
cd30: 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20  bes bulk memory 
cd40: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
cd50: 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f  e.** by subcompo
cd60: 6e 65 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61  nents of a prepa
cd70: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
cd80: 53 70 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74  Space is allocat
cd90: 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52  ed out.** of a R
cda0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
cdb0: 65 63 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63  ect by the alloc
cdc0: 53 70 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20  Space() routine 
cdd0: 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74  below..*/.struct
cde0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b   ReusableSpace {
cdf0: 0a 20 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20  .  u8 *pSpace;  
ce00: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
ce10: 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20  able memory */. 
ce20: 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20   int nFree;     
ce30: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
ce40: 66 20 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f  f available memo
ce50: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65  ry */.  int nNee
ce60: 64 65 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ded;         /* 
ce70: 54 6f 74 61 6c 20 62 79 74 65 73 20 74 68 61 74  Total bytes that
ce80: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c   could not be al
ce90: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
cea0: 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74  * Try to allocat
ceb0: 65 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66  e nByte bytes of
cec0: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
ced0: 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20  bulk memory for 
cee0: 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  pBuf.** from the
cef0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f   ReusableSpace o
cf00: 62 6a 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61  bject.  Return a
cf10: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
cf20: 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d  allocated.** mem
cf30: 6f 72 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ory on success. 
cf40: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
cf50: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
cf60: 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52  able in the.** R
cf70: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
cf80: 65 63 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68  ect, increase th
cf90: 65 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e  e ReusableSpace.
cfa0: 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65  nNeeded.** value
cfb0: 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e   by the amount n
cfc0: 65 65 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eeded and return
cfd0: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   NULL..**.** If 
cfe0: 70 42 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74  pBuf is not init
cff0: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74  ially NULL, that
d000: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
d010: 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61  memory has alrea
d020: 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  dy.** been alloc
d030: 61 74 65 64 20 62 79 20 61 20 70 72 69 6f 72 20  ated by a prior 
d040: 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
d050: 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65  tine, so just re
d060: 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f  turn a copy.** o
d070: 66 20 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65  f pBuf and leave
d080: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 75   ReusableSpace u
d090: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20  nchanged..**.** 
d0a0: 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69  This allocator i
d0b0: 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65  s employed to re
d0c0: 70 75 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73  purpose unused s
d0d0: 6c 6f 74 73 20 61 74 20 74 68 65 20 65 6e 64 20  lots at the end 
d0e0: 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65  of the.** opcode
d0f0: 20 61 72 72 61 79 20 6f 66 20 70 72 65 70 61 72   array of prepar
d100: 65 64 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68  ed state for oth
d110: 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20  er memory needs 
d120: 6f 66 20 74 68 65 20 70 72 65 70 61 72 65 64 0a  of the prepared.
d130: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f  ** statement..*/
d140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c  .static void *al
d150: 6c 6f 63 53 70 61 63 65 28 0a 20 20 73 74 72 75  locSpace(.  stru
d160: 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63 65  ct ReusableSpace
d170: 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65   *p,  /* Bulk me
d180: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
d190: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
d1a0: 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d1c0: 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69  Pointer to a pri
d1d0: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
d1e0: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20  .  int nByte    
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d200: 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  Bytes of memory 
d210: 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  needed */.){.  a
d220: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
d230: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70  E_ALIGNMENT(p->p
d240: 53 70 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20  Space) );.  if( 
d250: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e  pBuf==0 ){.    n
d260: 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42  Byte = ROUND8(nB
d270: 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42  yte);.    if( nB
d280: 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20  yte <= p->nFree 
d290: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65  ){.      p->nFre
d2a0: 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  e -= nByte;.    
d2b0: 20 20 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70    pBuf = &p->pSp
d2c0: 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20  ace[p->nFree];. 
d2d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d2e0: 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42  p->nNeeded += nB
d2f0: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
d300: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
d310: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
d320: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
d330: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
d340: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
d350: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
d360: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
d370: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
d380: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
d390: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
d3a0: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
d3b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
d3c0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
d3d0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
d3e0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
d3f0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
d400: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
d410: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
d420: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
d430: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
d440: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
d450: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
d460: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
d470: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
d480: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
d490: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
d4a0: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
d4b0: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
d4c0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
d4d0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
d4e0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
d4f0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
d500: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
d510: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
d520: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
d530: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
d540: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d550: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
d560: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
d570: 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
d580: 20 70 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31   p->cacheCtr = 1
d590: 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46  ;.  p->minWriteF
d5a0: 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b  ileFormat = 255;
d5b0: 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  .  p->iStatement
d5c0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f   = 0;.  p->nFkCo
d5d0: 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69  nstraint = 0;.#i
d5e0: 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
d5f0: 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  E.  for(i=0; i<p
d600: 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
d610: 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d   p->aOp[i].cnt =
d620: 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69   0;.    p->aOp[i
d630: 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20  ].cycles = 0;.  
d640: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
d650: 2a 20 50 72 65 70 61 72 65 20 61 20 76 69 72 74  * Prepare a virt
d660: 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20  ual machine for 
d670: 65 78 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68  execution for th
d680: 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 66 74  e first time aft
d690: 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74  er.** creating t
d6a0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
d6b0: 6e 65 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76  ne.  This involv
d6c0: 65 73 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a  es things such.*
d6d0: 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20  * as allocating 
d6e0: 72 65 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e  registers and in
d6f0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70  itializing the p
d700: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a  rogram counter..
d710: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 56 44 42  ** After the VDB
d720: 45 20 68 61 73 20 62 65 20 70 72 65 70 70 65 64  E has be prepped
d730: 2c 20 69 74 20 63 61 6e 20 62 65 20 65 78 65 63  , it can be exec
d740: 75 74 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d  uted by one or m
d750: 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20  ore.** calls to 
d760: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
d770: 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ).  .**.** This 
d780: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20  function may be 
d790: 63 61 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f  called exactly o
d7a0: 6e 63 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74  nce on each virt
d7b0: 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20  ual machine..** 
d7c0: 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
d7d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  ne is called the
d7e0: 20 56 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61   VM has been "pa
d7f0: 63 6b 61 67 65 64 22 20 61 6e 64 20 69 73 20 72  ckaged" and is r
d800: 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20  eady.** to run. 
d810: 20 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74   After this rout
d820: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66  ine is called, f
d830: 75 72 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20  urther calls to 
d840: 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41  .** sqlite3VdbeA
d850: 64 64 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73  ddOp() functions
d860: 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e   are prohibited.
d870: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64    This routine d
d880: 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68  isconnects.** th
d890: 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
d8a0: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61  Parse object tha
d8b0: 74 20 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74  t helped generat
d8c0: 65 20 69 74 20 73 6f 20 74 68 61 74 20 74 68 65  e it so that the
d8d0: 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 62 65 63  .** the Vdbe bec
d8e0: 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64  omes an independ
d8f0: 65 6e 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74  ent entity and t
d900: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
d910: 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f  can be.** destro
d920: 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74  yed..**.** Use t
d930: 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
d940: 77 69 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65  wind() procedure
d950: 20 74 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69   to restore a vi
d960: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61  rtual machine ba
d970: 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69  ck.** to its ini
d980: 74 69 61 6c 20 73 74 61 74 65 20 61 66 74 65 72  tial state after
d990: 20 69 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e   it has been run
d9a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d9b0: 33 56 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a  3VdbeMakeReady(.
d9c0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9e0: 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a   /* The VDBE */.
d9f0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
da20: 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ext */.){.  sqli
da30: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
da40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
da50: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
da60: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  ction */.  int n
da70: 56 61 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Var;            
da80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
da90: 62 65 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72  ber of parameter
daa0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b  s */.  int nMem;
dab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dac0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dad0: 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67  of VM memory reg
dae0: 69 73 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  isters */.  int 
daf0: 6e 43 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20  nCursor;        
db00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
db10: 6d 62 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20  mber of cursors 
db20: 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
db30: 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
db40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
db50: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
db60: 6e 74 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61  nts in subprogra
db70: 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63  ms */.  int nOnc
db80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
db90: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dba0: 20 6f 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74   of OP_Once inst
dbb0: 72 75 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e  ructions */.  in
dbc0: 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  t n;            
dbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dbe0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
dbf0: 20 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c    struct Reusabl
dc00: 65 53 70 61 63 65 20 78 3b 20 20 20 20 20 20 20  eSpace x;       
dc10: 20 2f 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c   /* Reusable bul
dc20: 6b 20 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61  k memory */..  a
dc30: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
dc40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
dc50: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
dc60: 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73  Parse!=0 );.  as
dc70: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
dc80: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
dc90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
dca0: 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29  rse==p->pParse )
dcb0: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
dcc0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61    assert( db->ma
dcd0: 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b  llocFailed==0 );
dce0: 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65  .  nVar = pParse
dcf0: 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d  ->nVar;.  nMem =
dd00: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20   pParse->nMem;. 
dd10: 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73   nCursor = pPars
dd20: 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20  e->nTab;.  nArg 
dd30: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72  = pParse->nMaxAr
dd40: 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61  g;.  nOnce = pPa
dd50: 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66  rse->nOnce;.  if
dd60: 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e  ( nOnce==0 ) nOn
dd70: 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72  ce = 1; /* Ensur
dd80: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62  e at least one b
dd90: 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46  yte in p->aOnceF
dda0: 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a  lag[] */.  .  /*
ddb0: 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f 72   For each cursor
ddc0: 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f 20   required, also 
ddd0: 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f 72  allocate a memor
dde0: 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a 20  y cell. Memory. 
ddf0: 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d 2b   ** cells (nMem+
de00: 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65 6d  1-nCursor)..nMem
de10: 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69 6c  , inclusive, wil
de20: 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  l never be used 
de30: 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62 65  by.  ** the vdbe
de40: 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65 61   program. Instea
de50: 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64 20  d they are used 
de60: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  to allocate memo
de70: 72 79 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ry for.  ** Vdbe
de80: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
de90: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
dea0: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
deb0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
dec0: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
ded0: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
dee0: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
def0: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
df00: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
df10: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
df20: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
df30: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
df40: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
df50: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
df60: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
df70: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
df80: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
df90: 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65  ow much reusable
dfa0: 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c   memory is avail
dfb0: 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20  able at the end 
dfc0: 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f  of the.  ** opco
dfd0: 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73 20  de array.  This 
dfe0: 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c  extra memory wil
dff0: 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64  l be reallocated
e000: 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65   for other eleme
e010: 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  nts.  ** of the 
e020: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e030: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52  nt..  */.  n = R
e040: 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29  OUND8(sizeof(Op)
e050: 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20  *p->nOp);       
e060: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
e070: 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  of opcode memory
e080: 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70   used */.  x.pSp
e090: 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e  ace = &((u8*)p->
e0a0: 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20  aOp)[n];        
e0b0: 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64         /* Unused
e0c0: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a   opcode memory *
e0d0: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  /.  assert( EIGH
e0e0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
e0f0: 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20  (x.pSpace) );.  
e100: 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44  x.nFree = ROUNDD
e110: 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f  OWN8(pParse->szO
e120: 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a  pAlloc - n);  /*
e130: 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   Bytes of unused
e140: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73   memory */.  ass
e150: 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20  ert( x.nFree>=0 
e160: 29 3b 0a 20 20 69 66 28 20 78 2e 6e 46 72 65 65  );.  if( x.nFree
e170: 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74  >0 ){.    memset
e180: 28 78 2e 70 53 70 61 63 65 2c 20 30 2c 20 78 2e  (x.pSpace, 0, x.
e190: 6e 46 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  nFree);.    asse
e1a0: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
e1b0: 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61  LIGNMENT(&x.pSpa
e1c0: 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a  ce[x.nFree]) );.
e1d0: 20 20 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32    }..  resolveP2
e1e0: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
e1f0: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
e200: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
e210: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
e220: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
e230: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
e240: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
e250: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
e260: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
e270: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
e280: 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66  ;..  /* Memory f
e290: 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70 61  or registers, pa
e2a0: 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72  rameters, cursor
e2b0: 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61  , etc, is alloca
e2c0: 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77  ted in one or tw
e2d0: 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20  o.  ** passes.  
e2e0: 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 73  On the first pas
e2f0: 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65 75  s, we try to reu
e300: 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79  se unused memory
e310: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
e320: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
e330: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
e340: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
e350: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
e360: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
e370: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
e380: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
e390: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
e3a0: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
e3b0: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
e3c0: 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20  mainder using a 
e3d0: 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c  fresh memory all
e3e0: 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a  ocation.  .  **.
e3f0: 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61    ** This two-pa
e400: 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61 74  ss approach that
e410: 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68 20   reuses as much 
e420: 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62  memory as possib
e430: 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65  le from.  ** the
e440: 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79   leftover memory
e450: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
e460: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
e470: 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69    This can signi
e480: 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65  ficantly.  ** re
e490: 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20  duce the amount 
e4a0: 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62  of memory held b
e4b0: 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  y a prepared sta
e4c0: 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64  tement..  */.  d
e4d0: 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65  o {.    x.nNeede
e4e0: 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d  d = 0;.    p->aM
e4f0: 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  em = allocSpace(
e500: 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65  &x, p->aMem, nMe
e510: 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a  m*sizeof(Mem));.
e520: 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c      p->aVar = al
e530: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
e540: 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f  aVar, nVar*sizeo
e550: 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e  f(Mem));.    p->
e560: 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61  apArg = allocSpa
e570: 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c  ce(&x, p->apArg,
e580: 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d   nArg*sizeof(Mem
e590: 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  *));.    p->apCs
e5a0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26  r = allocSpace(&
e5b0: 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75  x, p->apCsr, nCu
e5c0: 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65  rsor*sizeof(Vdbe
e5d0: 43 75 72 73 6f 72 2a 29 29 3b 0a 20 20 20 20 70  Cursor*));.    p
e5e0: 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c  ->aOnceFlag = al
e5f0: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
e600: 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65  aOnceFlag, nOnce
e610: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
e620: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
e630: 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61  NSTATUS.    p->a
e640: 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61  nExec = allocSpa
e650: 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63  ce(&x, p->anExec
e660: 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28  , p->nOp*sizeof(
e670: 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  i64));.#endif.  
e680: 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d    if( x.nNeeded=
e690: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
e6a0: 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46  x.pSpace = p->pF
e6b0: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
e6c0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 78 2e  allocZero(db, x.
e6d0: 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e  nNeeded);.    x.
e6e0: 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65  nFree = x.nNeede
e6f0: 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62  d;.  }while( !db
e700: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e710: 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  ;..  p->nCursor 
e720: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e  = nCursor;.  p->
e730: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63  nOnceFlag = nOnc
e740: 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72  e;.  if( p->aVar
e750: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20   ){.    p->nVar 
e760: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
e770: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
e780: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
e790: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
e7a0: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
e7b0: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
e7c0: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
e7d0: 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50  .  p->nzVar = pP
e7e0: 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70  arse->nzVar;.  p
e7f0: 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61 72 73 65  ->azVar = pParse
e800: 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61 72 73  ->azVar;.  pPars
e810: 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a 20  e->nzVar =  0;. 
e820: 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d   pParse->azVar =
e830: 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   0;.  if( p->aMe
e840: 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  m ){.    p->aMem
e850: 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  --;             
e860: 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d           /* aMem
e870: 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e  [] goes from 1..
e880: 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e  nMem */.    p->n
e890: 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20  Mem = nMem;     
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20              /*  
e8b0: 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e       not from 0.
e8c0: 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66  .nMem-1 */.    f
e8d0: 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b  or(n=1; n<=nMem;
e8e0: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
e8f0: 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aMem[n].flags = 
e900: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20  MEM_Undefined;. 
e910: 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e       p->aMem[n].
e920: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
e930: 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20   }.  p->explain 
e940: 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  = pParse->explai
e950: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  n;.  sqlite3Vdbe
e960: 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a  Rewind(p);.}../*
e970: 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45  .** Close a VDBE
e980: 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65   cursor and rele
e990: 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f  ase all the reso
e9a0: 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f  urces that curso
e9b0: 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f  r .** happens to
e9c0: 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73   hold..*/.void s
e9d0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
e9e0: 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64  rsor(Vdbe *p, Vd
e9f0: 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a  beCursor *pCx){.
ea00: 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a    if( pCx==0 ){.
ea10: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
ea20: 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70    assert( pCx->p
ea30: 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43  Bt==0 || pCx->eC
ea40: 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
ea50: 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63  BTREE );.  switc
ea60: 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65  h( pCx->eCurType
ea70: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52   ){.    case CUR
ea80: 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20  TYPE_SORTER: {. 
ea90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eaa0: 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64  SorterClose(p->d
eab0: 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62  b, pCx);.      b
eac0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ead0: 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52  case CURTYPE_BTR
eae0: 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  EE: {.      if( 
eaf0: 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pCx->pBt ){.    
eb00: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
eb10: 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b  Close(pCx->pBt);
eb20: 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  .        /* The 
eb30: 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c  pCx->pCursor wil
eb40: 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d  l be close autom
eb50: 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20  atically, if it 
eb60: 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20  exists, by.     
eb70: 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61     ** the call a
eb80: 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d  bove. */.      }
eb90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
eba0: 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43  sert( pCx->uc.pC
ebb0: 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20  ursor!=0 );.    
ebc0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ebd0: 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d  CloseCursor(pCx-
ebe0: 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20  >uc.pCursor);.  
ebf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
ec00: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
ec10: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
ec20: 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61  TUALTABLE.    ca
ec30: 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a  se CURTYPE_VTAB:
ec40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ec50: 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56  _vtab_cursor *pV
ec60: 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56  Cur = pCx->uc.pV
ec70: 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  Cur;.      const
ec80: 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20   sqlite3_module 
ec90: 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72  *pModule = pVCur
eca0: 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65  ->pVtab->pModule
ecb0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
ecc0: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52  pVCur->pVtab->nR
ecd0: 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56  ef>0 );.      pV
ece0: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
ecf0: 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c  --;.      pModul
ed00: 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29  e->xClose(pVCur)
ed10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
ed20: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
ed30: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
ed40: 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68  ll cursors in th
ed50: 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e  e current frame.
ed60: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
ed70: 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72  closeCursorsInFr
ed80: 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ame(Vdbe *p){.  
ed90: 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a  if( p->apCsr ){.
eda0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
edb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75  or(i=0; i<p->nCu
edc0: 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rsor; i++){.    
edd0: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43    VdbeCursor *pC
ede0: 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a   = p->apCsr[i];.
edf0: 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a        if( pC ){.
ee00: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
ee10: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c  dbeFreeCursor(p,
ee20: 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d   pC);.        p-
ee30: 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20  >apCsr[i] = 0;. 
ee40: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
ee50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
ee60: 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64  he values stored
ee70: 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d   in the VdbeFram
ee80: 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69  e structure to i
ee90: 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a  ts Vdbe. This.**
eea0: 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78   is used, for ex
eeb0: 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72  ample, when a tr
eec0: 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61  igger sub-progra
eed0: 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72  m is halted to r
eee0: 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f  estore.** contro
eef0: 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72  l to the main pr
ef00: 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ogram..*/.int sq
ef10: 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65  lite3VdbeFrameRe
ef20: 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20  store(VdbeFrame 
ef30: 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65  *pFrame){.  Vdbe
ef40: 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b   *v = pFrame->v;
ef50: 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49  .  closeCursorsI
ef60: 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65  nFrame(v);.#ifde
ef70: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
ef80: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
ef90: 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46    v->anExec = pF
efa0: 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65  rame->anExec;.#e
efb0: 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46  ndif.  v->aOnceF
efc0: 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  lag = pFrame->aO
efd0: 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f  nceFlag;.  v->nO
efe0: 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65  nceFlag = pFrame
eff0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76  ->nOnceFlag;.  v
f000: 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e  ->aOp = pFrame->
f010: 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20  aOp;.  v->nOp = 
f020: 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76  pFrame->nOp;.  v
f030: 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d  ->aMem = pFrame-
f040: 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d  >aMem;.  v->nMem
f050: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b   = pFrame->nMem;
f060: 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46  .  v->apCsr = pF
f070: 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76  rame->apCsr;.  v
f080: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61  ->nCursor = pFra
f090: 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76  me->nCursor;.  v
f0a0: 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20  ->db->lastRowid 
f0b0: 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f  = pFrame->lastRo
f0c0: 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67  wid;.  v->nChang
f0d0: 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61  e = pFrame->nCha
f0e0: 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43  nge;.  v->db->nC
f0f0: 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e  hange = pFrame->
f100: 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c  nDbChange;.  sql
f110: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
f120: 78 44 61 74 61 28 76 2c 20 2d 31 2c 20 30 29 3b  xData(v, -1, 0);
f130: 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
f140: 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
f150: 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
f160: 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
f170: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
f180: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
f190: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
f1a0: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
f1b0: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
f1c0: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
f1d0: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
f1e0: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
f1f0: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
f200: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
f210: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
f220: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
f230: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
f240: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
f250: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
f260: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
f270: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
f280: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
f290: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
f2a0: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
f2b0: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
f2c0: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
f2d0: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
f2e0: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
f2f0: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
f300: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
f310: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
f320: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f330: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
f340: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
f350: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
f360: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
f370: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
f380: 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
f390: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
f3a0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
f3b0: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
f3c0: 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d  emArray(&p->aMem
f3d0: 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20  [1], p->nMem);. 
f3e0: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70   }.  while( p->p
f3f0: 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  DelFrame ){.    
f400: 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20  VdbeFrame *pDel 
f410: 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a  = p->pDelFrame;.
f420: 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65      p->pDelFrame
f430: 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74   = pDel->pParent
f440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
f450: 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65  eFrameDelete(pDe
f460: 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65  l);.  }..  /* De
f470: 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61  lete any auxdata
f480: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64   allocations mad
f490: 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20  e by the VM */. 
f4a0: 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61   if( p->pAuxData
f4b0: 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65   ) sqlite3VdbeDe
f4c0: 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d  leteAuxData(p, -
f4d0: 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  1, 0);.  assert(
f4e0: 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20   p->pAuxData==0 
f4f0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  );.}../*.** Clea
f500: 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65  n up the VM afte
f510: 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a  r a single run..
f520: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43  */.static void C
f530: 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b  leanup(Vdbe *p){
f540: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
f550: 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20   p->db;..#ifdef 
f560: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
f570: 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74  * Execute assert
f580: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f  () statements to
f590: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
f5a0: 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e   Vdbe.apCsr[] an
f5b0: 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65  d .  ** Vdbe.aMe
f5c0: 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20  m[] arrays have 
f5d0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65  already been cle
f5e0: 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69  aned up.  */.  i
f5f0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61  nt i;.  if( p->a
f600: 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20  pCsr ) for(i=0; 
f610: 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b  i<p->nCursor; i+
f620: 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70  +) assert( p->ap
f630: 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69  Csr[i]==0 );.  i
f640: 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20  f( p->aMem ){.  
f650: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d    for(i=1; i<=p-
f660: 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65  >nMem; i++) asse
f670: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66  rt( p->aMem[i].f
f680: 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69  lags==MEM_Undefi
f690: 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  ned );.  }.#endi
f6a0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  f..  sqlite3DbFr
f6b0: 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
f6c0: 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67  g);.  p->zErrMsg
f6d0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75   = 0;.  p->pResu
f6e0: 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ltSet = 0;.}../*
f6f0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62  .** Set the numb
f700: 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c  er of result col
f710: 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62  umns that will b
f720: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
f730: 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d  is SQL.** statem
f740: 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77  ent. This is now
f750: 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20   set at compile 
f760: 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61  time, rather tha
f770: 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63  n during.** exec
f780: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62  ution of the vdb
f790: 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61  e program so tha
f7a0: 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  t sqlite3_column
f7b0: 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20  _count() can.** 
f7c0: 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20  be called on an 
f7d0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65  SQL statement be
f7e0: 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65  fore sqlite3_ste
f7f0: 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  p()..*/.void sql
f800: 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f  ite3VdbeSetNumCo
f810: 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ls(Vdbe *p, int 
f820: 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d  nResColumn){.  M
f830: 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20  em *pColName;.  
f840: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
f850: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
f860: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
f870: 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
f880: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
f890: 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65  AME_N);.  sqlite
f8a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
f8b0: 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20  ColName);.  n = 
f8c0: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
f8d0: 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43  ME_N;.  p->nResC
f8e0: 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65  olumn = (u16)nRe
f8f0: 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43  sColumn;.  p->aC
f900: 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d  olName = pColNam
f910: 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65  e = (Mem*)sqlite
f920: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
f930: 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20  , sizeof(Mem)*n 
f940: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c  );.  if( p->aCol
f950: 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  Name==0 ) return
f960: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e  ;.  while( n-- >
f970: 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61   0 ){.    pColNa
f980: 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  me->flags = MEM_
f990: 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  Null;.    pColNa
f9a0: 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  me->db = p->db;.
f9b0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a      pColName++;.
f9c0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
f9d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
f9e0: 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74   idx'th column t
f9f0: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
fa00: 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
fa10: 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73  nt..** zName mus
fa20: 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74  t be a pointer t
fa30: 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74  o a nul terminat
fa40: 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  ed string..**.**
fa50: 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20   This call must 
fa60: 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20  be made after a 
fa70: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56  call to sqlite3V
fa80: 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e  dbeSetNumCols().
fa90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c  .**.** The final
faa0: 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c   parameter, xDel
fab0: 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66  , must be one of
fac0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
fad0: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a   SQLITE_STATIC.*
fae0: 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e  * or SQLITE_TRAN
faf0: 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20  SIENT. If it is 
fb00: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
fb10: 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20  then the buffer 
fb20: 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79  pointed.** to by
fb30: 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66   zName will be f
fb40: 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44  reed by sqlite3D
fb50: 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65  bFree() when the
fb60: 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79   vdbe is destroy
fb70: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
fb80: 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65  e3VdbeSetColName
fb90: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
fba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbb0: 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69       /* Vdbe bei
fbc0: 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f  ng configured */
fbd0: 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20  .  int idx,     
fbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fbf0: 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
fc00: 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70  column zName app
fc10: 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74  lies to */.  int
fc20: 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20   var,           
fc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fc40: 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e   One of the COLN
fc50: 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20  AME_* constants 
fc60: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
fc70: 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  *zName,         
fc80: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
fc90: 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61   to buffer conta
fca0: 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20  ining name */.  
fcb0: 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69  void (*xDel)(voi
fcc0: 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20  d*)             
fcd0: 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67   /* Memory manag
fce0: 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66  ement strategy f
fcf0: 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20  or zName */.){. 
fd00: 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a   int rc;.  Mem *
fd10: 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65  pColName;.  asse
fd20: 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43  rt( idx<p->nResC
fd30: 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72  olumn );.  asser
fd40: 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e  t( var<COLNAME_N
fd50: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
fd60: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
fd70: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e  .    assert( !zN
fd80: 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c  ame || xDel!=SQL
fd90: 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20  ITE_DYNAMIC );. 
fda0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fdb0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
fdc0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43  .  assert( p->aC
fdd0: 6f 6c 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70  olName!=0 );.  p
fde0: 43 6f 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61  ColName = &(p->a
fdf0: 43 6f 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a  ColName[idx+var*
fe00: 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b  p->nResColumn]);
fe10: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56  .  rc = sqlite3V
fe20: 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f  dbeMemSetStr(pCo
fe30: 6c 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31  lName, zName, -1
fe40: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78  , SQLITE_UTF8, x
fe50: 44 65 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Del);.  assert( 
fe60: 72 63 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20  rc!=0 || !zName 
fe70: 7c 7c 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c  || (pColName->fl
fe80: 61 67 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30  ags&MEM_Term)!=0
fe90: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
fea0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64  .}../*.** A read
feb0: 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61   or write transa
fec0: 63 74 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79  ction may or may
fed0: 20 6e 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f   not be active o
fee0: 6e 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  n database handl
fef0: 65 0a 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72  e.** db. If a tr
ff00: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
ff10: 69 76 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20  ive, commit it. 
ff20: 49 66 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a  If there is a.**
ff30: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
ff40: 6f 6e 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65  on spanning more
ff50: 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61   than one databa
ff60: 73 65 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f  se file, this ro
ff70: 75 74 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63  utine.** takes c
ff80: 61 72 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65  are of the maste
ff90: 72 20 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65  r journal tricke
ffa0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
ffb0: 74 20 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c  t vdbeCommit(sql
ffc0: 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
ffd0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  p){.  int i;.  i
ffe0: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20  nt nTrans = 0;  
fff0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74  /* Number of dat
10000 61 62 61 73 65 73 20 77 69 74 68 20 61 6e 20 61  abases with an a
10010 63 74 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e  ctive write-tran
10020 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  saction.        
10030 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
10040 61 74 20 61 72 65 20 63 61 6e 64 69 64 61 74 65  at are candidate
10050 73 20 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73  s for a two-phas
10060 65 20 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61  e commit using a
10070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10080 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
10090 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72  urnal */.  int r
100a0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
100b0 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
100c0 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
100d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
100e0 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
100f0 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
10100 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
10110 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
10120 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
10130 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
10140 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
10150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
10160 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
10170 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
10180 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
10190 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
101a0 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
101b0 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
101c0 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
101d0 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
101e0 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
101f0 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
10200 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
10210 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
10220 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10230 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
10240 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
10250 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
10260 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
10270 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
10280 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
10290 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
102a0 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
102b0 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
102c0 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
102d0 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
102e0 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
102f0 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
10300 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
10310 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
10320 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
10330 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
10340 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
10350 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
10360 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
10370 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
10380 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
10390 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
103a0 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
103b0 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
103c0 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
103d0 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
103e0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
103f0 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
10400 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
10410 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10420 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10430 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
10440 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10450 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
10460 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
10470 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
10480 20 2f 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e   /* Whether or n
10490 6f 74 20 61 20 64 61 74 61 62 61 73 65 20 6d 69  ot a database mi
104a0 67 68 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65  ght need a maste
104b0 72 20 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64  r journal depend
104c0 73 20 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20  s upon.      ** 
104d0 69 74 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65  its journal mode
104e0 20 28 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68   (among other th
104f0 69 6e 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74  ings).  This mat
10500 72 69 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77  rix determines w
10510 68 69 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f  hich.      ** jo
10520 75 72 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20  urnal modes use 
10530 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10540 20 61 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f   and which do no
10550 74 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69  t */.      stati
10560 63 20 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65  c const u8 aMJNe
10570 65 64 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  eded[] = {.     
10580 20 20 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a     /* DELETE   *
10590 2f 20 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a  /  1,.        /*
105a0 20 50 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c   PERSIST   */ 1,
105b0 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20  .        /* OFF 
105c0 20 20 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20        */ 0,.    
105d0 20 20 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20      /* TRUNCATE 
105e0 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
105f0 2a 20 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30  * MEMORY    */ 0
10600 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c  ,.        /* WAL
10610 20 20 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20         */ 0.    
10620 20 20 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72    };.      Pager
10630 20 2a 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50   *pPager;   /* P
10640 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
10650 77 69 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20  with pBt */.    
10660 20 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20    needXcommit = 
10670 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
10680 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b  BtreeEnter(pBt);
10690 0a 20 20 20 20 20 20 70 50 61 67 65 72 20 3d 20  .      pPager = 
106a0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
106b0 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66  r(pBt);.      if
106c0 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66  ( db->aDb[i].saf
106d0 65 74 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52  ety_level!=PAGER
106e0 5f 53 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46  _SYNCHRONOUS_OFF
106f0 0a 20 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65  .       && aMJNe
10700 65 64 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65  eded[sqlite3Page
10710 72 47 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28  rGetJournalMode(
10720 70 50 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29  pPager)].      )
10730 7b 20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  { .        asser
10740 74 28 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20  t( i!=1 );.     
10750 20 20 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20     nTrans++;.   
10760 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
10770 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c  sqlite3PagerExcl
10780 75 73 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72  usiveLock(pPager
10790 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
107a0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b  BtreeLeave(pBt);
107b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
107c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
107d0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
107e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
107f0 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69 74  ere are any writ
10800 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61  e-transactions a
10810 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68  t all, invoke th
10820 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f  e commit hook */
10830 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d  .  if( needXcomm
10840 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69  it && db->xCommi
10850 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  tCallback ){.   
10860 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69   rc = db->xCommi
10870 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43  tCallback(db->pC
10880 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69  ommitArg);.    i
10890 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
108a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e  eturn SQLITE_CON
108b0 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f  STRAINT_COMMITHO
108c0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OK;.    }.  }.. 
108d0 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63   /* The simple c
108e0 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68  ase - no more th
108f0 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
10900 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69  file (not counti
10910 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50  ng the.  ** TEMP
10920 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20 61   database) has a
10930 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74   transaction act
10940 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73 20  ive.   There is 
10950 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a  no need for the.
10960 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
10970 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  nal..  **.  ** I
10980 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
10990 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72  ue of sqlite3Btr
109a0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20  eeGetFilename() 
109b0 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68  is a zero length
109c0 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74  .  ** string, it
109d0 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20   means the main 
109e0 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d  database is :mem
109f0 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66  ory: or a temp f
10a00 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74  ile.  In .  ** t
10a10 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e  hat case we do n
10a20 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69  ot support atomi
10a30 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d  c multi-file com
10a40 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65  mits, so use the
10a50 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61   .  ** simple ca
10a60 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a  se then too..  *
10a70 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74  /.  if( 0==sqlit
10a80 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74  e3Strlen30(sqlit
10a90 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61  e3BtreeGetFilena
10aa0 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  me(db->aDb[0].pB
10ab0 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73  t)).   || nTrans
10ac0 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72  <=1.  ){.    for
10ad0 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45  (i=0; rc==SQLITE
10ae0 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62  _OK && i<db->nDb
10af0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74  ; i++){.      Bt
10b00 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10b10 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
10b20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
10b30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10b40 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10b50 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20  One(pBt, 0);.   
10b60 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10b70 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74  /* Do the commit
10b80 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74   only if all dat
10b90 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66 75  abases successfu
10ba0 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61  lly complete pha
10bb0 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66  se 1. .    ** If
10bc0 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65   one of the Btre
10bd0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
10be0 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74  ) calls fails, t
10bf0 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e  his indicates an
10c00 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72  .    ** IO error
10c10 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20   while deleting 
10c20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20  or truncating a 
10c30 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
10c40 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20   is unlikely,.  
10c50 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68    ** but could h
10c60 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63  appen. In this c
10c70 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63  ase abandon proc
10c80 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72  essing and retur
10c90 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20  n the error..   
10ca0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
10cb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
10cc0 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
10cd0 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  ){.      Btree *
10ce0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
10cf0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
10d00 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
10d10 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
10d20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
10d30 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  Bt, 0);.      }.
10d40 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
10d50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10d60 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62       sqlite3Vtab
10d70 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20  Commit(db);.    
10d80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  }.  }..  /* The 
10d90 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54  complex case - T
10da0 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d  here is a multi-
10db0 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73  file write-trans
10dc0 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20  action active.. 
10dd0 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72 65   ** This require
10de0 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
10df0 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72  al file to ensur
10e00 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
10e10 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74  n is.  ** commit
10e20 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a  ted atomically..
10e30 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
10e40 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
10e50 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69    else{.    sqli
10e60 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
10e70 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 6e  db->pVfs;.    in
10e80 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  t needSync = 0;.
10e90 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
10ea0 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
10eb0 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
10ec0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
10ed0 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
10ee0 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
10ef0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
10f00 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
10f10 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
10f20 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
10f30 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
10f40 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
10f50 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
10f60 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
10f70 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
10f80 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
10f90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10fa0 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
10fb0 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
10fc0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
10fd0 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
10fe0 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
10ff0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
11000 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
11010 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
11020 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
11030 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11040 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b  M_BKPT;.    do {
11050 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
11060 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
11070 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
11080 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
11090 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
110a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
110b0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
110c0 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
110d0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
110e0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
110f0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11100 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
11110 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
11120 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
11130 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
11140 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
11150 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
11160 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
11170 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
11180 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11190 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
111a0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
111b0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
111c0 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
111d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
111e0 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
111f0 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
11200 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
11210 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
11240 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
11250 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
11260 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
11270 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
11280 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
11290 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
112a0 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
112b0 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
112c0 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
112d0 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
112e0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
112f0 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
11300 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
11310 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
11320 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
11330 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
11340 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
11350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11360 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
11370 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
11380 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
11390 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
113a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
113b0 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
113c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
113d0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
113e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
113f0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
11400 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
11410 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
11420 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
11430 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11440 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
11450 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
11460 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
11470 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
11480 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
11490 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
114a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
114b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
114c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
114d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
114e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
114f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11500 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
11510 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
11520 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
11530 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
11540 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
11550 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
11560 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
11570 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
11580 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
11590 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
115a0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
115b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
115c0 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
115d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
115e0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
115f0 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
11600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
11610 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
11620 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
11630 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
11640 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
11650 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
11660 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
11670 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
11680 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11690 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
116a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
116b0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
116c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
116d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
116e0 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
116f0 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
11700 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
11710 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
11720 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
11730 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
11740 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
11750 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
11760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
11770 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
11780 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
11790 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71  !needSync && !sq
117a0 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69  lite3BtreeSyncDi
117b0 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20  sabled(pBt) ){. 
117c0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
117d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
117e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
117f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61  lite3OsWrite(pMa
11800 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c  ster, zFile, sql
11810 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
11820 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a  le)+1, offset);.
11830 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b          offset +
11840 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
11850 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20  0(zFile)+1;.    
11860 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11870 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11880 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11890 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
118a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
118b0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
118c0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
118d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
118e0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
118f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
11900 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
11910 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
11920 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
11930 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11940 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43  file. If the IOC
11950 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65  AP_SEQUENTIAL de
11960 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67  vice.    ** flag
11970 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20   is set this is 
11980 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20  not required..  
11990 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65    */.    if( nee
119a0 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30  dSync .     && 0
119b0 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69  ==(sqlite3OsDevi
119c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
119d0 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54  s(pMaster)&SQLIT
119e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
119f0 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49  AL).     && SQLI
11a00 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
11a10 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74  ite3OsSync(pMast
11a20 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f  er, SQLITE_SYNC_
11a30 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a  NORMAL)).    ){.
11a40 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11a50 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
11a60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11a70 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
11a80 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
11a90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11aa0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11ab0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11ac0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e     }..    /* Syn
11ad0 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c  c all the db fil
11ae0 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  es involved in t
11af0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
11b00 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20  The same call.  
11b10 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61    ** sets the ma
11b20 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
11b30 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64  nter in each ind
11b40 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e  ividual journal.
11b50 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72   If.    ** an er
11b60 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c  ror occurs here,
11b70 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
11b80 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11b90 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  l file..    **. 
11ba0 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72     ** If the err
11bb0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
11bc0 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
11bd0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
11be0 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
11bf0 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65  eOne(), then the
11c00 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  re is a chance t
11c10 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d  hat the.    ** m
11c20 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11c30 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61  le will be orpha
11c40 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e  ned. But we cann
11c50 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20  ot delete it,.  
11c60 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
11c70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11c80 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72  file name was wr
11c90 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
11ca0 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69  ournal.    ** fi
11cb0 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61  le before the fa
11cc0 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a  ilure occurred..
11cd0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11ce0 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
11cf0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
11d00 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72  i++){ .      Btr
11d10 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
11d20 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
11d30 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
11d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
11d50 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f  treeCommitPhaseO
11d60 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29  ne(pBt, zMaster)
11d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11d80 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
11d90 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
11da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
11db0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a  =SQLITE_BUSY );.
11dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11de0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11df0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11e00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11e10 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  }..    /* Delete
11e20 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11e30 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63  nal file. This c
11e40 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73  ommits the trans
11e50 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20  action. After.  
11e60 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20    ** doing this 
11e70 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73  the directory is
11e80 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65   synced again be
11e90 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64  fore any individ
11ea0 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ual.    ** trans
11eb0 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65  action files are
11ec0 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f   deleted..    */
11ed0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11ee0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11ef0 7a 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e  zMaster, needSyn
11f00 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  c);.    sqlite3D
11f10 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11f20 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20  r);.    zMaster 
11f30 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20  = 0;.    if( rc 
11f40 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
11f50 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
11f60 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20  * All files and 
11f70 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65  directories have
11f80 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
11f90 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c  nced, so the fol
11fa0 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61  lowing.    ** ca
11fb0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74  lls to sqlite3Bt
11fc0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77  reeCommitPhaseTw
11fd0 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f  o() are only clo
11fe0 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20  sing files and. 
11ff0 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f     ** deleting o
12000 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75  r truncating jou
12010 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68  rnals. If someth
12020 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77  ing goes wrong w
12030 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73  hile.    ** this
12040 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65   is happening we
12050 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61   don't really ca
12060 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74  re. The integrit
12070 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20  y of the.    ** 
12080 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
12090 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65  lready guarantee
120a0 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61  d, but some stra
120b0 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c  y 'cold' journal
120c0 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20  s.    ** may be 
120d0 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65  lying around. Re
120e0 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72  turning an error
120f0 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70   code won't help
12100 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f   matters..    */
12110 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d  .    disable_sim
12120 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
12130 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ();.    sqlite3B
12140 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
12150 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ();.    for(i=0;
12160 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
12170 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
12180 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12190 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
121a0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
121b0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
121c0 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31  tPhaseTwo(pBt, 1
121d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
121e0 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
121f0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
12200 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61     enable_simula
12210 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
12220 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61  ..    sqlite3Vta
12230 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d  bCommit(db);.  }
12240 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
12250 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20  n rc;.}../* .** 
12260 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
12270 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  cks that the sql
12280 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65  ite3.nVdbeActive
12290 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a   count variable.
122a0 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e  ** matches the n
122b0 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20  umber of vdbe's 
122c0 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69  in the list sqli
122d0 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61  te3.pVdbe that a
122e0 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  re.** currently 
122f0 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72  active. An asser
12300 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68  tion fails if th
12310 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20  e two counts do 
12320 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68  not match..** Th
12330 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61  is is an interna
12340 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c  l self-check onl
12350 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e  y - it is not an
12360 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65   essential proce
12370 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a  ssing.** step..*
12380 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e  *.** This is a n
12390 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69  o-op if NDEBUG i
123a0 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69  s defined..*/.#i
123b0 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61  fndef NDEBUG.sta
123c0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63  tic void checkAc
123d0 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69  tiveVdbeCnt(sqli
123e0 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65  te3 *db){.  Vdbe
123f0 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d   *p;.  int cnt =
12400 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65   0;.  int nWrite
12410 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61   = 0;.  int nRea
12420 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d  d = 0;.  p = db-
12430 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28  >pVdbe;.  while(
12440 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71   p ){.    if( sq
12450 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28  lite3_stmt_busy(
12460 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70  (sqlite3_stmt*)p
12470 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  ) ){.      cnt++
12480 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  ;.      if( p->r
12490 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72  eadOnly==0 ) nWr
124a0 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ite++;.      if(
124b0 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20   p->bIsReader ) 
124c0 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20  nRead++;.    }. 
124d0 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b     p = p->pNext;
124e0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63  .  }.  assert( c
124f0 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74  nt==db->nVdbeAct
12500 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ive );.  assert(
12510 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64   nWrite==db->nVd
12520 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73  beWrite );.  ass
12530 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e  ert( nRead==db->
12540 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23  nVdbeRead );.}.#
12550 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65  else.#define che
12560 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
12570 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
12580 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73   If the Vdbe pas
12590 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74  sed as the first
125a0 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64   argument opened
125b0 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61   a statement-tra
125c0 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f  nsaction,.** clo
125d0 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d  se it now. Argum
125e0 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20  ent eOp must be 
125f0 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54  either SAVEPOINT
12600 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20  _ROLLBACK or.** 
12610 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12620 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45  E. If it is SAVE
12630 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
12640 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65  then the stateme
12650 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  nt.** transactio
12660 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
12670 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45  . If eOp is SAVE
12680 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74  POINT_RELEASE, t
12690 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74  hen the .** stat
126a0 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
126b0 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a  n is committed..
126c0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65  **.** If an IO e
126d0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20  rror occurs, an 
126e0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
126f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
12700 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68  eturned. .** Oth
12710 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
12720 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12730 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
12740 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  nt(Vdbe *p, int 
12750 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  eOp){.  sqlite3 
12760 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64  *const db = p->d
12770 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  b;.  int rc = SQ
12780 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
12790 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  f p->iStatement 
127a0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
127b0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
127c0 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20  Vdbe opened a . 
127d0 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72   ** statement tr
127e0 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73  ansaction that s
127f0 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20  hould be closed 
12800 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65  here. The only e
12810 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  xception.  ** is
12820 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f   that an IO erro
12830 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72  r may have occur
12840 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20  red, causing an 
12850 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61  emergency rollba
12860 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73  ck..  ** In this
12870 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74   case (db->nStat
12880 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74  ement==0), and t
12890 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20  here is nothing 
128a0 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  to do..  */.  if
128b0 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74  ( db->nStatement
128c0 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   && p->iStatemen
128d0 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
128e0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53      const int iS
128f0 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53  avepoint = p->iS
12900 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20  tatement-1;..   
12910 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41   assert( eOp==SA
12920 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12930 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49   || eOp==SAVEPOI
12940 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20  NT_RELEASE);.   
12950 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74   assert( db->nSt
12960 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20  atement>0 );.   
12970 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61   assert( p->iSta
12980 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74  tement==(db->nSt
12990 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76  atement+db->nSav
129a0 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20  epoint) );..    
129b0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
129c0 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
129d0 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54   int rc2 = SQLIT
129e0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65  E_OK;.      Btre
129f0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
12a00 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
12a10 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
12a20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
12a30 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
12a40 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
12a50 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
12a60 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
12a70 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20  POINT_ROLLBACK, 
12a80 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12aa0 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f  f( rc2==SQLITE_O
12ab0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
12ac0 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  c2 = sqlite3Btre
12ad0 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20  eSavepoint(pBt, 
12ae0 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
12af0 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
12b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12b10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12b30 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
12b40 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
12b50 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74   }.    db->nStat
12b60 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e  ement--;.    p->
12b70 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
12b80 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
12b90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12ba0 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
12bb0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
12bc0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12bd0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
12be0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
12bf0 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f  OLLBACK, iSavepo
12c00 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  int);.      }.  
12c10 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12c20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12c40 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
12c50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
12c60 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12c70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12c80 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74    /* If the stat
12c90 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12ca0 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65  n is being rolle
12cb0 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73  d back, also res
12cc0 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a  tore the .    **
12cd0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
12ce0 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74  s deferred const
12cf0 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f  raint counter to
12d00 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61   the value it ha
12d10 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  d when .    ** t
12d20 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
12d30 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65  nsaction was ope
12d40 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28  ned.  */.    if(
12d50 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12d60 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12d70 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
12d80 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
12d90 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d  fCons;.      db-
12da0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
12db0 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49  s = p->nStmtDefI
12dc0 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20  mmCons;.    }.  
12dd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
12de0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12df0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
12e00 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
12e10 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  on opened by the
12e20 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61   database .** ha
12e30 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  ndle associated 
12e40 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73  with the VM pass
12e50 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
12e60 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65  t is about to be
12e70 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20   .** committed. 
12e80 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
12e90 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65  standing deferre
12ea0 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  d foreign key co
12eb0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c  nstraint.** viol
12ec0 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53  ations, return S
12ed0 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68  QLITE_ERROR. Oth
12ee0 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
12ef0 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  K..**.** If ther
12f00 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
12f10 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20  g FK violations 
12f20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f  and this functio
12f30 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  n returns .** SQ
12f40 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20  LITE_ERROR, set 
12f50 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
12f60 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43  e VM to SQLITE_C
12f70 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
12f80 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74  NKEY.** and writ
12f90 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
12fa0 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72  ge to it. Then r
12fb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12fc0 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  OR..*/.#ifndef S
12fd0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49  QLITE_OMIT_FOREI
12fe0 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74  GN_KEY.int sqlit
12ff0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64  e3VdbeCheckFk(Vd
13000 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72  be *p, int defer
13010 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  red){.  sqlite3 
13020 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
13030 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20  f( (deferred && 
13040 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f  (db->nDeferredCo
13050 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  ns+db->nDeferred
13060 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20  ImmCons)>0) .   
13070 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26  || (!deferred &&
13080 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e   p->nFkConstrain
13090 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  t>0) .  ){.    p
130a0 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f  ->rc = SQLITE_CO
130b0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
130c0 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f  KEY;.    p->erro
130d0 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f  rAction = OE_Abo
130e0 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  rt;.    sqlite3V
130f0 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52  dbeError(p, "FOR
13100 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61  EIGN KEY constra
13110 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20  int failed");.  
13120 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13130 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
13140 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13150 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
13160 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
13170 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61  alled the when a
13180 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68   VDBE tries to h
13190 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42  alt.  If the VDB
131a0 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68  E.** has made ch
131b0 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20  anges and is in 
131c0 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c  autocommit mode,
131d0 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f   then commit tho
131e0 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20  se.** changes.  
131f0 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73  If a rollback is
13200 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f   needed, then do
13210 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a   the rollback..*
13220 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13230 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61  e is the only wa
13240 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74  y to move the st
13250 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d  ate of a VM from
13260 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  .** SQLITE_MAGIC
13270 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d  _RUN to SQLITE_M
13280 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69  AGIC_HALT.  It i
13290 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a  s harmless to.**
132a0 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20   call this on a 
132b0 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68  VM that is in th
132c0 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  e SQLITE_MAGIC_H
132d0 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a  ALT state..**.**
132e0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
132f0 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63   code.  If the c
13300 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20  ommit could not 
13310 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65  complete because
13320 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74   of.** lock cont
13330 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53  ention, return S
13340 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20  QLITE_BUSY.  If 
13350 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
13360 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d  eturned, it.** m
13370 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64  eans the close d
13380 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e  id not happen an
13390 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  d needs to be re
133a0 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  peated..*/.int s
133b0 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56  qlite3VdbeHalt(V
133c0 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  dbe *p){.  int r
133d0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
133e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
133f0 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e  ed to store tran
13400 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64  sient return cod
13410 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  es */.  sqlite3 
13420 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
13430 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
13440 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f   contains the lo
13450 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69  gic that determi
13460 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65  nes if a stateme
13470 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73  nt or.  ** trans
13480 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63  action will be c
13490 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c  ommitted or roll
134a0 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73  ed back as a res
134b0 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ult of the.  ** 
134c0 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69  execution of thi
134d0 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  s virtual machin
134e0 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  e. .  **.  ** If
134f0 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c   any of the foll
13500 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63  owing errors occ
13510 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ur:.  **.  **   
13520 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20    SQLITE_NOMEM. 
13530 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49   **     SQLITE_I
13540 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51  OERR.  **     SQ
13550 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20  LITE_FULL.  **  
13560 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52     SQLITE_INTERR
13570 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  UPT.  **.  ** Th
13580 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  en the internal 
13590 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65  cache might have
135a0 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e   been left in an
135b0 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20   inconsistent.  
135c0 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65  ** state.  We ne
135d0 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74  ed to rollback t
135e0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  he statement tra
135f0 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65  nsaction, if the
13600 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20  re is.  ** one, 
13610 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  or the complete 
13620 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74  transaction if t
13630 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65  here is no state
13640 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
13650 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62  ..  */..  if( db
13660 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13670 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
13680 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
13690 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f  .  }.  if( p->aO
136a0 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65 74  nceFlag ) memset
136b0 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30  (p->aOnceFlag, 0
136c0 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b  , p->nOnceFlag);
136d0 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f  .  closeAllCurso
136e0 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  rs(p);.  if( p->
136f0 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49  magic!=VDBE_MAGI
13700 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74  C_RUN ){.    ret
13710 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
13720 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65   }.  checkActive
13730 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20  VdbeCnt(db);..  
13740 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20  /* No commit or 
13750 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20  rollback needed 
13760 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e  if the program n
13770 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72 20  ever started or 
13780 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20  if the.  ** SQL 
13790 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e  statement does n
137a0 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  ot read or write
137b0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
137c0 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  .  */.  if( p->p
137d0 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65  c>=0 && p->bIsRe
137e0 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20  ader ){.    int 
137f0 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72  mrc;   /* Primar
13800 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f  y error code fro
13810 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69  m p->rc */.    i
13820 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  nt eStatementOp 
13830 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53  = 0;.    int isS
13840 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20  pecialError;    
13850 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74          /* Set t
13860 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70 65  o true if a 'spe
13870 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a  cial' error */..
13880 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20      /* Lock all 
13890 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20 74  btrees used by t
138a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  he statement */.
138b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
138c0 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a  nter(p);..    /*
138d0 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f   Check for one o
138e0 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72  f the special er
138f0 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20  rors */.    mrc 
13900 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a  = p->rc & 0xff;.
13910 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72 72      isSpecialErr
13920 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45  or = mrc==SQLITE
13930 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
13940 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20  QLITE_IOERR.    
13950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13960 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13970 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63  INTERRUPT || mrc
13980 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  ==SQLITE_FULL;. 
13990 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61 6c     if( isSpecial
139a0 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f  Error ){.      /
139b0 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20 77  * If the query w
139c0 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64  as read-only and
139d0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
139e0 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  is SQLITE_INTERR
139f0 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e  UPT, .      ** n
13a00 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  o rollback is ne
13a10 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69  cessary. Otherwi
13a20 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73  se, at least a s
13a30 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20  avepoint .      
13a40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  ** transaction m
13a50 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ust be rolled ba
13a60 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ck to restore th
13a70 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61 20  e database to a 
13a80 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73  .      ** consis
13a90 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
13aa0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76    **.      ** Ev
13ab0 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65 6d  en if the statem
13ac0 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ent is read-only
13ad0 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e  , it is importan
13ae0 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20  t to perform.   
13af0 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e     ** a statemen
13b00 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e  t or transaction
13b10 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
13b20 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f  ion. If the erro
13b30 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75  r .      ** occu
13b40 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  rred while writi
13b50 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ng to the journa
13b60 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f  l, sub-journal o
13b70 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  r database.     
13b80 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74   ** file as part
13b90 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   of an effort to
13ba0 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20 73   free up cache s
13bb0 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74 69  pace (see functi
13bc0 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65  on.      ** page
13bd0 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61 67  rStress() in pag
13be0 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62  er.c), the rollb
13bf0 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64 20  ack is required 
13c00 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20  to restore .    
13c10 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74    ** the pager t
13c20 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73  o a consistent s
13c30 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tate..      */. 
13c40 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61       if( !p->rea
13c50 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51  dOnly || mrc!=SQ
13c60 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29  LITE_INTERRUPT )
13c70 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 6d  {.        if( (m
13c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
13c90 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13ca0 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73  FULL) && p->uses
13cb0 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  StmtJournal ){. 
13cc0 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d           eStatem
13cd0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
13ce0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
13cf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13d00 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66       /* We are f
13d10 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61  orced to roll ba
13d20 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74 72  ck the active tr
13d30 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72  ansaction. Befor
13d40 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20  e doing.        
13d50 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61    ** so, abort a
13d60 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65  ny other stateme
13d70 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20  nts this handle 
13d80 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63  currently has ac
13d90 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20  tive..          
13da0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  */.          sql
13db0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
13dc0 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  db, SQLITE_ABORT
13dd0 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20  _ROLLBACK);.    
13de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
13df0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
13e00 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
13e10 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
13e20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
13e30 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
13e40 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
13e50 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  }..    /* Check 
13e60 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f  for immediate fo
13e70 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74  reign key violat
13e80 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ions. */.    if(
13e90 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
13ea0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
13eb0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
13ec0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20   0);.    }.  .  
13ed0 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f    /* If the auto
13ee0 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20  -commit flag is 
13ef0 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73 20  set and this is 
13f00 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20  the only active 
13f10 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56  writer .    ** V
13f20 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69  M, then we do ei
13f30 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72  ther a commit or
13f40 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65   rollback of the
13f50 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
13f60 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20  tion. .    **.  
13f70 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20    ** Note: This 
13f80 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20  block also runs 
13f90 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70  if one of the sp
13fa0 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e  ecial errors han
13fb0 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f  dled .    ** abo
13fc0 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  ve has occurred.
13fd0 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28   .    */.    if(
13fe0 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53   !sqlite3VtabInS
13ff0 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26 26  ync(db) .     &&
14000 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14010 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64  .     && db->nVd
14020 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61  beWrite==(p->rea
14030 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29  dOnly==0) .    )
14040 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
14050 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14060 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d  (p->errorAction=
14070 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53  =OE_Fail && !isS
14080 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a  pecialError) ){.
14090 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
140a0 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
140b0 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  p, 1);.        i
140c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
140d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
140e0 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f  ( NEVER(p->readO
140f0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nly) ){.        
14100 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c      sqlite3VdbeL
14110 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20  eave(p);.       
14120 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
14130 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
14140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
14150 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
14160 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
14170 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  Y;.        }else
14180 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  { .          /* 
14190 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  The auto-commit 
141a0 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68  flag is true, th
141b0 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77  e vdbe program w
141c0 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20  as successful . 
141d0 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68           ** or h
141e0 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20  it an 'OR FAIL' 
141f0 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74  constraint and t
14200 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65  here are no defe
14210 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20  rred foreign.   
14220 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f         ** key co
14230 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c  nstraints to hol
14240 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61 63  d up the transac
14250 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73  tion. This means
14260 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20   a commit .     
14270 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69       ** is requi
14280 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  red. */.        
14290 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69    rc = vdbeCommi
142a0 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  t(db, p);.      
142b0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
142c0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
142d0 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  && p->readOnly )
142e0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
142f0 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b  te3VdbeLeave(p);
14300 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
14310 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
14320 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14330 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14340 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72  {.          p->r
14350 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20  c = rc;.        
14360 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14370 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14380 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  OK);.          p
14390 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
143a0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
143b0 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66          db->nDef
143c0 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
143d0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
143e0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
143f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  0;.          db-
14400 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
14410 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20  E_DeferFKs;.    
14420 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d        sqlite3Com
14430 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67  mitInternalChang
14440 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  es(db);.        
14450 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
14460 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14470 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14480 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
14490 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
144a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
144b0 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d  db->nStatement =
144c0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
144d0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d  ( eStatementOp==
144e0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
144f0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
14500 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  || p->errorActio
14510 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20  n==OE_Fail ){.  
14520 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
14530 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
14540 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65  ELEASE;.      }e
14550 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72  lse if( p->error
14560 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74  Action==OE_Abort
14570 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
14580 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14590 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20  OINT_ROLLBACK;. 
145a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
145b0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
145c0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
145d0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
145e0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
145f0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
14600 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
14610 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
14620 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
14630 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14640 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14650 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74  /* If eStatement
14660 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  Op is non-zero, 
14670 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74  then a statement
14680 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65   transaction nee
14690 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20  ds to.    ** be 
146a0 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
146b0 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73  led back. Call s
146c0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
146d0 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20  tatement() to.  
146e0 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74    ** do so. If t
146f0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65  his operation re
14700 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20  turns an error, 
14710 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  and the current 
14720 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a  statement.    **
14730 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53   error code is S
14740 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49  QLITE_OK or SQLI
14750 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74  TE_CONSTRAINT, t
14760 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a  hen promote the.
14770 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73      ** current s
14780 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63  tatement error c
14790 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
147a0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
147b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
147c0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
147d0 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61  tatement(p, eSta
147e0 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20  tementOp);.     
147f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
14800 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
14810 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72  LITE_OK || (p->r
14820 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  c&0xff)==SQLITE_
14830 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20  CONSTRAINT ){.  
14840 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20          p->rc = 
14850 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  rc;.          sq
14860 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
14870 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
14880 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73         p->zErrMs
14890 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  g = 0;.        }
148a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
148b0 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
148c0 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
148d0 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
148e0 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
148f0 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
14900 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
14910 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
14920 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14940 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
14950 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55  was an INSERT, U
14960 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20  PDATE or DELETE 
14970 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74  and no statement
14980 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
14990 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c   ** has been rol
149a0 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65  led back, update
149b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
149c0 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d  nnection change-
149d0 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f  counter. .    */
149e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e  .    if( p->chan
149f0 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20  geCntOn ){.     
14a00 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14a10 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p!=SAVEPOINT_ROL
14a20 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
14a30 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
14a40 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43  hanges(db, p->nC
14a50 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65  hange);.      }e
14a60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14a70 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
14a80 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20  es(db, 0);.     
14a90 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61   }.      p->nCha
14aa0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  nge = 0;.    }..
14ab0 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74      /* Release t
14ac0 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  he locks */.    
14ad0 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
14ae0 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57  (p);.  }..  /* W
14af0 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75  e have successfu
14b00 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63  lly halted and c
14b10 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52  losed the VM.  R
14b20 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e  ecord this fact.
14b30 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
14b40 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56  =0 ){.    db->nV
14b50 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20  dbeActive--;.   
14b60 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c   if( !p->readOnl
14b70 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  y ) db->nVdbeWri
14b80 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d  te--;.    if( p-
14b90 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d  >bIsReader ) db-
14ba0 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20  >nVdbeRead--;.  
14bb0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
14bc0 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e  dbeActive>=db->n
14bd0 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20  VdbeRead );.    
14be0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
14bf0 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65  eRead>=db->nVdbe
14c00 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73  Write );.    ass
14c10 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72  ert( db->nVdbeWr
14c20 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  ite>=0 );.  }.  
14c30 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
14c40 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68  MAGIC_HALT;.  ch
14c50 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
14c60 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  (db);.  if( db->
14c70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14c80 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14c90 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
14ca0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
14cb0 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67  auto-commit flag
14cc0 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c   is set to true,
14cd0 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20   then any locks 
14ce0 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20  that were held. 
14cf0 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f   ** by connectio
14d00 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65  n db have now be
14d10 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c  en released. Cal
14d20 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74  l sqlite3Connect
14d30 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20  ionUnlocked() . 
14d40 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e   ** to invoke an
14d50 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63  y required unloc
14d60 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63  k-notify callbac
14d70 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  ks..  */.  if( d
14d80 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b  b->autoCommit ){
14d90 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
14da0 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64  ectionUnlocked(d
14db0 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  b);.  }..  asser
14dc0 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t( db->nVdbeActi
14dd0 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f  ve>0 || db->auto
14de0 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d  Commit==0 || db-
14df0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29  >nStatement==0 )
14e00 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72  ;.  return (p->r
14e10 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f  c==SQLITE_BUSY ?
14e20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53   SQLITE_BUSY : S
14e30 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f  QLITE_OK);.}.../
14e40 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68  *.** Each VDBE h
14e50 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20  olds the result 
14e60 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
14e70 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  nt sqlite3_step(
14e80 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e  ) call.** in p->
14e90 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  rc.  This routin
14ea0 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75  e sets that resu
14eb0 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54  lt back to SQLIT
14ec0 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  E_OK..*/.void sq
14ed0 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74  lite3VdbeResetSt
14ee0 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70  epResult(Vdbe *p
14ef0 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  ){.  p->rc = SQL
14f00 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
14f10 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20   Copy the error 
14f20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d  code and error m
14f30 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67  essage belonging
14f40 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73   to the VDBE pas
14f50 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69  sed.** as the fi
14f60 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
14f70 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e  its database han
14f80 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65  dle (so that the
14f90 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65  y will be .** re
14fa0 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20  turned by calls 
14fb0 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  to sqlite3_errco
14fc0 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  de() and sqlite3
14fd0 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a  _errmsg())..**.*
14fe0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
14ff0 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74  does not clear t
15000 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f  he VDBE error co
15010 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a  de or message, j
15020 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68  ust.** copies th
15030 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  em to the databa
15040 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
15050 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61  t sqlite3VdbeTra
15060 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20  nsferError(Vdbe 
15070 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
15080 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e  db = p->db;.  in
15090 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20  t rc = p->rc;.  
150a0 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29  if( p->zErrMsg )
150b0 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67  {.    db->bBenig
150c0 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73  nMalloc++;.    s
150d0 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
150e0 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
150f0 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  f( db->pErr==0 )
15100 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69   db->pErr = sqli
15110 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
15120 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
15130 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72  eSetStr(db->pErr
15140 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  , -1, p->zErrMsg
15150 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53  , SQLITE_UTF8, S
15160 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
15170 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  ;.    sqlite3End
15180 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
15190 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
151a0 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d  alloc--;.    db-
151b0 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
151c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
151d0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
151e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
151f0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
15200 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
15210 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51  G./*.** If an SQ
15220 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
15230 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73  OG hook is regis
15240 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d  tered and the VM
15250 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a   has been run, .
15260 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f  ** invoke it..*/
15270 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
15280 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64  eInvokeSqllog(Vd
15290 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71  be *v){.  if( sq
152a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
152b0 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e  g.xSqllog && v->
152c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
152d0 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70   v->zSql && v->p
152e0 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  c>=0 ){.    char
152f0 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71   *zExpanded = sq
15300 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53  lite3VdbeExpandS
15310 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a  ql(v, v->zSql);.
15320 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64      assert( v->d
15330 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20  b->init.busy==0 
15340 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61  );.    if( zExpa
15350 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71  nded ){.      sq
15360 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15370 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20  g.xSqllog(.     
15380 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15390 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
153a0 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70  Arg, v->db, zExp
153b0 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29  anded, 1.      )
153c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
153d0 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78  bFree(v->db, zEx
153e0 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20  panded);.    }. 
153f0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
15400 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  ine vdbeInvokeSq
15410 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a  llog(x).#endif..
15420 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
15430 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63   VDBE after exec
15440 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74  ution but do not
15450 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45   delete the VDBE
15460 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72   just yet..** Wr
15470 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
15480 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45  ssages into *pzE
15490 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74  rrMsg.  Return t
154a0 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a  he result code..
154b0 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73  **.** After this
154c0 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c   routine is run,
154d0 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64   the VDBE should
154e0 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20   be ready to be 
154f0 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69  executed.** agai
15500 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b  n..**.** To look
15510 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77   at it another w
15520 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ay, this routine
15530 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74   resets the stat
15540 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74  e of the.** virt
15550 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d  ual machine from
15560 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
15570 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  or VDBE_MAGIC_HA
15580 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44  LT back to.** VD
15590 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a  BE_MAGIC_INIT..*
155a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
155b0 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b  eReset(Vdbe *p){
155c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
155d0 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20    db = p->db;.. 
155e0 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69   /* If the VM di
155f0 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d  d not run to com
15600 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74  pletion or if it
15610 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a   encountered an.
15620 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e    ** error, then
15630 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61   it might not ha
15640 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70  ve been halted p
15650 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c  roperly.  So hal
15660 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20  t.  ** it now.. 
15670 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
15680 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20  eHalt(p);..  /* 
15690 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20  If the VDBE has 
156a0 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74  be run even part
156b0 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e  ially, then tran
156c0 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63  sfer the error c
156d0 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72  ode.  ** and err
156e0 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
156f0 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68  the VDBE into th
15700 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15710 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a  structure.  But.
15720 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45    ** if the VDBE
15730 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73   has just been s
15740 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61  et to run but ha
15750 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65  s not actually e
15760 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a  xecuted any.  **
15770 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65   instructions ye
15780 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69  t, leave the mai
15790 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72  n database error
157a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63   information unc
157b0 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  hanged..  */.  i
157c0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  f( p->pc>=0 ){. 
157d0 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c     vdbeInvokeSql
157e0 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  log(p);.    sqli
157f0 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45  te3VdbeTransferE
15800 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c  rror(p);.    sql
15810 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
15820 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15830 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
15840 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e      if( p->runOn
15850 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69  lyOnce ) p->expi
15860 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  red = 1;.  }else
15870 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d   if( p->rc && p-
15880 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20  >expired ){.    
15890 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66  /* The expired f
158a0 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74  lag was set on t
158b0 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74  he VDBE before t
158c0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20  he first call.  
158d0 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f    ** to sqlite3_
158e0 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73  step(). For cons
158f0 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73  istency (since s
15900 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61  qlite3_step() wa
15910 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29  s.    ** called)
15920 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61  , set the databa
15930 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73  se error in this
15940 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20   case as well.. 
15950 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
15960 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
15970 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72  , p->rc, p->zErr
15980 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20  Msg ? "%s" : 0, 
15990 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
159a0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
159b0 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
159c0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
159d0 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65   0;.  }..  /* Re
159e0 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79  claim all memory
159f0 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
15a00 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70  E.  */.  Cleanup
15a10 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20  (p);..  /* Save 
15a20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d  profiling inform
15a30 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20  ation from this 
15a40 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23  VDBE run..  */.#
15a50 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49  ifdef VDBE_PROFI
15a60 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20  LE.  {.    FILE 
15a70 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64  *out = fopen("vd
15a80 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c  be_profile.out",
15a90 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f   "a");.    if( o
15aa0 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ut ){.      int 
15ab0 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  i;.      fprintf
15ac0 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a  (out, "---- ");.
15ad0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15ae0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
15af0 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
15b00 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61  ut, "%02x", p->a
15b10 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20  Op[i].opcode);. 
15b20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72       }.      fpr
15b30 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
15b40 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53  .      if( p->zS
15b50 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  ql ){.        ch
15b60 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20  ar c, pc = 0;.  
15b70 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15b80 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
15b90 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d     for(i=0; (c =
15ba0 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b   p->zSql[i])!=0;
15bb0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
15bc0 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20   if( pc=='\n' ) 
15bd0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
15be0 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   ");.          p
15bf0 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
15c00 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20         pc = c;. 
15c10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15c20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20   if( pc!='\n' ) 
15c30 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
15c40 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
15c50 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
15c60 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nOp; i++){.     
15c70 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30     char zHdr[100
15c80 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ];.        sqlit
15c90 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
15ca0 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20  of(zHdr), zHdr, 
15cb0 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c  "%6u %12llu %8ll
15cc0 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  u ",.           
15cd0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20  p->aOp[i].cnt,. 
15ce0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15cf0 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20  [i].cycles,.    
15d00 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
15d10 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b  .cnt>0 ? p->aOp[
15d20 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70  i].cycles/p->aOp
15d30 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20  [i].cnt : 0.    
15d40 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66      );.        f
15d50 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
15d60 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20  , zHdr);.       
15d70 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e   sqlite3VdbePrin
15d80 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e  tOp(out, i, &p->
15d90 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d  aOp[i]);.      }
15da0 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75  .      fclose(ou
15db0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  t);.    }.  }.#e
15dc0 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65  ndif.  p->iCurre
15dd0 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d  ntTime = 0;.  p-
15de0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
15df0 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75  GIC_INIT;.  retu
15e00 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65  rn p->rc & db->e
15e10 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a  rrMask;.}. ./*.*
15e20 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64  * Clean up and d
15e30 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74  elete a VDBE aft
15e40 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52  er execution.  R
15e50 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
15e60 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65   which is.** the
15e70 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57   result code.  W
15e80 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
15e90 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f  essage text into
15ea0 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69   *pzErrMsg..*/.i
15eb0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69  nt sqlite3VdbeFi
15ec0 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b  nalize(Vdbe *p){
15ed0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
15ee0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
15ef0 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
15f00 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69  C_RUN || p->magi
15f10 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41  c==VDBE_MAGIC_HA
15f20 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  LT ){.    rc = s
15f30 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28  qlite3VdbeReset(
15f40 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  p);.    assert( 
15f50 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72  (rc & p->db->err
15f60 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d  Mask)==rc );.  }
15f70 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
15f80 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72  lete(p);.  retur
15f90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
15fa0 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20  f parameter iOp 
15fb0 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72  is less than zer
15fc0 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  o, then invoke t
15fd0 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f  he destructor fo
15fe0 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61  r.** all auxilia
15ff0 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73  ry data pointers
16000 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65   currently cache
16010 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
16020 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72  ed as.** the fir
16030 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  st argument..**.
16040 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73  ** Or, if iOp is
16050 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
16060 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20   equal to zero, 
16070 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63  then the destruc
16080 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69  tor is.** only i
16090 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65  nvoked for those
160a0 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20   auxiliary data 
160b0 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64  pointers created
160c0 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a   by the user .**
160d0 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65   function invoke
160e0 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63  d by the OP_Func
160f0 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69  tion opcode at i
16100 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f  nstruction iOp o
16110 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20  f .** VM pVdbe, 
16120 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66  and only then if
16130 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  :.**.**    * the
16140 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63   associated func
16150 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69  tion parameter i
16160 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61  s the 32nd or la
16170 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a  ter (counting.**
16180 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20        from left 
16190 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a  to right), or.**
161a0 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72  .**    * the cor
161b0 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69  responding bit i
161c0 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20  n argument mask 
161d0 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20  is clear (where 
161e0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20  the first.**    
161f0 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d    function param
16200 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73  eter corresponds
16210 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e   to bit 0 etc.).
16220 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
16230 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74  VdbeDeleteAuxDat
16240 61 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69  a(Vdbe *pVdbe, i
16250 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b  nt iOp, int mask
16260 29 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70  ){.  AuxData **p
16270 70 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78  p = &pVdbe->pAux
16280 44 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a  Data;.  while( *
16290 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74  pp ){.    AuxDat
162a0 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20  a *pAux = *pp;. 
162b0 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20     if( (iOp<0). 
162c0 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f      || (pAux->iO
162d0 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d  p==iOp && (pAux-
162e0 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61  >iArg>31 || !(ma
162f0 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70  sk & MASKBIT32(p
16300 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20  Aux->iArg)))).  
16310 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63    ){.      testc
16320 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d  ase( pAux->iArg=
16330 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =31 );.      if(
16340 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29   pAux->xDelete )
16350 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e  {.        pAux->
16360 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41  xDelete(pAux->pA
16370 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ux);.      }.   
16380 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70     *pp = pAux->p
16390 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
163a0 74 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d  te3DbFree(pVdbe-
163b0 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20  >db, pAux);.    
163c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d  }else{.      pp=
163d0 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20   &pAux->pNext;. 
163e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
163f0 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72  * Free all memor
16400 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
16410 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  h the Vdbe passe
16420 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
16430 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63  argument,.** exc
16440 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69  ept for object i
16450 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20  tself, which is 
16460 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
16470 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
16480 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e  between this fun
16490 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65  ction and sqlite
164a0 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73  3VdbeDelete() is
164b0 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c   that.** VdbeDel
164c0 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e  ete() also unlin
164d0 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ks the Vdbe from
164e0 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73   the list of VMs
164f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16500 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
16510 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20   connection and 
16520 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74  frees the object
16530 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64   itself..*/.void
16540 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16550 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20  rObject(sqlite3 
16560 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20  *db, Vdbe *p){. 
16570 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75   SubProgram *pSu
16580 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74  b, *pNext;.  int
16590 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   i;.  assert( p-
165a0 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d  >db==0 || p->db=
165b0 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65  =db );.  release
165c0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72  MemArray(p->aVar
165d0 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65  , p->nVar);.  re
165e0 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
165f0 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
16600 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
16610 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d  _N);.  for(pSub=
16620 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75  p->pProgram; pSu
16630 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a  b; pSub=pNext){.
16640 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62      pNext = pSub
16650 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62  ->pNext;.    vdb
16660 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
16670 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62   pSub->aOp, pSub
16680 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69  ->nOp);.    sqli
16690 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53  te3DbFree(db, pS
166a0 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ub);.  }.  for(i
166b0 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d  =p->nzVar-1; i>=
166c0 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44  0; i--) sqlite3D
166d0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56  bFree(db, p->azV
166e0 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65  ar[i]);.  sqlite
166f0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16700 7a 56 61 72 29 3b 0a 20 20 76 64 62 65 46 72 65  zVar);.  vdbeFre
16710 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
16720 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
16730 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16740 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
16750 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16760 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
16770 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16780 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
16790 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
167a0 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
167b0 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  S.  for(i=0; i<p
167c0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
167d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
167e0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
167f0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
16800 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16810 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64   p->aScan);.#end
16820 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
16830 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
16840 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
16850 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
16860 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
16870 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
16880 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
16890 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
168a0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
168b0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
168c0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
168d0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
168e0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
168f0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
16900 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
16910 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
16920 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
16930 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
16940 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
16950 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
16960 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
16970 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
16980 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
16990 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
169a0 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
169b0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
169c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
169d0 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
169e0 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
169f0 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
16a00 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
16a10 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
16a20 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
16a30 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
16a40 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
16a50 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
16a60 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
16a70 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
16a80 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
16a90 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
16aa0 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
16ab0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
16ac0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
16ad0 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
16ae0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
16af0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
16b00 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
16b10 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
16b20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
16b30 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
16b40 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 61  ->isTable );.  a
16b50 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79  ssert( p->eCurTy
16b60 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
16b70 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  E );.  rc = sqli
16b80 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  te3BtreeMovetoUn
16b90 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43 75  packed(p->uc.pCu
16ba0 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76 65  rsor, 0, p->move
16bb0 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72 65  toTarget, 0, &re
16bc0 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  s);.  if( rc ) r
16bd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20  eturn rc;.  if( 
16be0 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e 20  res!=0 ) return 
16bf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
16c00 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  KPT;.#ifdef SQLI
16c10 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65  TE_TEST.  sqlite
16c20 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b 2b  3_search_count++
16c30 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64 65  ;.#endif.  p->de
16c40 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20 30  ferredMoveto = 0
16c50 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61 74  ;.  p->cacheStat
16c60 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c 45  us = CACHE_STALE
16c70 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
16c80 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
16c90 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f 76  omething has mov
16ca0 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f 75  ed cursor "p" ou
16cb0 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61 79  t of place.  May
16cc0 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77 61  be the row it wa
16cd0 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20  s.** pointed to 
16ce0 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
16cf0 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20 20  from under it.  
16d00 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74 72  Or maybe the btr
16d10 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c 61  ee was.** rebala
16d20 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72 20  nced.  Whatever 
16d30 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20 74  the cause, try t
16d40 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74 6f  o restore "p" to
16d50 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a 2a   the place it.**
16d60 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f 20   is supposed to 
16d70 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49 66  be pointing.  If
16d80 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65 6c   the row was del
16d90 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
16da0 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  der the.** curso
16db0 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73 6f  r, set the curso
16dc0 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  r to point to a 
16dd0 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  NULL row..*/.sta
16de0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
16df0 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d 6f  OINLINE handleMo
16e00 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43 75  vedCursor(VdbeCu
16e10 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
16e20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c 20  isDifferentRow, 
16e30 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  rc;.  assert( p-
16e40 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16e50 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61 73  PE_BTREE );.  as
16e60 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75 72  sert( p->uc.pCur
16e70 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  sor!=0 );.  asse
16e80 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
16e90 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
16ea0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 3b  ->uc.pCursor) );
16eb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
16ec0 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f 72  treeCursorRestor
16ed0 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  e(p->uc.pCursor,
16ee0 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77   &isDifferentRow
16ef0 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  );.  p->cacheSta
16f00 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
16f10 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66 65  E;.  if( isDiffe
16f20 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75 6c  rentRow ) p->nul
16f30 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74 75  lRow = 1;.  retu
16f40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16f50 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65 20  Check to ensure 
16f60 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
16f70 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74 6f  is valid.  Resto
16f80 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a  re the cursor.**
16f90 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52 65   if need be.  Re
16fa0 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72 72  turn any I/O err
16fb0 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73 74  or from the rest
16fc0 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ore operation..*
16fd0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
16fe0 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 56  eCursorRestore(V
16ff0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
17000 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
17010 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
17020 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71 6c  REE );.  if( sql
17030 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
17040 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
17050 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65  ursor) ){.    re
17060 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
17070 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20  Cursor(p);.  }. 
17080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17090 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  K;.}../*.** Make
170a0 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f 72   sure the cursor
170b0 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20 72   p is ready to r
170c0 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
170d0 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74   row to which it
170e0 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73  .** was last pos
170f0 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e  itioned.  Return
17100 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
17110 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f  f an OOM fault o
17120 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70  r I/O error.** p
17130 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20  revents us from 
17140 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20  positioning the 
17150 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f  cursor to its co
17160 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a  rrect position..
17170 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54  **.** If a MoveT
17180 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70  o operation is p
17190 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69  ending on the gi
171a0 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e  ven cursor, then
171b0 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65   do that.** Move
171c0 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d  To now.  If no m
171d0 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20  ove is pending, 
171e0 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  check to see if 
171f0 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e  the row has been
17200 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20  .** deleted out 
17210 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63  from under the c
17220 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20  ursor and if it 
17230 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f  has, mark the ro
17240 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72  w as.** a NULL r
17250 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ow..**.** If the
17260 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61   cursor is alrea
17270 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
17280 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61  he correct row a
17290 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a  nd that row has.
172a0 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65  ** not been dele
172b0 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ted out from und
172c0 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74  er the cursor, t
172d0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
172e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
172f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
17300 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65  ursorMoveto(Vdbe
17310 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e 74  Cursor **pp, int
17320 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62 65   *piCol){.  Vdbe
17330 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70 3b  Cursor *p = *pp;
17340 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79  .  if( p->eCurTy
17350 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
17360 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  E ){.    if( p->
17370 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
17380 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61 70  {.      int iMap
17390 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61  ;.      if( p->a
173a0 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70 20  AltMap && (iMap 
173b0 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b 2a  = p->aAltMap[1+*
173c0 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20 20  piCol])>0 ){.   
173d0 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 41       *pp = p->pA
173e0 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  ltCursor;.      
173f0 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70 20    *piCol = iMap 
17400 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  - 1;.        ret
17410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17420 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
17430 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72 72  urn handleDeferr
17440 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20  edMoveto(p);.   
17450 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
17460 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
17470 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
17480 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  sor) ){.      re
17490 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64  turn handleMoved
174a0 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d  Cursor(p);.    }
174b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
174c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
174d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
174e0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
174f0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17500 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69  alType().** sqli
17510 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17520 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  eLen().** sqlite
17530 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28 29  3VdbeSerialLen()
17540 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17550 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71  erialPut().** sq
17560 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
17570 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70  et().**.** encap
17580 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65 20  sulate the code 
17590 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73 20  that serializes 
175a0 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72 61  values for stora
175b0 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20  ge in SQLite.** 
175c0 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20 72  data and index r
175d0 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65 72  ecords. Each ser
175e0 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63 6f  ialized value co
175f0 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27  nsists of a.** '
17600 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e 64  serial-type' and
17610 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e   a blob of data.
17620 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70 65   The serial type
17630 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75 6e   is an 8-byte un
17640 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65  signed.** intege
17650 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20 76  r, stored as a v
17660 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  arint..**.** In 
17670 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78 20  an SQLite index 
17680 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72 69  record, the seri
17690 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72 65  al type is store
176a0 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f 72  d directly befor
176b0 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66  e.** the blob of
176c0 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63 6f   data that it co
176d0 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e  rresponds to. In
176e0 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64 2c   a table record,
176f0 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74   all serial.** t
17700 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  ypes are stored 
17710 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
17720 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64 20  the record, and 
17730 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61 74  the blobs of dat
17740 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e  a at.** the end.
17750 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75 6e   Hence these fun
17760 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65  ctions allow the
17770 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c   caller to handl
17780 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d  e the.** serial-
17790 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62 6c  type and data bl
177a0 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a  ob separately..*
177b0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
177c0 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62  ng table describ
177d0 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20 73  es the various s
177e0 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20 66  torage classes f
177f0 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20  or data:.**.**  
17800 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20 20   serial type    
17810 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61 74      bytes of dat
17820 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20 20  a      type.**  
17830 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
17840 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17850 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ---    ---------
17860 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30  ------.**      0
17870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17880 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
17890 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31    NULL.**      1
178a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
178b0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
178c0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
178d0 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20 20  .**      2      
178e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32                 2
178f0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17900 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17910 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
17920 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20 20           3      
17930 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17940 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20 20  eger.**      4  
17950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17960 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
17970 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17980 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20 20  *      5        
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20 20               6  
179a0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
179b0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
179c0 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20 20   6              
179d0 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
179e0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
179f0 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20 20  er.**      7    
17a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a10 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49 45   8            IE
17a20 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20  EE float.**     
17a30 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20 20   8              
17a40 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
17a50 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
17a60 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20 39  tant 0.**      9
17a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a80 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
17a90 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61    Integer consta
17aa0 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31  nt 1.**     10,1
17ab0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
17ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ad0 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78 70  reserved for exp
17ae0 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d  ansion.**    N>=
17af0 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20 20  12 and even     
17b00 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20 20    (N-12)/2      
17b10 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d    BLOB.**    N>=
17b20 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20 20  13 and odd      
17b30 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20 20    (N-13)/2      
17b40 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65    text.**.** The
17b50 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20 77   8 and 9 types w
17b60 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e 33  ere added in 3.3
17b70 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  .0, file format 
17b80 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69 6f  4.  Prior versio
17b90 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20  ns.** of SQLite 
17ba0 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74  will not underst
17bb0 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61 6c  and those serial
17bc0 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a   types..*/../*.*
17bd0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 72  * Return the ser
17be0 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68 65  ial-type for the
17bf0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
17c00 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71   pMem..*/.u32 sq
17c10 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17c20 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69  ype(Mem *pMem, i
17c30 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20  nt file_format, 
17c40 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e  u32 *pLen){.  in
17c50 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
17c60 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
17c70 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e 21  .  assert( pLen!
17c80 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  =0 );.  if( flag
17c90 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20  s&MEM_Null ){.  
17ca0 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20    *pLen = 0;.   
17cb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
17cc0 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49   if( flags&MEM_I
17cd0 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67  nt ){.    /* Fig
17ce0 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72 20  ure out whether 
17cf0 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c 20  to use 1, 2, 4, 
17d00 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a 2f  6 or 8 bytes. */
17d10 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58 5f  .#   define MAX_
17d20 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30 78  6BYTE ((((i64)0x
17d30 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d 31  00008000)<<32)-1
17d40 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70 4d  ).    i64 i = pM
17d50 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34  em->u.i;.    u64
17d60 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30 20   u;.    if( i<0 
17d70 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69 3b  ){.      u = ~i;
17d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17d90 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20    u = i;.    }. 
17da0 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29 7b     if( u<=127 ){
17db0 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31 29  .      if( (i&1)
17dc0 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d  ==i && file_form
17dd0 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20 20  at>=4 ){.       
17de0 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20   *pLen = 0;.    
17df0 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75 33      return 8+(u3
17e00 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  2)u;.      }else
17e10 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e 20  {.        *pLen 
17e20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
17e30 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
17e40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d     }.    if( u<=
17e50 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  32767 ){ *pLen =
17e60 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a   2; return 2; }.
17e70 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38 36      if( u<=83886
17e80 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b  07 ){ *pLen = 3;
17e90 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20   return 3; }.   
17ea0 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33 36   if( u<=21474836
17eb0 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b  47 ){ *pLen = 4;
17ec0 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20   return 4; }.   
17ed0 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54   if( u<=MAX_6BYT
17ee0 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20  E ){ *pLen = 6; 
17ef0 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20  return 5; }.    
17f00 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72  *pLen = 8;.    r
17f10 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69  eturn 6;.  }.  i
17f20 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61  f( flags&MEM_Rea
17f30 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d  l ){.    *pLen =
17f40 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 37   8;.    return 7
17f50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
17f60 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  pMem->db->malloc
17f70 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26  Failed || flags&
17f80 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f  (MEM_Str|MEM_Blo
17f90 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  b) );.  assert( 
17fa0 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20  pMem->n>=0 );.  
17fb0 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e  n = (u32)pMem->n
17fc0 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26 20  ;.  if( flags & 
17fd0 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
17fe0 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  n += pMem->u.nZe
17ff0 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20  ro;.  }.  *pLen 
18000 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28 28  = n;.  return ((
18010 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66 6c  n*2) + 12 + ((fl
18020 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29  ags&MEM_Str)!=0)
18030 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
18040 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61 6c  sizes for serial
18050 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61 6e   types less than
18060 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63   128.*/.static c
18070 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33 53  onst u8 sqlite3S
18080 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20  mallTypeSizes[] 
18090 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 20  = {.        /*  
180a0 30 20 20 20 31 20 20 20 32 20 20 20 33 20 20 20  0   1   2   3   
180b0 34 20 20 20 35 20 20 20 36 20 20 20 37 20 20 20  4   5   6   7   
180c0 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20  8   9 */   ./*  
180d0 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20   0 */   0,  1,  
180e0 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20 20  2,  3,  4,  6,  
180f0 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f  8,  8,  0,  0,./
18100 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20 30  *  10 */   0,  0
18110 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20 31  ,  0,  0,  1,  1
18120 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20 33  ,  2,  2,  3,  3
18130 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c  ,./*  20 */   4,
18140 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c    4,  5,  5,  6,
18150 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c    6,  7,  7,  8,
18160 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20    8,./*  30 */  
18170 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c 20   9,  9, 10, 10, 
18180 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c 20  11, 11, 12, 12, 
18190 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a  13, 13,./*  40 *
181a0 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20 31  /  14, 14, 15, 1
181b0 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20 31  5, 16, 16, 17, 1
181c0 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35  7, 18, 18,./*  5
181d0 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32 30  0 */  19, 19, 20
181e0 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32 32  , 20, 21, 21, 22
181f0 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a  , 22, 23, 23,./*
18200 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c    60 */  24, 24,
18210 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c   25, 25, 26, 26,
18220 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c   27, 27, 28, 28,
18230 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c 20  ./*  70 */  29, 
18240 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c 20  29, 30, 30, 31, 
18250 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c 20  31, 32, 32, 33, 
18260 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33  33,./*  80 */  3
18270 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20 33  4, 34, 35, 35, 3
18280 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20 33  6, 36, 37, 37, 3
18290 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f  8, 38,./*  90 */
182a0 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34 30    39, 39, 40, 40
182b0 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34 32  , 41, 41, 42, 42
182c0 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30  , 43, 43,./* 100
182d0 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35 2c   */  44, 44, 45,
182e0 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c   45, 46, 46, 47,
182f0 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20   47, 48, 48,./* 
18300 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20  110 */  49, 49, 
18310 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c 20  50, 50, 51, 51, 
18320 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a  52, 52, 53, 53,.
18330 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20 35  /* 120 */  54, 5
18340 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35  4, 55, 55, 56, 5
18350 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a  6, 57, 57.};../*
18360 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
18370 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61 74  ength of the dat
18380 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  a corresponding 
18390 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
183a0 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a  serial-type..*/.
183b0 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
183c0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32  erialTypeLen(u32
183d0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20   serial_type){. 
183e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
183f0 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65 74  >=128 ){.    ret
18400 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
18410 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b  -12)/2;.  }else{
18420 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 65 72  .    assert( ser
18430 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20 20  ial_type<12 .   
18440 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69           || sqli
18450 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
18460 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d  s[serial_type]==
18470 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
18480 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74 75  2)/2 );.    retu
18490 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  rn sqlite3SmallT
184a0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
184b0 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20  type];.  }.}.u8 
184c0 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42 79  sqlite3VdbeOneBy
184d0 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  teSerialTypeLen(
184e0 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  u8 serial_type){
184f0 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61  .  assert( seria
18500 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20 20  l_type<128 );.  
18510 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d  return sqlite3Sm
18520 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18530 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a  ial_type];  .}..
18540 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65 20  /*.** If we are 
18550 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74 75  on an architectu
18560 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65 6e  re with mixed-en
18570 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a  dian floating .*
18580 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41 52  * points (ex: AR
18590 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74 68  M7) then swap th
185a0 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73 20  e lower 4 bytes 
185b0 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70 70  with the .** upp
185c0 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65 74  er 4 bytes.  Ret
185d0 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  urn the result..
185e0 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61  **.** For most a
185f0 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74 68  rchitectures, th
18600 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  is is a no-op..*
18610 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20 49  *.** (later):  I
18620 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74 6f  t is reported to
18630 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69 78   me that the mix
18640 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65  ed-endian proble
18650 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20  m.** on ARM7 is 
18660 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47 43  an issue with GC
18670 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65 20  C, not with the 
18680 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20 73  ARM7 chip.  It s
18690 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61 72  eems.** that ear
186a0 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  ly versions of G
186b0 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74 77  CC stored the tw
186c0 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34 2d  o words of a 64-
186d0 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20  bit.** float in 
186e0 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e  the wrong order.
186f0 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f 72    And that error
18700 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61 67   has been propag
18710 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e  ated.** ever sin
18720 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20 69  ce.  The blame i
18730 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69 6c  s not necessaril
18740 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f 75  y with GCC, thou
18750 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74  gh..** GCC might
18760 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79 69   have just copyi
18770 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 66  ng the problem f
18780 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d 70  rom a prior comp
18790 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c  iler..** I am al
187a0 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65 77  so told that new
187b0 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 47  er versions of G
187c0 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61  CC that follow a
187d0 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42   different.** AB
187e0 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20 6f  I get the byte o
187f0 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a  rder right..**.*
18800 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73 69  * Developers usi
18810 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20  ng SQLite on an 
18820 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70  ARM7 should comp
18830 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65 69  ile and run thei
18840 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e  r.** application
18850 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
18860 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73 74  DEBUG=1 at least
18870 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45 42   once.  With DEB
18880 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73  UG.** enabled, s
18890 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c 6f  ome asserts belo
188a0 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74 68  w will ensure th
188b0 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  at the byte orde
188c0 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67  r of.** floating
188d0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69 73   point values is
188e0 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20   correct..**.** 
188f0 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46 72  (2007-08-30)  Fr
18900 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61 73  ank van Vugt has
18910 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70 72   studied this pr
18920 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a  oblem closely.**
18930 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68 69   and has send hi
18940 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74 68  s findings to th
18950 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f 70  e SQLite develop
18960 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77  ers.  Frank.** w
18970 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65 20  rites that some 
18980 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66  Linux kernels of
18990 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  fer floating poi
189a0 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20 65  nt hardware.** e
189b0 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75 73  mulation that us
189c0 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d  es only 32-bit m
189d0 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61 64  antissas instead
189e0 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34   of a full .** 4
189f0 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69 72  8-bits as requir
18a00 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20 73  ed by the IEEE s
18a10 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73 20  tandard.  (This 
18a20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47  is the.** CONFIG
18a30 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70 74  _FPE_FASTFPE opt
18a40 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20 73  ion.)  On such s
18a50 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67  ystems, floating
18a60 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73   point.** byte s
18a70 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73 20  wapping becomes 
18a80 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65 64  very complicated
18a90 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f 62  .  To avoid prob
18aa0 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63  lems,.** the nec
18ab0 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61 70  essary byte swap
18ac0 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64 20  ping is carried 
18ad0 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d 62  out using a 64-b
18ae0 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61  it integer.** ra
18af0 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d 62  ther than a 64-b
18b00 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b  it float.  Frank
18b10 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61 74   assures us that
18b20 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a 2a   the code here.*
18b30 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e  * works for him.
18b40 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c 6f    We, the develo
18b50 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77 61  pers, have no wa
18b60 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74  y to independent
18b70 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68 69  ly.** verify thi
18b80 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65 65  s, but Frank see
18b90 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20  ms to know what 
18ba0 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61 62  he is talking ab
18bb0 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75  out.** so we tru
18bc0 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65  st him..*/.#ifde
18bd0 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
18be0 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
18bf0 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c 6f  T.static u64 flo
18c00 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b 0a  atSwap(u64 in){.
18c10 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36    union {.    u6
18c20 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b 32  4 r;.    u32 i[2
18c30 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32 20  ];.  } u;.  u32 
18c40 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a  t;..  u.r = in;.
18c50 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20    t = u.i[0];.  
18c60 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b  u.i[0] = u.i[1];
18c70 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20  .  u.i[1] = t;. 
18c80 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23   return u.r;.}.#
18c90 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65   define swapMixe
18ca0 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 20  dEndianFloat(X) 
18cb0 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28 58   X = floatSwap(X
18cc0 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
18cd0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
18ce0 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66 0a  Float(X).#endif.
18cf0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
18d00 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74 61   serialized data
18d10 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76 61   blob for the va
18d20 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
18d30 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e  em into .** buf.
18d40 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
18d50 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hat the caller h
18d60 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75 66  as allocated suf
18d70 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a  ficient space..*
18d80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18d90 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
18da0 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66  tten..**.** nBuf
18db0 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f   is the amount o
18dc0 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e 20  f space left in 
18dd0 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c  buf[].  The call
18de0 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
18df0 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74  e.** for allocat
18e00 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63 65  ing enough space
18e10 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c   to buf[] to hol
18e20 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 65  d the entire fie
18e30 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  ld, exclusive.**
18e40 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e   of the pMem->u.
18e50 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72 20  nZero bytes for 
18e60 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65  a MEM_Zero value
18e70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
18e80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18e90 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  es actually writ
18ea0 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20  ten into buf[]. 
18eb0 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f   The number.** o
18ec0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 7a  f bytes in the z
18ed0 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20  ero-filled tail 
18ee0 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74  is included in t
18ef0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
18f00 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65  only.** if those
18f10 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72 6f   bytes were zero
18f20 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20  ed in buf[]..*/ 
18f30 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
18f40 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62 75  SerialPut(u8 *bu
18f50 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33  f, Mem *pMem, u3
18f60 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
18f70 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a    u32 len;..  /*
18f80 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65 61   Integer and Rea
18f90 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  l */.  if( seria
18fa0 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65 72  l_type<=7 && ser
18fb0 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20  ial_type>0 ){.  
18fc0 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33 32    u64 v;.    u32
18fd0 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72 69   i;.    if( seri
18fe0 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
18ff0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19000 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d  of(v)==sizeof(pM
19010 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20  em->u.r) );.    
19020 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70 4d    memcpy(&v, &pM
19030 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28  em->u.r, sizeof(
19040 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70 4d  v));.      swapM
19050 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
19060 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  v);.    }else{. 
19070 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75       v = pMem->u
19080 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65  .i;.    }.    le
19090 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33 53  n = i = sqlite3S
190a0 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
190b0 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20  rial_type];.    
190c0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
190d0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75 66     do{.      buf
190e0 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26 30  [--i] = (u8)(v&0
190f0 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e  xFF);.      v >>
19100 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 8;.    }while(
19110 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   i );.    return
19120 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20   len;.  }..  /* 
19130 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a  String or blob *
19140 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
19150 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61  ype>=12 ){.    a
19160 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b  ssert( pMem->n +
19170 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26   ((pMem->flags &
19180 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d   MEM_Zero)?pMem-
19190 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20  >u.nZero:0).    
191a0 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e 74           == (int
191b0 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  )sqlite3VdbeSeri
191c0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
191d0 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c 65  _type) );.    le
191e0 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  n = pMem->n;.   
191f0 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d   if( len>0 ) mem
19200 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
19210 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
19220 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
19230 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
19240 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
19250 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
19260 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73  Input "x" is a s
19270 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67  equence of unsig
19280 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74  ned characters t
19290 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a  hat represent a.
192a0 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ** big-endian in
192b0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74  teger.  Return t
192c0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61  he equivalent na
192d0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
192e0 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45  #define ONE_BYTE
192f0 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29  _INT(x)    ((i8)
19300 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[0]).#define 
19310 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  TWO_BYTE_INT(x) 
19320 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29     (256*(i8)((x)
19330 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65  [0])|(x)[1]).#de
19340 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f  fine THREE_BYTE_
19350 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28  INT(x)  (65536*(
19360 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
19370 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a  [1]<<8)|(x)[2]).
19380 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
19390 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33  E_UINT(x)  (((u3
193a0 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28  2)(x)[0]<<24)|((
193b0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
193c0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23  2]<<8)|(x)[3]).#
193d0 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
193e0 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31  _INT(x) (1677721
193f0 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
19400 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
19410 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
19420 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
19430 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
19440 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
19450 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
19460 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
19470 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
19480 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
19490 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
194a0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
194b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
194c0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
194d0 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72  ted as two separ
194e0 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ate routines for
194f0 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
19500 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74   The few cases t
19510 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61  hat require loca
19520 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  l variables are 
19530 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
19540 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f  a separate.** ro
19550 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e  utine so that in
19560 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20   most cases the 
19570 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69  overhead of movi
19580 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69  ng the stack poi
19590 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64  nter.** is avoid
195a0 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75  ed..*/ .static u
195b0 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  32 SQLITE_NOINLI
195c0 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20  NE serialGet(.  
195d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
195e0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
195f0 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
19600 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
19610 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
19620 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
19630 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
19640 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
19650 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
19680 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
19690 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78  to */.){.  u64 x
196a0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
196b0 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20  T(buf);.  u32 y 
196c0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
196d0 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28  (buf+4);.  x = (
196e0 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66  x<<32) + y;.  if
196f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
19700 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
19710 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d  NCE-OF: R-29851-
19720 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61  52272 Value is a
19730 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62   big-endian 64-b
19740 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  it.    ** twos-c
19750 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
19760 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  r. */.    pMem->
19770 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
19780 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
19790 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
197a0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
197b0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
197c0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
197d0 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39  E-OF: R-57343-49
197e0 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  114 Value is a b
197f0 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37  ig-endian IEEE 7
19800 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20  54-2008 64-bit. 
19810 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
19820 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  oint number. */.
19830 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
19840 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
19850 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
19860 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
19870 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
19880 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
19890 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
198a0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
198b0 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
198c0 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
198d0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
198e0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
198f0 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  is.    ** define
19900 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
19910 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
19920 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
19930 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69  ixed.    ** endi
19940 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  an..    */.    s
19950 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
19960 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
19970 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
19980 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
19990 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
199a0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
199b0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
199c0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
199d0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
199e0 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
199f0 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
19a00 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
19a10 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
19a20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
19a30 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
19a40 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b  pMem->u.r)==8 );
19a50 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
19a60 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
19a70 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
19a80 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  u.r, &x, sizeof(
19a90 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  x));.    pMem->f
19aa0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
19ab0 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f  NaN(pMem->u.r) ?
19ac0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
19ad0 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
19ae0 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
19af0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19b00 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
19b10 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
19b20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
19b30 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
19b40 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
19b50 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
19b60 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
19b70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
19b80 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
19b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ba0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
19bb0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
19bc0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
19bd0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
19be0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
19bf0 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
19c00 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
19c10 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
19c20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
19c30 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
19c40 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
19c50 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  * Null */.      
19c60 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19c70 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61  R-24078-09375 Va
19c80 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a  lue is a NULL. *
19c90 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
19ca0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
19cb0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19cc0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
19cd0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19ce0 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32  CE-OF: R-44885-2
19cf0 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e  5196 Value is an
19d00 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70   8-bit twos-comp
19d10 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  lement.      ** 
19d20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19d30 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
19d40 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
19d50 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19d60 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19d70 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19d80 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19d90 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
19da0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
19db0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
19dc0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19dd0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19de0 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36  F: R-49794-35026
19df0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19e00 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20  endian 16-bit.  
19e10 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
19e20 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
19e30 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
19e40 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
19e50 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
19e60 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
19e70 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
19e80 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19e90 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
19ea0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
19eb0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
19ec0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
19ed0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19ee0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33  DENCE-OF: R-3783
19ef0 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73  9-54301 Value is
19f00 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34   a big-endian 24
19f10 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
19f20 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
19f30 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
19f40 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45  pMem->u.i = THRE
19f50 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
19f60 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19f70 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19f80 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
19f90 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
19fa0 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
19fb0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
19fc0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
19fd0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
19fe0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19ff0 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39  F: R-01849-26079
1a000 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
1a010 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20  endian 32-bit.  
1a020 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
1a030 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
1a040 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
1a050 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49  .i = FOUR_BYTE_I
1a060 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66 20  NT(buf);.#ifdef 
1a070 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20 2f  __HP_cc .      /
1a080 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  * Work around a 
1a090 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62  sign-extension b
1a0a0 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f 6d  ug in the HP com
1a0b0 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58 20  piler for HP/UX 
1a0c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75 66  */.      if( buf
1a0d0 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d 2d  [0]&0x80 ) pMem-
1a0e0 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66 66  >u.i |= 0xffffff
1a0f0 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65  ff80000000LL;.#e
1a100 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d  ndif.      pMem-
1a110 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a120 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a130 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34 3b  .      return 4;
1a150 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a160 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
1a170 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a180 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a190 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30  CE-OF: R-50385-0
1a1a0 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61 20  9674 Value is a 
1a1b0 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69  big-endian 48-bi
1a1c0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
1a1d0 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
1a1e0 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
1a1f0 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59  m->u.i = FOUR_BY
1a200 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20 2b  TE_UINT(buf+2) +
1a210 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
1a220 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
1a230 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1a240 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a250 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a260 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1a270 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20       return 6;. 
1a280 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1a290 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67     /* 8-byte sig
1a2a0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a2b0 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20     case 7: { /* 
1a2c0 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f  IEEE floating po
1a2d0 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  int */.      /* 
1a2e0 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c 20  These use local 
1a2f0 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f  variables, so do
1a300 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61 72   them in a separ
1a310 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20 20  ate routine.    
1a320 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68 61    ** to avoid ha
1a330 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68 65  ving to move the
1a340 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20 69   frame pointer i
1a350 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1a360 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  e */.      retur
1a370 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66 2c  n serialGet(buf,
1a380 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d  serial_type,pMem
1a390 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
1a3a0 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67  e 8:    /* Integ
1a3b0 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73 65  er 0 */.    case
1a3c0 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65   9: {  /* Intege
1a3d0 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  r 1 */.      /* 
1a3e0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1a3f0 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75 65  2976-22893 Value
1a400 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1a410 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  0. */.      /* E
1a420 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38  VIDENCE-OF: R-18
1a430 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65 20  143-12121 Value 
1a440 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20 31  is the integer 1
1a450 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a460 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74 79  >u.i = serial_ty
1a470 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d  pe-8;.      pMem
1a480 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a490 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t;.      return 
1a4a0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  0;.    }.    def
1a4b0 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ault: {.      /*
1a4c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a4d0 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c 75  14606-31564 Valu
1a4e0 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61 74  e is a BLOB that
1a4f0 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79 74   is (N-12)/2 byt
1a500 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c  es in.      ** l
1a510 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  ength..      ** 
1a520 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
1a530 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75 65  8401-00140 Value
1a540 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e 20   is a string in 
1a550 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  the text encodin
1a560 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28  g and.      ** (
1a570 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69 6e  N-13)/2 bytes in
1a580 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20   length. */.    
1a590 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
1a5a0 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d  16 aFlag[] = { M
1a5b0 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65  EM_Blob|MEM_Ephe
1a5c0 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45  m, MEM_Str|MEM_E
1a5d0 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d  phem };.      pM
1a5e0 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29  em->z = (char *)
1a5f0 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  buf;.      pMem-
1a600 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  >n = (serial_typ
1a610 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20 70  e-12)/2;.      p
1a620 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c  Mem->flags = aFl
1a630 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26 31  ag[serial_type&1
1a640 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ];.      return 
1a650 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20  pMem->n;.    }. 
1a660 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a670 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a680 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20 61  ine is used to a
1a690 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69 65  llocate sufficie
1a6a0 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e 20  nt space for an 
1a6b0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a  UnpackedRecord.*
1a6c0 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72 67  * structure larg
1a6d0 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20 75  e enough to be u
1a6e0 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33  sed with sqlite3
1a6f0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1a700 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69 72  () if.** the fir
1a710 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
1a720 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79 49   pointer to KeyI
1a730 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70 4b  nfo structure pK
1a740 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68  eyInfo..**.** Th
1a750 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68 65  e space is eithe
1a760 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e  r allocated usin
1a770 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  g sqlite3DbMallo
1a780 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20 77  cRaw() or from w
1a790 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61  ithin.** the una
1a7a0 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70 61  ligned buffer pa
1a7b0 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65 63  ssed via the sec
1a7c0 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61 72  ond and third ar
1a7d0 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d 61  guments (presuma
1a7e0 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61  bly.** stack spa
1a7f0 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72 6d  ce). If the form
1a800 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65 65  er, then *ppFree
1a810 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f 69   is set to a poi
1a820 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c 64  nter that should
1a830 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c 6c  .** be eventuall
1a840 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  y freed by the c
1a850 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1a860 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72 2c  te3DbFree(). Or,
1a870 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f   if the .** allo
1a880 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f  cation comes fro
1a890 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a 53  m the pSpace/szS
1a8a0 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70 70  pace buffer, *pp
1a8b0 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 4e  Free is set to N
1a8c0 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65  ULL.** before re
1a8d0 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  turning..**.** I
1a8e0 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  f an OOM error o
1a8f0 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72  ccurs, NULL is r
1a900 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61  eturned..*/.Unpa
1a910 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c 69  ckedRecord *sqli
1a920 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61  te3VdbeAllocUnpa
1a930 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b 65  ckedRecord(.  Ke
1a940 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1a950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a960 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20   Description of 
1a970 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  the record */.  
1a980 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20 20  char *pSpace,   
1a990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9a0 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70 61  /* Unaligned spa
1a9b0 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  ce available */.
1a9c0 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20 20    int szSpace,  
1a9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53 70    /* Size of pSp
1a9f0 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a  ace[] in bytes *
1aa00 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72 65  /.  char **ppFre
1aa10 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
1aa20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c      /* OUT: Call
1aa30 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20 74  er should free t
1aa40 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29  his pointer */.)
1aa50 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  {.  UnpackedReco
1aa60 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  rd *p;          
1aa70 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20      /* Unpacked 
1aa80 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72 6e  record to return
1aa90 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20   */.  int nOff; 
1aaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aab0 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65        /* Increme
1aac0 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f 66  nt pSpace by nOf
1aad0 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f  f to align it */
1aae0 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20  .  int nByte;   
1aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab00 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ab10 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20 66  bytes required f
1ab20 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57  or *p */..  /* W
1ab30 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74 20  e want to shift 
1ab40 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70 61  the pointer pSpa
1ab50 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74 20  ce up such that 
1ab60 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c 69  it is 8-byte ali
1ab70 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c  gned..  ** Thus,
1ab80 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c 63   we need to calc
1ab90 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20 6e  ulate a value, n
1aba0 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20 61  Off, between 0 a
1abb0 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20 0a  nd 7, to shift .
1abc0 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66 20    ** it by.  If 
1abd0 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61 64  pSpace is alread
1abe0 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64  y 8-byte aligned
1abf0 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62 65  , nOff should be
1ac00 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f   zero..  */.  nO
1ac10 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49 54  ff = (8 - (SQLIT
1ac20 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70  E_PTR_TO_INT(pSp
1ac30 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b 0a  ace) & 7)) & 7;.
1ac40 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
1ac50 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64  (sizeof(Unpacked
1ac60 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f  Record)) + sizeo
1ac70 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f  f(Mem)*(pKeyInfo
1ac80 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69  ->nField+1);.  i
1ac90 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63 65  f( nByte>szSpace
1aca0 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20 3d  +nOff ){.    p =
1acb0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
1acc0 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   *)sqlite3DbMall
1acd0 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e  ocRaw(pKeyInfo->
1ace0 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20 20  db, nByte);.    
1acf0 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72 20  *ppFree = (char 
1ad00 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70 20  *)p;.    if( !p 
1ad10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65  ) return 0;.  }e
1ad20 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e  lse{.    p = (Un
1ad30 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26 70  packedRecord*)&p
1ad40 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20  Space[nOff];.   
1ad50 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20 20   *ppFree = 0;.  
1ad60 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28  }..  p->aMem = (
1ad70 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70 29  Mem*)&((char*)p)
1ad80 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55  [ROUND8(sizeof(U
1ad90 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29 5d  npackedRecord))]
1ada0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1adb0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1adc0 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79  !=0 );.  p->pKey
1add0 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
1ade0 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70  .  p->nField = p
1adf0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1ae00 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b  + 1;.  return p;
1ae10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
1ae20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e  the nKey-byte en
1ae30 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63 6f  coding of a reco
1ae40 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f  rd in pKey[], po
1ae50 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20 55  pulate the .** U
1ae60 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74  npackedRecord st
1ae70 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74 65  ructure indicate
1ae80 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68 20  d by the fourth 
1ae90 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74 68  argument with th
1aea0 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66  e.** contents of
1aeb0 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65 63   the decoded rec
1aec0 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71  ord..*/ .void sq
1aed0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1aee0 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f  npack(.  KeyInfo
1aef0 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1af00 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
1af10 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64 20  bout the record 
1af20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20  format */.  int 
1af30 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1af40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
1af50 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20  e binary record 
1af60 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1af70 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54  *pKey,      /* T
1af80 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1af90 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1afa0 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a 20  cord *p      /* 
1afb0 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73 74  Populate this st
1afc0 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20 72  ructure before r
1afd0 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a  eturning. */.){.
1afe0 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1aff0 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63   char *aKey = (c
1b000 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b010 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74  ar *)pKey;.  int
1b020 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b 20   d; .  u32 idx; 
1b030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b040 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1b050 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65   in aKey[] to re
1b060 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36  ad from */.  u16
1b070 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
1b080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b090 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
1b0a0 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 73  unter */.  u32 s
1b0b0 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65  zHdr;.  Mem *pMe
1b0c0 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20  m = p->aMem;..  
1b0d0 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d 20  p->default_rc = 
1b0e0 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  0;.  assert( EIG
1b0f0 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
1b100 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78  T(pMem) );.  idx
1b110 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1b120 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64  Key, szHdr);.  d
1b130 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20   = szHdr;.  u = 
1b140 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  0;.  while( idx<
1b150 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79  szHdr && d<=nKey
1b160 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69   ){.    u32 seri
1b170 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69 64  al_type;..    id
1b180 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1b190 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72  (&aKey[idx], ser
1b1a0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 70  ial_type);.    p
1b1b0 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49  Mem->enc = pKeyI
1b1c0 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d  nfo->enc;.    pM
1b1d0 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em->db = pKeyInf
1b1e0 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d  o->db;.    /* pM
1b1f0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f  em->flags = 0; /
1b200 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  / sqlite3VdbeSer
1b210 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73 65  ialGet() will se
1b220 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a 2f  t this for us */
1b230 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c  .    pMem->szMal
1b240 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b  loc = 0;.    d +
1b250 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
1b260 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c  ialGet(&aKey[d],
1b270 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d   serial_type, pM
1b280 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b  em);.    pMem++;
1b290 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d  .    if( (++u)>=
1b2a0 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65 61  p->nField ) brea
1b2b0 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  k;.  }.  assert(
1b2c0 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   u<=pKeyInfo->nF
1b2d0 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d  ield + 1 );.  p-
1b2e0 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a  >nField = u;.}..
1b2f0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1b300 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1b310 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74 77  tion compares tw
1b320 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c 65  o index or table
1b330 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e 20   record keys in 
1b340 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20  the same way.** 
1b350 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56 64  as the sqlite3Vd
1b360 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b370 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b  ) routine. Unlik
1b380 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e VdbeRecordComp
1b390 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66  are(),.** this f
1b3a0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1b3b0 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72 65  izes and compare
1b3c0 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20 74  s values using t
1b3d0 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  he.** sqlite3Vdb
1b3e0 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e 64  eSerialGet() and
1b3f0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1b400 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  re() functions. 
1b410 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e  It is used.** in
1b420 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1b430 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
1b440 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a 65  hat the optimize
1b450 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c  d code in.** sql
1b460 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1b470 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73 20  mpare() returns 
1b480 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68 65  results with the
1b490 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76 65  se two primitive
1b4a0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
1b4b0 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73 75  true if the resu
1b4c0 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e  lt of comparison
1b4d0 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
1b4e0 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 2e  o desiredResult.
1b4f0 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
1b500 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 64   if there is a d
1b510 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a  isagreement..*/.
1b520 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1b530 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1b540 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1b550 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b560 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1b570 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b  /.  const Unpack
1b580 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1b590 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a  , /* Right key *
1b5a0 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64 52  /.  int desiredR
1b5b0 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  esult           
1b5c0 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e 73    /* Correct ans
1b5d0 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20  wer */.){.  u32 
1b5e0 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  d1;            /
1b5f0 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1b600 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74  ey[] of next dat
1b610 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  a element */.  u
1b620 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20  32 idx1;        
1b630 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1b640 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1b650 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a  header element *
1b660 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1b670 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1b680 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65 61   of bytes in hea
1b690 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d  der */.  int i =
1b6a0 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30   0;.  int rc = 0
1b6b0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1b6c0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1b6d0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1b6e0 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1b6f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1b700 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a  fo;.  Mem mem1;.
1b710 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  .  pKeyInfo = pP
1b720 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1b730 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1b740 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1b750 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70  ;.  mem1.enc = p
1b760 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
1b770 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1b780 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d  fo->db;.  /* mem
1b790 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f  1.flags = 0;  //
1b7a0 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c   Will be initial
1b7b0 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 56  ized by sqlite3V
1b7c0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 2a  dbeSerialGet() *
1b7d0 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  /.  VVA_ONLY( me
1b7e0 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1b7f0 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1b800 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1b810 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f  atements */..  /
1b820 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20  * Compilers may 
1b830 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d 65  complain that me
1b840 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e 74  m1.u.i is potent
1b850 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69  ially uninitiali
1b860 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75  zed..  ** We cou
1b870 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74  ld initialize it
1b880 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65 2c  , as shown here,
1b890 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f 73   to silence thos
1b8a0 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20  e complaints..  
1b8b0 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c 20  ** But in fact, 
1b8c0 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65  mem1.u.i will ne
1b8d0 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65 20  ver actually be 
1b8e0 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a  used uninitializ
1b8f0 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20  ed, and doing . 
1b900 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73 73   ** the unnecess
1b910 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74 69  ary initializati
1b920 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72 61  on has a measura
1b930 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65 72  ble negative per
1b940 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d  formance.  ** im
1b950 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69 73  pact, since this
1b960 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 65   routine is a ve
1b970 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e 20  ry high runner. 
1b980 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f   And so, we choo
1b990 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72  se.  ** to ignor
1b9a0 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  e the compiler w
1b9b0 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61 76  arnings and leav
1b9c0 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65 20  e this variable 
1b9d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1b9e0 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75   */.  /*  mem1.u
1b9f0 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20  .i = 0;  // not 
1ba00 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f 20  needed, here to 
1ba10 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72  silence compiler
1ba20 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20   warning */.  . 
1ba30 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1ba40 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1ba50 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72 31  1);.  if( szHdr1
1ba60 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e 20  >98307 ) return 
1ba70 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a  SQLITE_CORRUPT;.
1ba80 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20    d1 = szHdr1;. 
1ba90 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1baa0 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1bab0 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1bac0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43  ey2->nField || C
1bad0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1bae0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1baf0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1bb00 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bb10 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1bb20 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1bb30 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1bb40 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1bb50 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1bb60 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  ype1;..    /* Re
1bb70 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  ad the serial ty
1bb80 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78 74  pes for the next
1bb90 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63 68   element in each
1bba0 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78   key. */.    idx
1bbb0 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  1 += getVarint32
1bbc0 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73 65  ( aKey1+idx1, se
1bbd0 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20  rial_type1 );.. 
1bbe0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
1bbf0 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75 67  t there is enoug
1bc00 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d 61  h key space rema
1bc10 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20  ining to avoid. 
1bc20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20 6f     ** a buffer o
1bc30 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22 64  verread.  The "d
1bc40 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32  1+serial_type1+2
1bc50 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e 20  " subexpression 
1bc60 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61  will.    ** alwa
1bc70 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ys be greater th
1bc80 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
1bc90 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71  he amount of req
1bca0 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65 2e  uired key space.
1bcb0 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61 74  .    ** Use that
1bcc0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74   approximation t
1bcd0 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72 65  o avoid the more
1bce0 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c 20   expensive call 
1bcf0 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
1bd00 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1bd10 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d  en() in the comm
1bd20 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  on case..    */.
1bd30 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69 61      if( d1+seria
1bd40 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29 6e  l_type1+2>(u32)n
1bd50 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31 2b  Key1.     && d1+
1bd60 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1bd70 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f  lTypeLen(serial_
1bd80 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65 79  type1)>(u32)nKey
1bd90 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  1 .    ){.      
1bda0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1bdb0 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
1bdc0 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63 6f   values to be co
1bdd0 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  mpared..    */. 
1bde0 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33     d1 += sqlite3
1bdf0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1be00 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1be10 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a  _type1, &mem1);.
1be20 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63  .    /* Do the c
1be30 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f  omparison.    */
1be40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1be50 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d  3MemCompare(&mem
1be60 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  1, &pPKey2->aMem
1be70 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  [i], pKeyInfo->a
1be80 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66  Coll[i]);.    if
1be90 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1bea0 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1beb0 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1bec0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1bed0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ow */.      if( 
1bee0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1bef0 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20  rder[i] ){.     
1bf00 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a     rc = -rc;  /*
1bf10 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73 75   Invert the resu
1bf20 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72 74  lt for DESC sort
1bf30 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20   order. */.     
1bf40 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65   }.      goto de
1bf50 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20  bugCompareEnd;. 
1bf60 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20     }.    i++;.  
1bf70 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a 48  }while( idx1<szH
1bf80 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32 2d  dr1 && i<pPKey2-
1bf90 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a  >nField );..  /*
1bfa0 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1bfb0 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1bfc0 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1bfd0 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1bfe0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1bff0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1c000 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1c010 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1c020 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1c030 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1c040 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1c050 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1c060 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  1)..  */.  asser
1c070 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1c080 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1c090 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1c0a0 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65  at one of the ke
1c0b0 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1c0c0 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1c0d0 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1c0e0 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1c0f0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1c100 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1c110 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1c120 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64    rc = pPKey2->d
1c130 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75  efault_rc;..debu
1c140 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69  gCompareEnd:.  i
1c150 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1c160 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20 72  ==0 && rc==0 ) r
1c170 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1c180 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20 26  esiredResult<0 &
1c190 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e 20  & rc<0 ) return 
1c1a0 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1c1b0 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e 30  Result>0 && rc>0
1c1c0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c1d0 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1c1e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1c1f0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1c200 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74  llocFailed ) ret
1c210 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  urn 1;.  return 
1c220 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  0;.}.#endif..#if
1c230 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1c240 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75  .** Count the nu
1c250 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20 28  mber of fields (
1c260 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20  a.k.a. columns) 
1c270 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  in the record gi
1c280 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e  ven by.** pKey,n
1c290 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66 79  Key.  The verify
1c2a0 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e 74   that this count
1c2b0 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72   is less than or
1c2c0 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a   equal to the.**
1c2d0 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79 20   limit given by 
1c2e0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1c2f0 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46   + pKeyInfo->nXF
1c300 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ield..**.** If t
1c310 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20 69  his constraint i
1c320 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64 2c  s not satisfied,
1c330 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
1c340 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a  he high-speed.**
1c350 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1c360 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62 65  reInt() and vdbe
1c370 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1c380 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20 77  ing() routines w
1c390 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20  ill.** not work 
1c3a0 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20 74  correctly.  If t
1c3b0 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76 65  his assert() eve
1c3c0 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f 62  r fires, it prob
1c3d0 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68  ably means.** th
1c3e0 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e  at the KeyInfo.n
1c3f0 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f  Field or KeyInfo
1c400 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73 20  .nXField values 
1c410 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a  were computed.**
1c420 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f   incorrectly..*/
1c430 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
1c440 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1c450 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20  tWithinLimits(. 
1c460 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74   int nKey, const
1c470 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f   void *pKey,   /
1c480 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f 20  * The record to 
1c490 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e  verify */ .  con
1c4a0 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  st KeyInfo *pKey
1c4b0 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f  Info       /* Co
1c4c0 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68 20  mpare size with 
1c4d0 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a  this KeyInfo */.
1c4e0 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64 20  ){.  int nField 
1c4f0 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64 72  = 0;.  u32 szHdr
1c500 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20 75  ;.  u32 idx;.  u
1c510 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f  32 notUsed;.  co
1c520 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c530 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74  r *aKey = (const
1c540 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29   unsigned char*)
1c550 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52  pKey;..  if( COR
1c560 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1c570 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61 72  ;.  idx = getVar
1c580 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64  int32(aKey, szHd
1c590 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4b  r);.  assert( nK
1c5a0 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ey>=0 );.  asser
1c5b0 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e  t( szHdr<=(u32)n
1c5c0 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  Key );.  while( 
1c5d0 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20  idx<szHdr ){.   
1c5e0 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1c5f0 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f  t32(aKey+idx, no
1c600 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69 65  tUsed);.    nFie
1c610 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ld++;.  }.  asse
1c620 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b  rt( nField <= pK
1c630 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1c640 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1c650 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65   );.}.#else.# de
1c660 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74 46  fine vdbeAssertF
1c670 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1c680 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e  imits(A,B,C).#en
1c690 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
1c6a0 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
1c6b0 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
1c6c0 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
1c6d0 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
1c6e0 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
1c6f0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1c700 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
1c710 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
1c720 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
1c730 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
1c740 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
1c750 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
1c760 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1c770 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
1c780 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
1c790 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
1c7a0 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
1c7b0 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
1c7c0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
1c7d0 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1c7e0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1c7f0 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
1c800 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
1c810 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
1c820 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
1c830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c840 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
1c850 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
1c860 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
1c870 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
1c880 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
1c890 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
1c8a0 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
1c8b0 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
1c8c0 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
1c8d0 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
1c8e0 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
1c8f0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
1c900 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
1c910 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
1c920 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
1c930 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
1c940 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
1c950 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
1c960 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
1c970 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
1c980 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
1c990 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
1c9a0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
1c9b0 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
1c9c0 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
1c9d0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
1c9e0 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
1c9f0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
1ca00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1ca10 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
1ca20 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
1ca30 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
1ca40 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1ca50 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
1ca60 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
1ca70 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
1ca80 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
1ca90 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
1caa0 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
1cab0 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
1cac0 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
1cad0 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
1cae0 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
1caf0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
1cb00 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
1cb10 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
1cb20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
1cb30 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
1cb40 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
1cb50 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76   if( (v1==0 || v
1cb60 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20  2==0) && prcErr 
1cb70 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
1cb80 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
1cb90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1cba0 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20  mRelease(&c1);. 
1cbb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1cbc0 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20  mRelease(&c2);. 
1cbd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1cbe0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1cbf0 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20 52  re two blobs.  R
1cc00 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c 20  eturn negative, 
1cc10 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
1cc20 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a 2a  e if the first.*
1cc30 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  * is less than, 
1cc40 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1cc50 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1cc60 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76 65  cond, respective
1cc70 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62 6c  ly..** If one bl
1cc80 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20 6f  ob is a prefix o
1cc90 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68 65  f the other, the
1cca0 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69 73  n the shorter is
1ccb0 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a   the lessor..*/.
1ccc0 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
1ccd0 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69 74  INLINE int sqlit
1cce0 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63 6f  e3BlobCompare(co
1ccf0 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63 6f  nst Mem *pB1, co
1cd00 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a 20  nst Mem *pB2){. 
1cd10 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70 28   int c = memcmp(
1cd20 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20  pB1->z, pB2->z, 
1cd30 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f 20  pB1->n>pB2->n ? 
1cd40 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e 29  pB2->n : pB1->n)
1cd50 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74 75  ;.  if( c ) retu
1cd60 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20 70  rn c;.  return p
1cd70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b 0a  B1->n - pB2->n;.
1cd80 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63 6f  }../*.** Do a co
1cd90 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65 6e  mparison between
1cda0 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65 64   a 64-bit signed
1cdb0 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20 36   integer and a 6
1cdc0 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d 70  4-bit floating-p
1cdd0 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e 20  oint.** number. 
1cde0 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65   Return negative
1cdf0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
1ce00 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74  ive if the first
1ce10 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20 74   (i64) is less t
1ce20 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74 6f  han,.** equal to
1ce30 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1ce40 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64 6f  n the second (do
1ce50 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  uble)..*/.static
1ce60 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74 46   int sqlite3IntF
1ce70 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34 20  loatCompare(i64 
1ce80 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20 20  i, double r){.  
1ce90 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44  if( sizeof(LONGD
1cea0 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29 7b  OUBLE_TYPE)>8 ){
1ceb0 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45 5f  .    LONGDOUBLE_
1cec0 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44 4f  TYPE x = (LONGDO
1ced0 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20 20  UBLE_TYPE)i;.   
1cee0 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75 72   if( x<r ) retur
1cef0 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78 3e  n -1;.    if( x>
1cf00 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1cf10 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1cf20 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79 3b  else{.    i64 y;
1cf30 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a 20  .    double s;. 
1cf40 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33 37     if( r<-922337
1cf50 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30 20  2036854775808.0 
1cf60 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20  ) return +1;.   
1cf70 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30 33   if( r>922337203
1cf80 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20 72  6854775807.0 ) r
1cf90 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79 20  eturn -1;.    y 
1cfa0 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69 66  = (i64)r;.    if
1cfb0 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20 2d  ( i<y ) return -
1cfc0 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20 29  1;.    if( i>y )
1cfd0 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d 53  {.      if( y==S
1cfe0 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26 26  MALLEST_INT64 &&
1cff0 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e 20   r>0.0 ) return 
1d000 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1d010 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   +1;.    }.    s
1d020 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20 20   = (double)i;.  
1d030 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74 75    if( s<r ) retu
1d040 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 73  rn -1;.    if( s
1d050 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1d060 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d070 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  }.}../*.** Compa
1d080 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63 6f  re the values co
1d090 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20 74  ntained by the t
1d0a0 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 2c  wo memory cells,
1d0b0 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e 65   returning.** ne
1d0c0 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72 20  gative, zero or 
1d0d0 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65 6d  positive if pMem
1d0e0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1d0f0 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1d100 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d 65  ater.** than pMe
1d110 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64 65  m2. Sorting orde
1d120 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72 73  r is NULL's firs
1d130 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 6e  t, followed by n
1d140 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72 73  umbers (integers
1d150 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20 73  .** and reals) s
1d160 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c 6c  orted numericall
1d170 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20 74  y, followed by t
1d180 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20 74  ext ordered by t
1d190 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20  he collating.** 
1d1a0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 61  sequence pColl a
1d1b0 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62 27  nd finally blob'
1d1c0 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65 6d  s ordered by mem
1d1d0 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f  cmp()..**.** Two
1d1e0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72 65   NULL values are
1d1f0 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75 61   considered equa
1d200 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  l by this functi
1d210 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
1d220 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f 6e  e3MemCompare(con
1d230 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20 63  st Mem *pMem1, c
1d240 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c  onst Mem *pMem2,
1d250 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a   const CollSeq *
1d260 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66 31  pColl){.  int f1
1d270 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d 62  , f2;.  int comb
1d280 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20 66  ined_flags;..  f
1d290 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67 73  1 = pMem1->flags
1d2a0 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d 3e  ;.  f2 = pMem2->
1d2b0 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e 65  flags;.  combine
1d2c0 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32 3b  d_flags = f1|f2;
1d2d0 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d 62  .  assert( (comb
1d2e0 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45 4d  ined_flags & MEM
1d2f0 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a 20  _RowSet)==0 );. 
1d300 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c  .  /* If one val
1d310 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20 69  ue is NULL, it i
1d320 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20  s less than the 
1d330 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20 76  other. If both v
1d340 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20 4e  alues.  ** are N
1d350 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  ULL, return 0.. 
1d360 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1d370 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c  ed_flags&MEM_Nul
1d380 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  l ){.    return 
1d390 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d 20  (f2&MEM_Null) - 
1d3a0 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  (f1&MEM_Null);. 
1d3b0 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61 73   }..  /* At leas
1d3c0 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77 6f  t one of the two
1d3d0 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75 6d   values is a num
1d3e0 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ber.  */.  if( c
1d3f0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1d400 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1d410 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1d420 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29 21  & f2 & MEM_Int)!
1d430 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1d440 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d 65  pMem1->u.i < pMe
1d450 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1d460 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70   -1;.      if( p
1d470 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65 6d  Mem1->u.i > pMem
1d480 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e 20  2->u.i ) return 
1d490 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1d4a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   0;.    }.    if
1d4b0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1d4c0 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1d4d0 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1d4e0 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r < pMem2->u.r )
1d4f0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d500 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 72    if( pMem1->u.r
1d510 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29 20   > pMem2->u.r ) 
1d520 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20  return +1;.     
1d530 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1d540 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d  .    if( (f1&MEM
1d550 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1d560 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52 65    if( (f2&MEM_Re
1d570 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  al)!=0 ){.      
1d580 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d590 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1d5a0 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65 6d  pMem1->u.i, pMem
1d5b0 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  2->u.r);.      }
1d5c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
1d5d0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d  turn -1;.      }
1d5e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d5f0 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20  f1&MEM_Real)!=0 
1d600 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32  ){.      if( (f2
1d610 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1d620 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1d630 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1d640 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75 2e  ompare(pMem2->u.
1d650 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b 0a  i, pMem1->u.r);.
1d660 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1d670 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a       return -1;.
1d680 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d690 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 7d    return +1;.  }
1d6a0 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61  ..  /* If one va
1d6b0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1d6c0 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69 73  and the other is
1d6d0 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74 72   a blob, the str
1d6e0 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20 2a  ing is less..  *
1d6f0 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73 74  * If both are st
1d700 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20 75  rings, compare u
1d710 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1d720 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20  ng functions..  
1d730 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  */.  if( combine
1d740 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 20  d_flags&MEM_Str 
1d750 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20 26  ){.    if( (f1 &
1d760 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a   MEM_Str)==0 ){.
1d770 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1d780 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1d790 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  2 & MEM_Str)==0 
1d7a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d7b0 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  -1;.    }..    a
1d7c0 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65 6e  ssert( pMem1->en
1d7d0 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c 7c  c==pMem2->enc ||
1d7e0 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c 6c   pMem1->db->mall
1d7f0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
1d800 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1d810 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1d820 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1d830 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1d840 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1d850 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d860 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1d870 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1d880 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1d890 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1d8a0 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1d8b0 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1d8c0 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1d8d0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1d8e0 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1d8f0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1d900 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1d910 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1d920 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1d930 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1d940 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1d950 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1d960 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1d970 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1d980 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1d990 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1d9a0 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1d9b0 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1d9c0 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1d9d0 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1d9e0 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1d9f0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1da00 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1da10 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1da20 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1da30 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1da40 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1da50 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1da60 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1da70 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1da80 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1da90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1daa0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1dab0 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1dac0 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1dad0 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1dae0 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1daf0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1db00 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1db10 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1db20 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1db30 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1db40 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1db50 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1db60 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1db70 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1db80 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1db90 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1dba0 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1dbb0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1dbc0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1dbd0 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1dbe0 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1dbf0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1dc00 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1dc10 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1dc20 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1dc30 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1dc40 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1dc50 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1dc60 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1dc70 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1dc80 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1dc90 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1dca0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1dcb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1dcc0 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1dcd0 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1dce0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1dcf0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1dd00 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1dd10 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1dd20 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1dd30 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1dd40 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1dd50 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1dd60 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1dd70 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1dd80 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1dd90 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1dda0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1ddb0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1ddc0 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1ddd0 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1dde0 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1ddf0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1de00 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1de10 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1de20 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1de30 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1de40 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1de50 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1de60 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1de70 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1de80 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1de90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1dea0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1deb0 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1dec0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1ded0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1dee0 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1def0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1df00 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1df10 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1df20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1df30 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1df40 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1df50 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1df60 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1df70 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1df80 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1df90 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1dfa0 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1dfb0 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1dfc0 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1dfd0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1dfe0 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1dff0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1e000 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1e010 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1e020 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1e030 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1e040 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1e050 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1e060 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1e070 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1e080 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1e090 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1e0a0 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1e0b0 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1e0c0 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1e0d0 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1e0e0 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1e0f0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1e100 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1e110 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e120 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1e130 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1e140 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1e150 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1e160 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1e170 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1e180 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1e190 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1e1a0 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1e1b0 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1e1c0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1e1d0 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1e1e0 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1e1f0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1e200 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1e210 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1e220 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1e230 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1e240 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1e250 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1e260 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1e270 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1e280 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1e290 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1e2a0 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1e2b0 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1e2c0 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1e2d0 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1e2e0 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1e2f0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
1e300 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1e310 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1e320 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1e330 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1e340 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1e350 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1e360 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1e370 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1e380 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1e390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1e3a0 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1e3b0 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1e3c0 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1e3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3e0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1e3f0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1e400 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1e410 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1e440 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1e450 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1e460 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1e470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1e480 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1e490 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1e4a0 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1e4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4c0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1e4d0 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1e4e0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1e4f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1e500 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1e510 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1e520 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1e530 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1e540 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1e550 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1e560 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1e570 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1e580 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1e590 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1e5a0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1e5b0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1e5c0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1e5d0 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1e5e0 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1e5f0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1e600 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1e610 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1e620 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1e630 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1e640 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1e650 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1e660 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1e670 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1e680 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1e690 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1e6a0 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1e6b0 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1e6c0 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1e6d0 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1e6e0 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1e6f0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1e700 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1e710 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1e720 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1e730 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1e740 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1e750 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1e760 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1e770 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1e780 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1e790 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1e7a0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1e7b0 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1e7c0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1e7d0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e7e0 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1e7f0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1e800 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1e810 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1e820 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1e830 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1e840 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1e850 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1e860 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1e870 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e880 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1e890 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1e8a0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1e8b0 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1e8c0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1e8d0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1e8e0 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1e8f0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1e900 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1e910 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1e920 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1e930 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1e940 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1e950 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1e960 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1e970 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1e980 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1e990 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1e9a0 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1e9b0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1e9c0 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1e9d0 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1e9e0 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1e9f0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30   serial_type>=10
1ea00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1ea10 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1ea20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ea30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1ea40 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1ea50 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1ea60 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1ea70 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1ea80 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1ea90 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1eaa0 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1eab0 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e 74  rc = -sqlite3Int
1eac0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52 68  FloatCompare(pRh
1ead0 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e 72  s->u.i, mem1.u.r
1eae0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1eaf0 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73 20          i64 lhs 
1eb00 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  = vdbeRecordDeco
1eb10 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79 70  deInt(serial_typ
1eb20 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b 0a  e, &aKey1[d1]);.
1eb30 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73 20          i64 rhs 
1eb40 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20  = pRhs->u.i;.   
1eb50 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73       if( lhs<rhs
1eb60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1eb70 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1eb80 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73  else if( lhs>rhs
1eb90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1eba0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1ebb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ebc0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72 65      /* RHS is re
1ebd0 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  al */.    else i
1ebe0 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1ebf0 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
1ec00 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d     serial_type =
1ec10 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20   aKey1[idx1];.  
1ec20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1ec30 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20  ype>=10 ){.     
1ec40 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1ec50 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65 72  es 12 or greater
1ec60 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e 64   are strings and
1ec70 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72 20   blobs (greater 
1ec80 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  than.        ** 
1ec90 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73 20  numbers). Types 
1eca0 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63 75  10 and 11 are cu
1ecb0 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76 65  rrently "reserve
1ecc0 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20 20  d for future .  
1ecd0 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20 73        ** use", s
1ece0 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65 61  o it doesn't rea
1ecf0 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74 20  lly matter what 
1ed00 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 63  the results of c
1ed10 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20  omparing.       
1ed20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d 62   ** them to numb
1ed30 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65 2e  eric values are.
1ed40 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20    */.        rc 
1ed50 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1ed60 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1ed70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1ed80 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1ed90 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1eda0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1edb0 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73  et(&aKey1[d1], s
1edc0 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d  erial_type, &mem
1edd0 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1ede0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1edf0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1ee00 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e 75  mem1.u.r<pRhs->u
1ee10 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1ee20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1ee30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6d       }else if( m
1ee40 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75 2e  em1.u.r>pRhs->u.
1ee50 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
1ee60 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1ee70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1ee80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
1ee90 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  c = sqlite3IntFl
1eea0 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31 2e  oatCompare(mem1.
1eeb0 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29 3b  u.i, pRhs->u.r);
1eec0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1eed0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1eee0 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e 67   RHS is a string
1eef0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28   */.    else if(
1ef00 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d   pRhs->flags & M
1ef10 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
1ef20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ef30 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1ef40 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1ef50 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1ef60 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1ef70 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1ef80 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  <12 ){.        r
1ef90 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1efa0 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61 6c  lse if( !(serial
1efb0 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1efc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31  .        rc = +1
1efd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1efe0 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20         mem1.n = 
1eff0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1f000 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1f010 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65  testcase( (d1+me
1f020 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64  m1.n)==(unsigned
1f030 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f040 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1f050 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69  mem1.n+1)==(unsi
1f060 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f070 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d 65        if( (d1+me
1f080 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65  m1.n) > (unsigne
1f090 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1f0a0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1f0b0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1f0c0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1f0d0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1f0e0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1f0f0 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1f100 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1f110 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  e if( pKeyInfo->
1f120 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20  aColl[i] ){.    
1f130 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d        mem1.enc =
1f140 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a   pKeyInfo->enc;.
1f150 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 64            mem1.d
1f160 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1f170 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1f180 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  .flags = MEM_Str
1f190 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  ;.          mem1
1f1a0 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b 65  .z = (char*)&aKe
1f1b0 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20 20  y1[d1];.        
1f1c0 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70 61    rc = vdbeCompa
1f1d0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 20  reMemString(.   
1f1e0 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d 31             &mem1
1f1f0 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f  , pRhs, pKeyInfo
1f200 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b  ->aColl[i], &pPK
1f210 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20  ey2->errCode.   
1f220 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
1f230 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f240 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49     int nCmp = MI
1f250 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e  N(mem1.n, pRhs->
1f260 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1f270 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1f280 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1f290 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1f2a0 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1f2b0 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e   mem1.n - pRhs->
1f2c0 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  n; .        }.  
1f2d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f2e0 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c 6f   /* RHS is a blo
1f2f0 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  b */.    else if
1f300 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1f310 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
1f320 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1f330 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69  Key1[idx1], seri
1f340 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20  al_type);.      
1f350 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1f360 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1f370 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1f380 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c  pe<12 || (serial
1f390 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29 7b  _type & 0x01) ){
1f3a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1f3b0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1f3c0 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20         int nStr 
1f3d0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  = (serial_type -
1f3e0 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20   12) / 2;.      
1f3f0 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1f400 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64  nStr)==(unsigned
1f410 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f420 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b    testcase( (d1+
1f430 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e  nStr+1)==(unsign
1f440 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20  ed)nKey1 );.    
1f450 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72      if( (d1+nStr
1f460 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b  ) > (unsigned)nK
1f470 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ey1 ){.         
1f480 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1f490 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
1f4a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1f4b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f4d0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
1f4e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f4f0 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1f500 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52  p = MIN(nStr, pR
1f510 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1f520 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1f530 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1f540 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1f550 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1f560 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68 73  rc = nStr - pRhs
1f570 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ->n;.        }. 
1f580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f590 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c    /* RHS is null
1f5a0 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20   */.    else{.  
1f5b0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1f5c0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1f5d0 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69 61       rc = (seria
1f5e0 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20 20  l_type!=0);.    
1f5f0 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30  }..    if( rc!=0
1f600 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4b   ){.      if( pK
1f610 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1f620 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  er[i] ){.       
1f630 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20   rc = -rc;.     
1f640 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
1f650 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1f660 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
1f670 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 63  Key1, pPKey2, rc
1f680 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
1f690 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1f6a0 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1f6b0 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1f6c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f6d0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b  .    }..    i++;
1f6e0 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20  .    pRhs++;.   
1f6f0 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64   d1 += sqlite3Vd
1f700 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1f710 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f720 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74 65    idx1 += sqlite
1f730 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69 61  3VarintLen(seria
1f740 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c  l_type);.  }whil
1f750 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e 65  e( idx1<(unsigne
1f760 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50  d)szHdr1 && i<pP
1f770 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20  Key2->nField && 
1f780 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  d1<=(unsigned)nK
1f790 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ey1 );..  /* No 
1f7a0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1f7b0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1f7c0 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1f7d0 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1f7e0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1f7f0 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1f800 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1f810 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1f820 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1f830 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1f840 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1f850 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 20  Release(&mem1). 
1f860 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1f870 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1f880 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1f890 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1f8a0 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65  e or both of the
1f8b0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1f8c0 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1f8d0 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1f8e0 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1f8f0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1f900 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1f910 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1f920 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52  */.  assert( COR
1f930 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20 20  RUPT_DB .       
1f940 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  || vdbeRecordCom
1f950 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
1f960 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f970 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1f980 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20 70  rc) .       || p
1f990 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
1f9a0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
1f9b0 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20   pPKey2->eqSeen 
1f9c0 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  = 1;.  return pP
1f9d0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1f9e0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1f9f0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fa00 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1fa10 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1fa20 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1fa30 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1fa40 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
1fa50 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1fa60 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e  y */.){.  return
1fa70 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1fa80 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1fa90 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1faa0 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a  pPKey2, 0);.}...
1fab0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1fac0 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
1fad0 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
1fae0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1faf0 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
1fb00 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
1fb10 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
1fb20 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
1fb30 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a 20  and (b) the .** 
1fb40 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1fb50 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74 61  arint at the sta
1fb60 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b 65  rt of (pKey1/nKe
1fb70 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73 69  y1) fits in a si
1fb80 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69 2e  ngle.** byte (i.
1fb90 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  e. is less than 
1fba0 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  128)..**.** To a
1fbb0 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61 62  void concerns ab
1fbc0 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72 72  out buffer overr
1fbd0 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74 69  eads, this routi
1fbe0 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 0a  ne is only used.
1fbf0 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77 68  ** on schemas wh
1fc00 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  ere the maximum 
1fc10 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69 7a  valid header siz
1fc20 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f 72  e is 63 bytes or
1fc30 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63   less..*/.static
1fc40 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1fc50 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e 74  ompareInt(.  int
1fc60 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1fc70 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65  id *pKey1, /* Le
1fc80 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1fc90 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1fca0 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  y2        /* Rig
1fcb0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63  ht key */.){.  c
1fcc0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d 20  onst u8 *aKey = 
1fcd0 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  &((const u8*)pKe
1fce0 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a 29  y1)[*(const u8*)
1fcf0 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a 20  pKey1 & 0x3F];. 
1fd00 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
1fd10 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29 70   = ((const u8*)p
1fd20 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74 20  Key1)[1];.  int 
1fd30 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20 20  res;.  u32 y;.  
1fd40 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20 3d  u64 x;.  i64 v =
1fd50 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1fd60 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73 3b  .u.i;.  i64 lhs;
1fd70 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69  ..  vdbeAssertFi
1fd80 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69  eldCountWithinLi
1fd90 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79  mits(nKey1, pKey
1fda0 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  1, pPKey2->pKeyI
1fdb0 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20  nfo);.  assert( 
1fdc0 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30  (*(u8*)pKey1)<=0
1fdd0 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  x3F || CORRUPT_D
1fde0 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  B );.  switch( s
1fdf0 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1fe00 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31    case 1: { /* 1
1fe10 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1fe20 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1fe30 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  s = ONE_BYTE_INT
1fe40 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65  (aKey);.      te
1fe50 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1fe60 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fe70 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
1fe80 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
1fe90 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1fea0 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59      lhs = TWO_BY
1feb0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1fec0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1fed0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1fee0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1fef0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
1ff00 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1ff10 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1ff20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61  THREE_BYTE_INT(a
1ff30 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1ff40 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1ff50 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ff60 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20  }.    case 4: { 
1ff70 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 4-byte signed
1ff80 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1ff90 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    y = FOUR_BYTE_
1ffa0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
1ffb0 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69    lhs = (i64)*(i
1ffc0 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65  nt*)&y;.      te
1ffd0 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b  stcase( lhs<0 );
1ffe0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1fff0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
20000 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
20010 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20020 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42      lhs = FOUR_B
20030 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29  YTE_UINT(aKey+2)
20040 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
20050 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  )*TWO_BYTE_INT(a
20060 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
20070 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20080 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20090 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20  }.    case 6: { 
200a0 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
200b0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
200c0 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f    x = FOUR_BYTE_
200d0 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  UINT(aKey);.    
200e0 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20    x = (x<<32) | 
200f0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20100 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68  Key+4);.      lh
20110 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20  s = *(i64*)&x;. 
20120 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
20130 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
20140 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
20150 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68  ase 8: .      lh
20160 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65  s = 0;.      bre
20170 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a  ak;.    case 9:.
20180 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20        lhs = 1;. 
20190 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
201a0 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f   /* This case co
201b0 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77  uld be removed w
201c0 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20  ithout changing 
201d0 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72  the results of r
201e0 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  unning.    ** th
201f0 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69  is code. Includi
20200 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63 63  ng it causes gcc
20210 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66   to generate a f
20220 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20 20  aster switch .  
20230 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28    ** statement (
20240 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20  since the range 
20250 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65 74  of switch target
20260 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20  s now starts at 
20270 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20  zero and.    ** 
20280 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62  is contiguous) b
20290 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  ut does not caus
202a0 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20  e any duplicate 
202b0 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72  code to be gener
202c0 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20  ated.    ** (as 
202d0 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e  gcc is clever en
202e0 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20  ough to combine 
202f0 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73  the two like cas
20300 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20  es). Other .    
20310 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67  ** compilers mig
20320 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20  ht be similar.  
20330 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20  */ .    case 0: 
20340 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65  case 7:.      re
20350 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
20360 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
20370 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20380 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c  y2);..    defaul
20390 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  t:.      return 
203a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
203b0 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20  dCompare(nKey1, 
203c0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a  pKey1, pPKey2);.
203d0 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68 73    }..  if( v>lhs
203e0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
203f0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c 73  Key2->r1;.  }els
20400 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a 20  e if( v<lhs ){. 
20410 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20420 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  >r2;.  }else if(
20430 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
20440 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  1 ){.    /* The 
20450 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
20460 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
20470 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65 20   equal. Compare 
20480 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20 20  the trailing .  
20490 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a 2f    ** fields.  */
204a0 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
204b0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
204c0 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79  areWithSkip(nKey
204d0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
204e0 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 1);.  }else{. 
204f0 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
20500 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77  fields of the tw
20510 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  o keys are equal
20520 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
20530 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a  o trailing.    *
20540 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72 6e  * fields. Return
20550 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20560 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  _rc in this case
20570 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 70  . */.    res = p
20580 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20590 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e 65  c;.    pPKey2->e
205a0 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a 0a  qSeen = 1;.  }..
205b0 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65    assert( vdbeRe
205c0 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67  cordCompareDebug
205d0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
205e0 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20  PKey2, res) );. 
205f0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
20600 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
20610 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ion is an optimi
20620 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  zed version of s
20630 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20640 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68  Compare() .** th
20650 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74  at (a) the first
20660 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32   field of pPKey2
20670 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68   is a string, th
20680 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74  at (b) the first
20690 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74   field.** uses t
206a0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
206b0 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64  uence BINARY and
206c0 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69   (c) that the si
206d0 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72  ze-of-header var
206e0 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73  int .** at the s
206f0 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e  tart of (pKey1/n
20700 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20  Key1) fits in a 
20710 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a  single byte..*/.
20720 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
20730 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
20740 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ng(.  int nKey1,
20750 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
20760 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
20770 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
20780 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20  ord *pPKey2     
20790 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20     /* Right key 
207a0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38  */.){.  const u8
207b0 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74   *aKey1 = (const
207c0 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e   u8*)pKey1;.  in
207d0 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20  t serial_type;. 
207e0 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73 73   int res;..  ass
207f0 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  ert( pPKey2->aMe
20800 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45 4d  m[0].flags & MEM
20810 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41 73  _Str );.  vdbeAs
20820 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
20830 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
20840 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
20850 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67 65  >pKeyInfo);.  ge
20860 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
20870 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [1], serial_type
20880 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  );.  if( serial_
20890 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 72  type<12 ){.    r
208a0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
208b0 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
208c0 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d 62  nKey1) is a numb
208d0 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f 0a  er or a null */.
208e0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
208f0 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
20900 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d 20  ) ){ .    res = 
20910 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20 20  pPKey2->r2;     
20920 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31   /* (pKey1/nKey1
20930 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20  ) is a blob */. 
20940 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
20950 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nCmp;.    int nS
20960 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48 64  tr;.    int szHd
20970 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a 20  r = aKey1[0];.. 
20980 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61     nStr = (seria
20990 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b 0a  l_type-12) / 2;.
209a0 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20 2b      if( (szHdr +
209b0 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20 29   nStr) > nKey1 )
209c0 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e  {.      pPKey2->
209d0 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
209e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
209f0 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T;.      return 
20a00 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74  0;    /* Corrupt
20a10 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
20a20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50 4b   nCmp = MIN( pPK
20a30 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c 20  ey2->aMem[0].n, 
20a40 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73 20  nStr );.    res 
20a50 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b  = memcmp(&aKey1[
20a60 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d 3e  szHdr], pPKey2->
20a70 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70 29  aMem[0].z, nCmp)
20a80 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d 3d  ;..    if( res==
20a90 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  0 ){.      res =
20aa0 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d 3e   nStr - pPKey2->
20ab0 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20 20  aMem[0].n;.     
20ac0 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
20ad0 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65 79         if( pPKey
20ae0 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20  2->nField>1 ){. 
20af0 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 73           res = s
20b00 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
20b10 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28  CompareWithSkip(
20b20 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20b30 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20 20  Key2, 1);.      
20b40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20b50 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20b60 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20  >default_rc;.   
20b70 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
20b80 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20  qSeen = 1;.     
20b90 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
20ba0 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
20bb0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20bc0 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65  y2->r2;.      }e
20bd0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73  lse{.        res
20be0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
20bf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
20c00 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20   if( res>0 ){.  
20c10 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20c20 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->r2;.    }else{
20c30 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
20c40 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20  ey2->r1;.    }. 
20c50 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64   }..  assert( vd
20c60 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
20c70 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
20c80 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a  1, pPKey2, res).
20c90 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
20ca0 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70  T_DB.       || p
20cb0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
20cc0 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
20cd0 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  d.  );.  return 
20ce0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  res;.}../*.** Re
20cf0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
20d00 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65  o an sqlite3Vdbe
20d10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
20d20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74  compatible funct
20d30 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20  ion.** suitable 
20d40 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65  for comparing se
20d50 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73  rialized records
20d60 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64   to the unpacked
20d70 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a   record passed.*
20d80 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72  * as the only ar
20d90 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72  gument..*/.Recor
20da0 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33  dCompare sqlite3
20db0 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28  VdbeFindCompare(
20dc0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20dd0 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52  p){.  /* varintR
20de0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
20df0 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f  ) and varintReco
20e00 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
20e10 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20  ) both assume.  
20e20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65  ** that the size
20e30 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
20e40 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  t that occurs at
20e50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61   the start of ea
20e60 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66  ch record.  ** f
20e70 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20e80 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32  byte (i.e. is 12
20e90 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69  7 or less). vari
20ea0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
20eb0 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61  nt().  ** also a
20ec0 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69  ssumes that it i
20ed0 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65  s safe to overre
20ee0 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61  ad a buffer by a
20ef0 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a  t least the .  *
20f00 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62  * maximum possib
20f10 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20  le legal header 
20f20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65  size plus 8 byte
20f30 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65  s. Because there
20f40 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74   is.  ** guarant
20f50 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61  eed to be at lea
20f60 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31  st 74 (but not 1
20f70 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64  36) bytes of pad
20f80 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65  ding following e
20f90 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20  ach.  ** buffer 
20fa0 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74  passed to varint
20fb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20fc0 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74  () this makes it
20fd0 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20   convenient to. 
20fe0 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69   ** limit the si
20ff0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
21000 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20   to 64 bytes in 
21010 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20  cases where the 
21020 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a  first field.  **
21030 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a   is an integer..
21040 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61    **.  ** The ea
21050 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66  siest way to enf
21060 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20  orce this limit 
21070 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f  is to consider o
21080 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68  nly records with
21090 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20  .  ** 13 fields 
210a0 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20  or less. If the 
210b0 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61  first field is a
210c0 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d  n integer, the m
210d0 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a  aximum legal.  *
210e0 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  * header size is
210f0 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20   (12*5 + 1 + 1) 
21100 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28  bytes.  */.  if(
21110 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e   (p->pKeyInfo->n
21120 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49  Field + p->pKeyI
21130 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31  nfo->nXField)<=1
21140 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61  3 ){.    int fla
21150 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e  gs = p->aMem[0].
21160 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70  flags;.    if( p
21170 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
21180 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20  tOrder[0] ){.   
21190 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20     p->r1 = 1;.  
211a0 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a      p->r2 = -1;.
211b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
211c0 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20   p->r1 = -1;.   
211d0 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20     p->r2 = 1;.  
211e0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61    }.    if( (fla
211f0 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b  gs & MEM_Int) ){
21200 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
21210 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
21220 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65  nt;.    }.    te
21230 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20  stcase( flags & 
21240 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20  MEM_Real );.    
21250 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20  testcase( flags 
21260 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20  & MEM_Null );.  
21270 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
21280 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a  s & MEM_Blob );.
21290 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26      if( (flags &
212a0 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e   (MEM_Real|MEM_N
212b0 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d  ull|MEM_Blob))==
212c0 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f  0 && p->pKeyInfo
212d0 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b  ->aColl[0]==0 ){
212e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66  .      assert( f
212f0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
21300 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  ;.      return v
21310 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21320 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20  String;.    }.  
21330 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  }..  return sqli
21340 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
21350 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  pare;.}../*.** p
21360 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e  Cur points at an
21370 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65   index entry cre
21380 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f  ated using the O
21390 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
213a0 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65  ode..** Read the
213b0 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74   rowid (the last
213c0 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65   field in the re
213d0 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20  cord) and store 
213e0 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a  it in *rowid..**
213f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21400 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
21410 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72  works, or an err
21420 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  or code otherwis
21430 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69  e..**.** pCur mi
21440 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20  ght be pointing 
21450 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64  to text obtained
21460 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20   from a corrupt 
21470 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
21480 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74  * So the content
21490 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74   cannot be trust
214a0 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69  ed.  Do appropri
214b0 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68  ate checks on th
214c0 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e  e content..*/.in
214d0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
214e0 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64  Rowid(sqlite3 *d
214f0 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  b, BtCursor *pCu
21500 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a  r, i64 *rowid){.
21510 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
21520 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
21530 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20  u32 szHdr;      
21540 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
21550 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
21560 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f   typeRowid;    /
21570 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66  * Serial type of
21580 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
21590 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20  u32 lenRowid;   
215a0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
215b0 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20   rowid */.  Mem 
215c0 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  m, v;..  /* Get 
215d0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
215e0 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e  index entry.  On
215f0 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69  ly indices entri
21600 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20  es of less.  ** 
21610 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75  than 2GiB are su
21620 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67  pport - anything
21630 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64   large must be d
21640 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
21650 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72  on..  ** Any cor
21660 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63  ruption is detec
21670 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74  ted in sqlite3Bt
21680 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
21690 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20  ), though, so.  
216a0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e  ** this code can
216b0 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74   safely assume t
216c0 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20  hat nCellKey is 
216d0 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20  32-bits  .  */. 
216e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
216f0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
21700 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56  id(pCur) );.  VV
21710 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c  A_ONLY(rc =) sql
21720 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65  ite3BtreeKeySize
21730 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79  (pCur, &nCellKey
21740 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
21750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20  =SQLITE_OK );   
21760 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
21770 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
21780 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
21790 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e   */.  assert( (n
217a0 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45  CellKey & SQLITE
217b0 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29  _MAX_U32)==(u64)
217c0 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f  nCellKey );..  /
217d0 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f  * Read in the co
217e0 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f  mplete content o
217f0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
21800 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  y */.  sqlite3Vd
21810 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
21820 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
21830 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
21840 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75  tree(pCur, 0, (u
21850 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20  32)nCellKey, 1, 
21860 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  &m);.  if( rc ){
21870 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21880 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e    }..  /* The in
21890 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62  dex entry must b
218a0 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64  egin with a head
218b0 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f  er size */.  (vo
218c0 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28  id)getVarint32((
218d0 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b  u8*)m.z, szHdr);
218e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
218f0 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  dr==3 );.  testc
21900 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20  ase( szHdr==m.n 
21910 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
21920 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e  y(szHdr<3 || (in
21930 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a  t)szHdr>m.n) ){.
21940 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77      goto idx_row
21950 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20  id_corruption;. 
21960 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73   }..  /* The las
21970 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69  t field of the i
21980 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61  ndex should be a
21990 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20  n integer - the 
219a0 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69  ROWID..  ** Veri
219b0 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  fy that the last
219c0 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73   entry really is
219d0 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a   an integer. */.
219e0 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
219f0 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a  t32((u8*)&m.z[sz
21a00 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69  Hdr-1], typeRowi
21a10 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d);.  testcase( 
21a20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a  typeRowid==1 );.
21a30 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21a40 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65  Rowid==2 );.  te
21a50 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21a60 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  d==3 );.  testca
21a70 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34  se( typeRowid==4
21a80 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21a90 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a  typeRowid==5 );.
21aa0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21ab0 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65  Rowid==6 );.  te
21ac0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21ad0 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61  d==8 );.  testca
21ae0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39  se( typeRowid==9
21af0 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
21b00 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c  ly(typeRowid<1 |
21b10 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c  | typeRowid>9 ||
21b20 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29   typeRowid==7) )
21b30 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72  {.    goto idx_r
21b40 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b  owid_corruption;
21b50 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20  .  }.  lenRowid 
21b60 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
21b70 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77 69  peSizes[typeRowi
21b80 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  d];.  testcase( 
21b90 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b  (u32)m.n==szHdr+
21ba0 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69 66  lenRowid );.  if
21bb0 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29  ( unlikely((u32)
21bc0 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  m.n<szHdr+lenRow
21bd0 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  id) ){.    goto 
21be0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
21bf0 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  tion;.  }..  /* 
21c00 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67 65  Fetch the intege
21c10 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  r off the end of
21c20 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f 72   the index recor
21c30 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64  d */.  sqlite3Vd
21c40 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38 2a  beSerialGet((u8*
21c50 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77  )&m.z[m.n-lenRow
21c60 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c 20  id], typeRowid, 
21c70 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20  &v);.  *rowid = 
21c80 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33  v.u.i;.  sqlite3
21c90 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
21ca0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
21cb0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75  ITE_OK;..  /* Ju
21cc0 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61 62  mp here if datab
21cd0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
21ce0 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65 72  s detected after
21cf0 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a   m has been.  **
21d00 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72 65   allocated.  Fre
21d10 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20 61  e the m object a
21d20 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
21d30 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78  _CORRUPT. */.idx
21d40 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
21d50 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20 6d  n:.  testcase( m
21d60 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a  .szMalloc!=0 );.
21d70 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
21d80 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
21d90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21da0 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a  RUPT_BKPT;.}../*
21db0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20  .** Compare the 
21dc0 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65 78  key of the index
21dd0 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
21de0 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69 6e  or pC is pointin
21df0 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20  g to against.** 
21e00 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20 69  the key string i
21e10 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57 72  n pUnpacked.  Wr
21e20 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20 61  ite into *pRes a
21e30 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20   number.** that 
21e40 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  is negative, zer
21e50 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
21e60 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68 61  f pC is less tha
21e70 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20  n, equal to,.** 
21e80 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
21e90 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74 75  pUnpacked.  Retu
21ea0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
21eb0 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70  success..**.** p
21ec0 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74 68  Unpacked is eith
21ed0 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68 6f  er created witho
21ee0 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69 73  ut a rowid or is
21ef0 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74 68   truncated so th
21f00 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74  at it.** omits t
21f10 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20  he rowid at the 
21f20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64 20  end.  The rowid 
21f30 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
21f40 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a  e index entry.**
21f50 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20 77   is ignored as w
21f60 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68 69  ell.  Hence, thi
21f70 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63  s routine only c
21f80 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65 66  ompares the pref
21f90 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20  ixes .** of the 
21fa0 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74 68  keys prior to th
21fb0 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e  e final rowid, n
21fc0 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65  ot the entire ke
21fd0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
21fe0 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70 61  3VdbeIdxKeyCompa
21ff0 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  re(.  sqlite3 *d
22000 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
22010 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
22020 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
22030 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  .  VdbeCursor *p
22040 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  C,              
22050 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f      /* The curso
22060 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67 61  r to compare aga
22070 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  inst */.  Unpack
22080 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61 63  edRecord *pUnpac
22090 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e  ked,       /* Un
220a0 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
220b0 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a  f key */.  int *
220c0 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20 20  res             
220d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
220e0 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72 69  rite the compari
220f0 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65 20  son result here 
22100 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  */.){.  i64 nCel
22110 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
22120 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  rc;.  BtCursor *
22130 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  pCur;.  Mem m;..
22140 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65 43    assert( pC->eC
22150 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
22160 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72 20  BTREE );.  pCur 
22170 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72  = pC->uc.pCursor
22180 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22190 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
221a0 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
221b0 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
221c0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
221d0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
221e0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
221f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
22200 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61      /* pCur is a
22210 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b  lways valid so K
22220 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61  eySize cannot fa
22230 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c  il */.  /* nCell
22240 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20  Key will always 
22250 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
22260 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61   0xffffffff beca
22270 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20  use of the way. 
22280 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61   ** that btreePa
22290 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64  rseCellPtr() and
222a0 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e   sqlite3GetVarin
222b0 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d  t32() are implem
222c0 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e  ented */.  if( n
222d0 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43  CellKey<=0 || nC
222e0 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ellKey>0x7ffffff
222f0 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20  f ){.    *res = 
22300 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
22310 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
22320 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  T;.  }.  sqlite3
22330 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20  VdbeMemInit(&m, 
22340 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73  db, 0);.  rc = s
22350 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f  qlite3VdbeMemFro
22360 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20  mBtree(pCur, 0, 
22370 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31  (u32)nCellKey, 1
22380 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20  , &m);.  if( rc 
22390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
223a0 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73  ;.  }.  *res = s
223b0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
223c0 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a  Compare(m.n, m.z
223d0 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20  , pUnpacked);.  
223e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
223f0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
22400 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
22410 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
22420 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61  tine sets the va
22430 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e  lue to be return
22440 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ed by subsequent
22450 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c   calls to.** sql
22460 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f  ite3_changes() o
22470 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  n the database h
22480 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a  andle 'db'. .*/.
22490 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
224a0 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74  SetChanges(sqlit
224b0 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61  e3 *db, int nCha
224c0 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  nge){.  assert( 
224d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
224e0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
224f0 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  .  db->nChange =
22500 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e   nChange;.  db->
22510 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20  nTotalChange += 
22520 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  nChange;.}../*.*
22530 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20  * Set a flag in 
22540 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61  the vdbe to upda
22550 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f  te the change co
22560 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73  unter when it is
22570 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72   finalised.** or
22580 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20   reset..*/.void 
22590 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74  sqlite3VdbeCount
225a0 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29  Changes(Vdbe *v)
225b0 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74  {.  v->changeCnt
225c0 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  On = 1;.}../*.**
225d0 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70   Mark every prep
225e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61  ared statement a
225f0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
22600 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
22610 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72  tion.** as expir
22620 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70  ed..**.** An exp
22630 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d  ired statement m
22640 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70  eans that recomp
22650 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
22660 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72  tatement is.** r
22670 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65  ecommend.  State
22680 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65  ments expire whe
22690 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20  n things happen 
226a0 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a  that make their.
226b0 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f  ** programs obso
226c0 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20  lete.  Removing 
226d0 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e  user-defined fun
226e0 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74  ctions or collat
226f0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73  ing.** sequences
22700 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e  , or changing an
22710 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66   authorization f
22720 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20  unction are the 
22730 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e  types of.** thin
22740 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65  gs that make pre
22750 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73  pared statements
22760 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f   obsolete..*/.vo
22770 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65  id sqlite3Expire
22780 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
22790 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
227a0 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f  .  Vdbe *p;.  fo
227b0 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b  r(p = db->pVdbe;
227c0 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
227d0 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20  .    p->expired 
227e0 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  = 1;.  }.}../*.*
227f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
22800 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
22810 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a   with the Vdbe..
22820 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69  */.sqlite3 *sqli
22830 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a  te3VdbeDb(Vdbe *
22840 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e  v){.  return v->
22850 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  db;.}../*.** Ret
22860 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
22870 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   an sqlite3_valu
22880 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  e structure cont
22890 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65  aining the value
228a0 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65   bound.** parame
228b0 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76  ter iVar of VM v
228c0 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65  . Except, if the
228d0 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c   value is an SQL
228e0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a   NULL, return .*
228f0 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c  * 0 instead. Unl
22900 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20  ess it is NULL, 
22910 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61  apply affinity a
22920 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53  ff (one of the S
22930 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63  QLITE_AFF_*.** c
22940 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65  onstants) to the
22950 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
22960 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  turning it..**.*
22970 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
22980 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65  alue must be fre
22990 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
229a0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61   using sqlite3Va
229b0 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71  lueFree()..*/.sq
229c0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c  lite3_value *sql
229d0 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64  ite3VdbeGetBound
229e0 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69  Value(Vdbe *v, i
229f0 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29  nt iVar, u8 aff)
22a00 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
22a10 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b  >0 );.  if( v ){
22a20 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  .    Mem *pMem =
22a30 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31   &v->aVar[iVar-1
22a40 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70  ];.    if( 0==(p
22a50 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
22a60 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20  _Null) ){.      
22a70 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
22a80 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Ret = sqlite3Val
22a90 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20  ueNew(v->db);.  
22aa0 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a      if( pRet ){.
22ab0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22ac0 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20  dbeMemCopy((Mem 
22ad0 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20  *)pRet, pMem);. 
22ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61         sqlite3Va
22af0 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79  lueApplyAffinity
22b00 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49  (pRet, aff, SQLI
22b10 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20  TE_UTF8);.      
22b20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  }.      return p
22b30 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Ret;.    }.  }. 
22b40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
22b50 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51  .** Configure SQ
22b60 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20  L variable iVar 
22b70 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20  so that binding 
22b80 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69  a new value to i
22b90 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20  t signals.** to 
22ba0 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69  sqlite3_reoptimi
22bb0 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65  ze() that re-pre
22bc0 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65  paring the state
22bd0 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a  ment may result.
22be0 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71  ** in a better q
22bf0 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f  uery plan..*/.vo
22c00 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
22c10 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76  tVarmask(Vdbe *v
22c20 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61  , int iVar){.  a
22c30 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b  ssert( iVar>0 );
22c40 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29  .  if( iVar>32 )
22c50 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
22c60 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20   = 0xffffffff;. 
22c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65   }else{.    v->e
22c80 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29  xpmask |= ((u32)
22c90 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a  1 << (iVar-1));.
22ca0 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
22cb0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
22cc0 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72  ALTABLE./*.** Tr
22cd0 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73  ansfer error mes
22ce0 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61  sage text from a
22cf0 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a  n sqlite3_vtab.z
22d00 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f  ErrMsg (text sto
22d10 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  red.** in memory
22d20 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
22d30 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69  qlite3_malloc) i
22d40 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d  nto a Vdbe.zErrM
22d50 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a  sg (text stored.
22d60 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ** in memory obt
22d70 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
22d80 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a  e3DbMalloc)..*/.
22d90 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62  void sqlite3Vtab
22da0 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62  ImportErrmsg(Vdb
22db0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74  e *p, sqlite3_vt
22dc0 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66  ab *pVtab){.  if
22dd0 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67  ( pVtab->zErrMsg
22de0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
22df0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  *db = p->db;.   
22e00 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
22e10 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
22e20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
22e30 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
22e40 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72  (db, pVtab->zErr
22e50 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Msg);.    sqlite
22e60 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45  3_free(pVtab->zE
22e70 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61  rrMsg);.    pVta
22e80 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  b->zErrMsg = 0;.
22e90 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
22ea0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
22eb0 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.