/ Hex Artifact Content
Login

Artifact 1e45699bde381272cdf4d06f2061084dd934040a:


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 61 20 56 64 62 65 46 72 61 6d 65 20 6f  te a VdbeFrame o
aca0: 62 6a 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f  bject and its co
acb0: 6e 74 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d  ntents. VdbeFram
acc0: 65 20 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a  e objects are.**
acd0: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68   allocated by th
ace0: 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  e OP_Program opc
acf0: 6f 64 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64  ode in sqlite3Vd
ad00: 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69  beExec()..*/.voi
ad10: 64 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61  d sqlite3VdbeFra
ad20: 6d 65 44 65 6c 65 74 65 28 56 64 62 65 46 72 61  meDelete(VdbeFra
ad30: 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  me *p){.  int i;
ad40: 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56  .  Mem *aMem = V
ad50: 64 62 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a  dbeFrameMem(p);.
ad60: 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61    VdbeCursor **a
ad70: 70 43 73 72 20 3d 20 28 56 64 62 65 43 75 72 73  pCsr = (VdbeCurs
ad80: 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e  or **)&aMem[p->n
ad90: 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72  ChildMem];.  for
ada0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c  (i=0; i<p->nChil
adb0: 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  dCsr; i++){.    
adc0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
add0: 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73  ursor(p->v, apCs
ade0: 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  r[i]);.  }.  rel
adf0: 65 61 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65  easeMemArray(aMe
ae00: 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29  m, p->nChildMem)
ae10: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ;.  sqlite3VdbeD
ae20: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e  eleteAuxData(p->
ae30: 76 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44  v->db, &p->pAuxD
ae40: 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73  ata, -1, 0);.  s
ae50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
ae60: 76 2d 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69  v->db, p);.}..#i
ae70: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
ae80: 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
ae90: 47 69 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f  Give a listing o
aea0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e  f the program in
aeb0: 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63   the virtual mac
aec0: 68 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  hine..**.** The 
aed0: 69 6e 74 65 72 66 61 63 65 20 69 73 20 74 68 65  interface is the
aee0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
aef0: 56 64 62 65 45 78 65 63 28 29 2e 20 20 42 75 74  VdbeExec().  But
af00: 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72   instead of.** r
af10: 75 6e 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c  unning the code,
af20: 20 69 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20   it invokes the 
af30: 63 61 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f  callback once fo
af40: 72 20 65 61 63 68 20 69 6e 73 74 72 75 63 74 69  r each instructi
af50: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74  on..** This feat
af60: 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 69  ure is used to i
af70: 6d 70 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49  mplement "EXPLAI
af80: 4e 22 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70  N"..**.** When p
af90: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61  ->explain==1, ea
afa0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ch instruction i
afb0: 73 20 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a  s listed.  When.
afc0: 2a 2a 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  ** p->explain==2
afd0: 2c 20 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69  , only OP_Explai
afe0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61  n instructions a
aff0: 72 65 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68  re listed and th
b000: 65 73 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e  ese.** are shown
b010: 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   in a different 
b020: 66 6f 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c  format.  p->expl
b030: 61 69 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74  ain==2 is used t
b040: 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45  o implement.** E
b050: 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
b060: 4e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d  N..**.** When p-
b070: 3e 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72  >explain==1, fir
b080: 73 74 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  st the main prog
b090: 72 61 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74  ram is listed, t
b0a0: 68 65 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74  hen each of.** t
b0b0: 68 65 20 74 72 69 67 67 65 72 20 73 75 62 70 72  he trigger subpr
b0c0: 6f 67 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65  ograms are liste
b0d0: 64 20 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f  d one by one..*/
b0e0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
b0f0: 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20  List(.  Vdbe *p 
b100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b110: 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f    /* The VDBE */
b120: 0a 29 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20  .){.  int nRow; 
b130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b140: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
b150: 6f 70 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e  op when row coun
b160: 74 20 72 65 61 63 68 65 73 20 74 68 69 73 20 2a  t reaches this *
b170: 2f 0a 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30  /.  int nSub = 0
b180: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b190: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
b1a0: 65 72 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20  er of sub-vdbes 
b1b0: 73 65 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20  seen so far */. 
b1c0: 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70   SubProgram **ap
b1d0: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
b1e0: 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
b1f0: 66 20 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20  f sub-vdbes */. 
b200: 20 4d 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20   Mem *pSub = 0; 
b210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b220: 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
b230: 63 65 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20  cell hold array 
b240: 6f 66 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20  of subprogs */. 
b250: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
b260: 2d 3e 64 62 3b 20 20 20 20 20 20 20 20 20 20 20  ->db;           
b270: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
b280: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b290: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
b2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b2b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b2c0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b2d0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
b2e0: 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
b2f0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
b300: 6f 64 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ode */.  Mem *pM
b310: 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d  em = &p->aMem[1]
b320: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
b330: 20 46 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65   First Mem of re
b340: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61  sult set */..  a
b350: 73 73 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69  ssert( p->explai
b360: 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  n );.  assert( p
b370: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
b380: 47 49 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73  GIC_RUN );.  ass
b390: 65 72 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  ert( p->rc==SQLI
b3a0: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d  TE_OK || p->rc==
b3b0: 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70  SQLITE_BUSY || p
b3c0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
b3d0: 45 4d 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e  EM );..  /* Even
b3e0: 20 74 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63   though this opc
b3f0: 6f 64 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ode does not use
b400: 20 64 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73   dynamic strings
b410: 20 66 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65   for.  ** the re
b420: 73 75 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c  sult, result col
b430: 75 6d 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20  umns may become 
b440: 64 79 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75  dynamic if the u
b450: 73 65 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73  ser calls.  ** s
b460: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
b470: 78 74 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20  xt16(), causing 
b480: 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f  a translation to
b490: 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67   UTF-16 encoding
b4a0: 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
b4b0: 4d 65 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38  MemArray(pMem, 8
b4c0: 29 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  );.  p->pResultS
b4d0: 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70  et = 0;..  if( p
b4e0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ->rc==SQLITE_NOM
b4f0: 45 4d 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f  EM_BKPT ){.    /
b500: 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 69  * This happens i
b510: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73  f a malloc() ins
b520: 69 64 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ide a call to sq
b530: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
b540: 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71  t() or.    ** sq
b550: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
b560: 74 31 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a  t16() failed.  *
b570: 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d  /.    sqlite3Oom
b580: 46 61 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72  Fault(db);.    r
b590: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
b5a0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68  OR;.  }..  /* Wh
b5b0: 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
b5c0: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 72 65 61   output rows rea
b5d0: 63 68 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20  ches nRow, that 
b5e0: 6d 65 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c  means the.  ** l
b5f0: 69 73 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73  isting has finis
b600: 68 65 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  hed and sqlite3_
b610: 73 74 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65  step() should re
b620: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
b630: 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74  ..  ** nRow is t
b640: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75  he sum of the nu
b650: 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20  mber of rows in 
b660: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
b670: 2c 20 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20  , plus.  ** the 
b680: 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  sum of the numbe
b690: 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c  r of rows in all
b6a0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
b6b0: 72 61 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  rams encountered
b6c0: 0a 20 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54  .  ** so far.  T
b6d0: 68 65 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69  he nRow value wi
b6e0: 6c 6c 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e  ll increase as n
b6f0: 65 77 20 74 72 69 67 67 65 72 20 73 75 62 70 72  ew trigger subpr
b700: 6f 67 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20  ograms are.  ** 
b710: 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74  encountered, but
b720: 20 70 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e   p->pc will even
b730: 74 75 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20  tually catch up 
b740: 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20  to nRow..  */.  
b750: 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  nRow = p->nOp;. 
b760: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
b770: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =1 ){.    /* The
b780: 20 66 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20   first 8 memory 
b790: 63 65 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66  cells are used f
b7a0: 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  or the result se
b7b0: 74 2e 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20  t.  So we will. 
b7c0: 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72     ** commandeer
b7d0: 20 74 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f   the 9th cell to
b7e0: 20 75 73 65 20 61 73 20 73 74 6f 72 61 67 65 20   use as storage 
b7f0: 66 6f 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20  for an array of 
b800: 70 6f 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20  pointers.    ** 
b810: 74 6f 20 74 72 69 67 67 65 72 20 73 75 62 70 72  to trigger subpr
b820: 6f 67 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42  ograms.  The VDB
b830: 45 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  E is guaranteed 
b840: 74 6f 20 68 61 76 65 20 61 74 20 6c 65 61 73 74  to have at least
b850: 20 39 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e   9.    ** cells.
b860: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b870: 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20   p->nMem>9 );.  
b880: 20 20 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65    pSub = &p->aMe
b890: 6d 5b 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53  m[9];.    if( pS
b8a0: 75 62 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c  ub->flags&MEM_Bl
b8b0: 6f 62 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f  ob ){.      /* O
b8c0: 6e 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  n the first call
b8d0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70   to sqlite3_step
b8e0: 28 29 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f  (), pSub will ho
b8f0: 6c 64 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69  ld a NULL.  It i
b900: 73 0a 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69  s.      ** initi
b910: 61 6c 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42  alized to a BLOB
b920: 20 62 79 20 74 68 65 20 50 34 5f 53 55 42 50 52   by the P4_SUBPR
b930: 4f 47 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67  OGRAM processing
b940: 20 6c 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a   logic below */.
b950: 20 20 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75        nSub = pSu
b960: 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65  b->n/sizeof(Vdbe
b970: 2a 29 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20  *);.      apSub 
b980: 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  = (SubProgram **
b990: 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a  )pSub->z;.    }.
b9a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b9b0: 53 75 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Sub; i++){.     
b9c0: 20 6e 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69   nRow += apSub[i
b9d0: 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20  ]->nOp;.    }.  
b9e0: 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d  }..  do{.    i =
b9f0: 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69   p->pc++;.  }whi
ba00: 6c 65 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d  le( i<nRow && p-
ba10: 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70  >explain==2 && p
ba20: 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21  ->aOp[i].opcode!
ba30: 3d 4f 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20  =OP_Explain );. 
ba40: 20 69 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a   if( i>=nRow ){.
ba50: 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
ba60: 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20  TE_OK;.    rc = 
ba70: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
ba80: 65 6c 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e  else if( db->u1.
ba90: 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b  isInterrupted ){
baa0: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
bab0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20  ITE_INTERRUPT;. 
bac0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
bad0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
bae0: 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71  3VdbeError(p, sq
baf0: 6c 69 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72  lite3ErrStr(p->r
bb00: 63 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c));.  }else{.  
bb10: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20    char *zP4;.   
bb20: 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66   Op *pOp;.    if
bb30: 28 20 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20  ( i<p->nOp ){.  
bb40: 20 20 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75      /* The outpu
bb50: 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73  t line number is
bb60: 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68   small enough th
bb70: 61 74 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  at we are still 
bb80: 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  in the.      ** 
bb90: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f  main program. */
bba0: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d  .      pOp = &p-
bbb0: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c  >aOp[i];.    }el
bbc0: 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  se{.      /* We 
bbd0: 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69  are currently li
bbe0: 73 74 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d  sting subprogram
bbf0: 73 2e 20 20 46 69 67 75 72 65 20 6f 75 74 20 77  s.  Figure out w
bc00: 68 69 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20  hich one and.   
bc10: 20 20 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68     ** pick up th
bc20: 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70  e appropriate op
bc30: 63 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69  code. */.      i
bc40: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d  nt j;.      i -=
bc50: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66   p->nOp;.      f
bc60: 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62  or(j=0; i>=apSub
bc70: 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a  [j]->nOp; j++){.
bc80: 20 20 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53          i -= apS
bc90: 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[j]->nOp;.    
bca0: 20 20 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20    }.      pOp = 
bcb0: 26 61 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69  &apSub[j]->aOp[i
bcc0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  ];.    }.    if(
bcd0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
bce0: 7b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  {.      pMem->fl
bcf0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
bd00: 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
bd10: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
bd20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd30: 20 20 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f     /* Program co
bd40: 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70  unter */.      p
bd50: 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20  Mem++;.  .      
bd60: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bd70: 4d 5f 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72  M_Static|MEM_Str
bd80: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
bd90: 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
bda0: 2a 29 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  *)sqlite3OpcodeN
bdb0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
bdc0: 3b 20 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20  ; /* Opcode */. 
bdd0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
bde0: 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20  m->z!=0 );.     
bdf0: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74   pMem->n = sqlit
be00: 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d  e3Strlen30(pMem-
be10: 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  >z);.      pMem-
be20: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
be30: 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b  F8;.      pMem++
be40: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e  ;..      /* When
be50: 20 61 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f   an OP_Program o
be60: 70 63 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74  pcode is encount
be70: 65 72 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63  er (the only opc
be80: 6f 64 65 20 74 68 61 74 20 68 61 73 0a 20 20 20  ode that has.   
be90: 20 20 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52     ** a P4_SUBPR
bea0: 4f 47 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c  OGRAM argument),
beb0: 20 65 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65   expand the size
bec0: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6f 66   of the array of
bed0: 20 73 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20   subprograms.   
bee0: 20 20 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d     ** kept in p-
bef0: 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f  >aMem[9].z to ho
bf00: 6c 64 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72  ld the new progr
bf10: 61 6d 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68  am - assuming th
bf20: 69 73 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20  is subprogram.  
bf30: 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61      ** has not a
bf40: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e  lready been seen
bf50: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
bf60: 20 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65   if( pOp->p4type
bf70: 3d 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  ==P4_SUBPROGRAM 
bf80: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
bf90: 42 79 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a  Byte = (nSub+1)*
bfa0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
bfb0: 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  m*);.        int
bfc0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   j;.        for(
bfd0: 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b  j=0; j<nSub; j++
bfe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
bff0: 20 61 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e   apSub[j]==pOp->
c000: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
c010: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
c020: 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53         if( j==nS
c030: 75 62 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d  ub && SQLITE_OK=
c040: 3d 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47  =sqlite3VdbeMemG
c050: 72 6f 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c  row(pSub, nByte,
c060: 20 6e 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20   nSub!=0) ){.   
c070: 20 20 20 20 20 20 20 61 70 53 75 62 20 3d 20 28         apSub = (
c080: 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53  SubProgram **)pS
c090: 75 62 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20  ub->z;.         
c0a0: 20 61 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d   apSub[nSub++] =
c0b0: 20 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61   pOp->p4.pProgra
c0c0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  m;.          pSu
c0d0: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f  b->flags |= MEM_
c0e0: 42 6c 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20  Blob;.          
c0f0: 70 53 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73  pSub->n = nSub*s
c100: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
c110: 2a 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  *);.        }.  
c120: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
c130: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c140: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
c150: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b  ->u.i = pOp->p1;
c160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c170: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20            /* P1 
c180: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
c190: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c1a0: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
c1b0: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
c1c0: 70 32 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p2;             
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c1e0: 50 32 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P2 */.    pMem++
c1f0: 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  ;..    pMem->fla
c200: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c210: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
c220: 70 2d 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20  p->p3;          
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c240: 2f 2a 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P3 */.    pMe
c250: 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71  m++;..    if( sq
c260: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
c270: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
c280: 20 31 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a   100) ){ /* P4 *
c290: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
c2a0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
c2b0: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
c2c0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
c2d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
c2e0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
c2f0: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
c300: 7a 50 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28  zP4 = displayP4(
c310: 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d  pOp, pMem->z, pM
c320: 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20  em->szMalloc);. 
c330: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d     if( zP4!=pMem
c340: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
c350: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
c360: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
c370: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
c380: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c390: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
c3a0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
c3b0: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
c3c0: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
c3d0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
c3e0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c3f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
c400: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
c410: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
c420: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
c430: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
c440: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b  size(pMem, 4) ){
c450: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c460: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
c470: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
c480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
c490: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
c4a0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c4b0: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
c4c0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
c4d0: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
c4e0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
c4f0: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
c500: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
c510: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
c520: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
c530: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
c540: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
c550: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
c560: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
c570: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
c580: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
c590: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b  ze(pMem, 500) ){
c5a0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
c5b0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
c5c0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
c5d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
c5e0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
c5f0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
c600: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
c610: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
c620: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e   = displayCommen
c630: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d  t(pOp, zP4, pMem
c640: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20  ->z, 500);.     
c650: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
c660: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
c670: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c680: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
c6b0: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  /.#endif.    }..
c6c0: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
c6d0: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
c6e0: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
c6f0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
c700: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
c710: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
c720: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
c730: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
c740: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
c750: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
c760: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
c770: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
c780: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
c790: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
c7a0: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
c7b0: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
c7c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
c7d0: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
c7e0: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
c7f0: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
c800: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
c810: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
c820: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
c830: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
c840: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
c850: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
c860: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
c870: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
c880: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
c890: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
c8a0: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
c8b0: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
c8c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
c8d0: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
c8e0: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
c8f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
c900: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
c910: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
c920: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
c930: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
c940: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
c950: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
c960: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
c970: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c980: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
c990: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
c9a0: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
c9b0: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
c9c0: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
c9d0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
c9e0: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
c9f0: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
ca00: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
ca10: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
ca20: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
ca30: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
ca40: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
ca50: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
ca60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
ca70: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
ca80: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
ca90: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
caa0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
cab0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
cac0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
cad0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
cae0: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
caf0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
cb00: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
cb10: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
cb20: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
cb30: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
cb40: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
cb50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cb60: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
cb70: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
cb80: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
cb90: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
cba0: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
cbb0: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
cbc0: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
cbd0: 0a 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  ./* An instance 
cbe0: 6f 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64  of this object d
cbf0: 65 73 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65  escribes bulk me
cc00: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
cc10: 6f 72 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62  or use.** by sub
cc20: 63 6f 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20  components of a 
cc30: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
cc40: 6e 74 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c  nt.  Space is al
cc50: 6c 6f 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f  located out.** o
cc60: 66 20 61 20 52 65 75 73 61 62 6c 65 53 70 61 63  f a ReusableSpac
cc70: 65 20 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20  e object by the 
cc80: 61 6c 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75  allocSpace() rou
cc90: 74 69 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73  tine below..*/.s
cca0: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
ccb0: 61 63 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61  ace {.  u8 *pSpa
ccc0: 63 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ce;          /* 
ccd0: 41 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  Available memory
cce0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b   */.  int nFree;
ccf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
cd00: 74 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65  tes of available
cd10: 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74   memory */.  int
cd20: 20 6e 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20   nNeeded;       
cd30: 20 20 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73    /* Total bytes
cd40: 20 74 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20   that could not 
cd50: 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a  be allocated */.
cd60: 7d 3b 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c  };../* Try to al
cd70: 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74  locate nByte byt
cd80: 65 73 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69  es of 8-byte ali
cd90: 67 6e 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79  gned bulk memory
cda0: 20 66 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f   for pBuf.** fro
cdb0: 6d 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70  m the ReusableSp
cdc0: 61 63 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74  ace object.  Ret
cdd0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
cde0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a   the allocated.*
cdf0: 2a 20 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63  * memory on succ
ce00: 65 73 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69  ess.  If insuffi
ce10: 63 69 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20  cient memory is 
ce20: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
ce30: 0a 2a 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63  .** ReusableSpac
ce40: 65 20 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61  e object, increa
ce50: 73 65 20 74 68 65 20 52 65 75 73 61 62 6c 65 53  se the ReusableS
ce60: 70 61 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20  pace.nNeeded.** 
ce70: 76 61 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f  value by the amo
ce80: 75 6e 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72  unt needed and r
ce90: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
cea0: 2a 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74  * If pBuf is not
ceb0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
cec0: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74   that means that
ced0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20   the memory has 
cee0: 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
cef0: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70  allocated by a p
cf00: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69  rior call to thi
cf10: 73 20 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75  s routine, so ju
cf20: 73 74 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79  st return a copy
cf30: 0a 2a 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20  .** of pBuf and 
cf40: 6c 65 61 76 65 20 52 65 75 73 61 62 6c 65 53 70  leave ReusableSp
cf50: 61 63 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  ace unchanged..*
cf60: 2a 0a 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61  *.** This alloca
cf70: 74 6f 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20  tor is employed 
cf80: 74 6f 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75  to repurpose unu
cf90: 73 65 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65  sed slots at the
cfa0: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f   end of the.** o
cfb0: 70 63 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70  pcode array of p
cfc0: 72 65 70 61 72 65 64 20 73 74 61 74 65 20 66 6f  repared state fo
cfd0: 72 20 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e  r other memory n
cfe0: 65 65 64 73 20 6f 66 20 74 68 65 20 70 72 65 70  eeds of the prep
cff0: 61 72 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  ared.** statemen
d000: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
d010: 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20  d *allocSpace(. 
d020: 20 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65   struct Reusable
d030: 53 70 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75  Space *p,  /* Bu
d040: 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61  lk memory availa
d050: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
d060: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
d070: 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
d080: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
d090: 61 20 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69  a prior allocati
d0a0: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  on */.  int nByt
d0b0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
d0c0: 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65    /* Bytes of me
d0d0: 6d 6f 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29  mory needed */.)
d0e0: 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  {.  assert( EIGH
d0f0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
d100: 28 70 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20  (p->pSpace) );. 
d110: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
d120: 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e      nByte = ROUN
d130: 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69  D8(nByte);.    i
d140: 66 28 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e  f( nByte <= p->n
d150: 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d  Free ){.      p-
d160: 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b  >nFree -= nByte;
d170: 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70  .      pBuf = &p
d180: 2d 3e 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65  ->pSpace[p->nFre
d190: 65 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e];.    }else{. 
d1a0: 20 20 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20       p->nNeeded 
d1b0: 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a  += nByte;.    }.
d1c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49    }.  assert( EI
d1d0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
d1e0: 4e 54 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65  NT(pBuf) );.  re
d1f0: 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a  turn pBuf;.}../*
d200: 0a 2a 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56  .** Rewind the V
d210: 44 42 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20  DBE back to the 
d220: 62 65 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65  beginning in pre
d230: 70 61 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  paration for.** 
d240: 72 75 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76  running it..*/.v
d250: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
d260: 65 77 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a  ewind(Vdbe *p){.
d270: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
d280: 54 45 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66  TE_DEBUG) || def
d290: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
d2a0: 45 29 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64  E).  int i;.#end
d2b0: 69 66 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  if.  assert( p!=
d2c0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
d2d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
d2e0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f  GIC_INIT );..  /
d2f0: 2a 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62  * There should b
d300: 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f  e at least one o
d310: 70 63 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  pcode..  */.  as
d320: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
d330: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  ;..  /* Set the 
d340: 6d 61 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41  magic to VDBE_MA
d350: 47 49 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72  GIC_RUN sooner r
d360: 61 74 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72  ather than later
d370: 2e 20 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20  . */.  p->magic 
d380: 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  = VDBE_MAGIC_RUN
d390: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
d3a0: 5f 44 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 31  _DEBUG.  for(i=1
d3b0: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
d3c0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
d3d0: 2d 3e 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d  ->aMem[i].db==p-
d3e0: 3e 64 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  >db );.  }.#endi
d3f0: 66 0a 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a  f.  p->pc = -1;.
d400: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
d410: 5f 4f 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41  _OK;.  p->errorA
d420: 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
d430: 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d  ;.  p->nChange =
d440: 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74   0;.  p->cacheCt
d450: 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57  r = 1;.  p->minW
d460: 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d  riteFileFormat =
d470: 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74   255;.  p->iStat
d480: 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ement = 0;.  p->
d490: 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20  nFkConstraint = 
d4a0: 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  0;.#ifdef VDBE_P
d4b0: 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30  ROFILE.  for(i=0
d4c0: 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
d4d0: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  {.    p->aOp[i].
d4e0: 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  cnt = 0;.    p->
d4f0: 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20  aOp[i].cycles = 
d500: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  0;.  }.#endif.}.
d510: 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61  ./*.** Prepare a
d520: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d530: 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66   for execution f
d540: 6f 72 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  or the first tim
d550: 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74  e after.** creat
d560: 69 6e 67 20 74 68 65 20 76 69 72 74 75 61 6c 20  ing the virtual 
d570: 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69  machine.  This i
d580: 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73  nvolves things s
d590: 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61  uch.** as alloca
d5a0: 74 69 6e 67 20 72 65 67 69 73 74 65 72 73 20 61  ting registers a
d5b0: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20  nd initializing 
d5c0: 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e  the program coun
d5d0: 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68  ter..** After th
d5e0: 65 20 56 44 42 45 20 68 61 73 20 62 65 20 70 72  e VDBE has be pr
d5f0: 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65  epped, it can be
d600: 20 65 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65   executed by one
d610: 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c   or more.** call
d620: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
d630: 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  Exec().  .**.** 
d640: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
d650: 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63  y be called exac
d660: 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68  tly once on each
d670: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
d680: 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  ..** After this 
d690: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
d6a0: 64 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65  d the VM has bee
d6b0: 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64  n "packaged" and
d6c0: 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20   is ready.** to 
d6d0: 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73  run.  After this
d6e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
d6f0: 65 64 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c  ed, further call
d700: 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33  s to .** sqlite3
d710: 56 64 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63  VdbeAddOp() func
d720: 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62  tions are prohib
d730: 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74  ited.  This rout
d740: 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a  ine disconnects.
d750: 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d  ** the Vdbe from
d760: 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63   the Parse objec
d770: 74 20 74 68 61 74 20 68 65 6c 70 65 64 20 67 65  t that helped ge
d780: 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74 68 61  nerate it so tha
d790: 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62  t the.** the Vdb
d7a0: 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64  e becomes an ind
d7b0: 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20  ependent entity 
d7c0: 61 6e 64 20 74 68 65 20 50 61 72 73 65 20 6f 62  and the Parse ob
d7d0: 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64  ject can be.** d
d7e0: 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
d7f0: 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 56  Use the sqlite3V
d800: 64 62 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63  dbeRewind() proc
d810: 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65  edure to restore
d820: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
d830: 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74  ne back.** to it
d840: 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20  s initial state 
d850: 61 66 74 65 72 20 69 74 20 68 61 73 20 62 65 65  after it has bee
d860: 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  n run..*/.void s
d870: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
d880: 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ady(.  Vdbe *p, 
d890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42        /* The VDB
d8b0: 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50  E */.  Parse *pP
d8c0: 61 72 73 65 20 20 20 20 20 20 20 20 20 20 20 20  arse            
d8d0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
d8e0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20   context */.){. 
d8f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
d900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d910: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
d920: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
d930: 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20  int nVar;       
d940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61  * Number of para
d960: 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  meters */.  int 
d970: 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  nMem;           
d980: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
d990: 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72  mber of VM memor
d9a0: 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20  y registers */. 
d9b0: 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20   int nCursor;   
d9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d9d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72  /* Number of cur
d9e0: 73 6f 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f  sors required */
d9f0: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20  .  int nArg;    
da00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
da10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
da20: 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70  rguments in subp
da30: 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74  rograms */.  int
da40: 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20 20 20   nOnce;         
da50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
da60: 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e 63 65  umber of OP_Once
da70: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 2a 2f   instructions */
da80: 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20  .  int n;       
da90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
daa0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
dab0: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65  r */.  struct Re
dac0: 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20  usableSpace x;  
dad0: 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c        /* Reusabl
dae0: 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f  e bulk memory */
daf0: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
db00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
db10: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
db20: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
db30: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
db40: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
db50: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
db60: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
db70: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
db80: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
db90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
dba0: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
dbb0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
dbc0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
dbd0: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
dbe0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
dbf0: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
dc00: 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20  MaxArg;.  nOnce 
dc10: 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b  = pParse->nOnce;
dc20: 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20  .  if( nOnce==0 
dc30: 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20  ) nOnce = 1; /* 
dc40: 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20  Ensure at least 
dc50: 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61  one byte in p->a
dc60: 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20  OnceFlag[] */.  
dc70: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
dc80: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
dc90: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
dca0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
dcb0: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
dcc0: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
dcd0: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
dce0: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
dcf0: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
dd00: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
dd10: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
dd20: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
dd30: 20 6d 65 6d 6f 72 79 20 66 6f 72 0a 20 20 2a 2a   memory for.  **
dd40: 20 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75   VdbeCursor/BtCu
dd50: 72 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e  rsor structures.
dd60: 20 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   The blob of mem
dd70: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
dd80: 69 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72  ith .  ** cursor
dd90: 20 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20   0 is stored in 
dda0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d  memory cell nMem
ddb0: 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e  . Memory cell (n
ddc0: 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72  Mem-1).  ** stor
ddd0: 65 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  es the blob of m
dde0: 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
ddf0: 20 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20   with cursor 1, 
de00: 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  etc..  **.  ** S
de10: 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74  ee also: allocat
de20: 65 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a  eCursor()..  */.
de30: 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f    nMem += nCurso
de40: 72 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  r;..  /* Figure 
de50: 6f 75 74 20 68 6f 77 20 6d 75 63 68 20 72 65 75  out how much reu
de60: 73 61 62 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20  sable memory is 
de70: 61 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 65  available at the
de80: 20 65 6e 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a   end of the.  **
de90: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
dea0: 54 68 69 73 20 65 78 74 72 61 20 6d 65 6d 6f 72  This extra memor
deb0: 79 20 77 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f  y will be reallo
dec0: 63 61 74 65 64 20 66 6f 72 20 6f 74 68 65 72 20  cated for other 
ded0: 65 6c 65 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66  elements.  ** of
dee0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
def0: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
df00: 6e 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  n = ROUND8(sizeo
df10: 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20  f(Op)*p->nOp);  
df20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
df30: 79 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d  ytes of opcode m
df40: 65 6d 6f 72 79 20 75 73 65 64 20 2a 2f 0a 20 20  emory used */.  
df50: 78 2e 70 53 70 61 63 65 20 3d 20 26 28 28 75 38  x.pSpace = &((u8
df60: 2a 29 70 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20  *)p->aOp)[n];   
df70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
df80: 6e 75 73 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d  nused opcode mem
df90: 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ory */.  assert(
dfa0: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
dfb0: 4e 4d 45 4e 54 28 78 2e 70 53 70 61 63 65 29 20  NMENT(x.pSpace) 
dfc0: 29 3b 0a 20 20 78 2e 6e 46 72 65 65 20 3d 20 52  );.  x.nFree = R
dfd0: 4f 55 4e 44 44 4f 57 4e 38 28 70 50 61 72 73 65  OUNDDOWN8(pParse
dfe0: 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29  ->szOpAlloc - n)
dff0: 3b 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 75  ;  /* Bytes of u
e000: 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  nused memory */.
e010: 20 20 61 73 73 65 72 74 28 20 78 2e 6e 46 72 65    assert( x.nFre
e020: 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 78 2e  e>=0 );.  if( x.
e030: 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 6d  nFree>0 ){.    m
e040: 65 6d 73 65 74 28 78 2e 70 53 70 61 63 65 2c 20  emset(x.pSpace, 
e050: 30 2c 20 78 2e 6e 46 72 65 65 29 3b 0a 20 20 20  0, x.nFree);.   
e060: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
e070: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78  YTE_ALIGNMENT(&x
e080: 2e 70 53 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d  .pSpace[x.nFree]
e090: 29 20 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f  ) );.  }..  reso
e0a0: 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 26  lveP2Values(p, &
e0b0: 6e 41 72 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73  nArg);.  p->uses
e0c0: 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75  StmtJournal = (u
e0d0: 38 29 28 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c  8)(pParse->isMul
e0e0: 74 69 57 72 69 74 65 20 26 26 20 70 50 61 72 73  tiWrite && pPars
e0f0: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20  e->mayAbort);.  
e100: 69 66 28 20 70 50 61 72 73 65 2d 3e 65 78 70 6c  if( pParse->expl
e110: 61 69 6e 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29  ain && nMem<10 )
e120: 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b  {.    nMem = 10;
e130: 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65  .  }.  p->expire
e140: 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d  d = 0;..  /* Mem
e150: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
e160: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
e170: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
e180: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 6f 6e 65 20  llocated in one 
e190: 6f 72 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73  or two.  ** pass
e1a0: 65 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73  es.  On the firs
e1b0: 74 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74  t pass, we try t
e1c0: 6f 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 6d  o reuse unused m
e1d0: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 0a 20 20  emory at the .  
e1e0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
e1f0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 49 66 20  code array.  If 
e200: 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
e210: 20 73 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d   satisfy all mem
e220: 6f 72 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  ory.  ** require
e230: 6d 65 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67  ments by reusing
e240: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
e250: 79 20 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65  y tail, then the
e260: 20 73 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73   second.  ** pas
e270: 73 20 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74  s will fill in t
e280: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 75 73 69  he remainder usi
e290: 6e 67 20 61 20 66 72 65 73 68 20 6d 65 6d 6f 72  ng a fresh memor
e2a0: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  y allocation.  .
e2b0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
e2c0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
e2d0: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
e2e0: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
e2f0: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
e300: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 6d  * the leftover m
e310: 65 6d 6f 72 79 20 61 74 20 74 68 65 20 65 6e 64  emory at the end
e320: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61   of the opcode a
e330: 72 72 61 79 2e 20 20 54 68 69 73 20 63 61 6e 20  rray.  This can 
e340: 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20  significantly.  
e350: 2a 2a 20 72 65 64 75 63 65 20 74 68 65 20 61 6d  ** reduce the am
e360: 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68  ount of memory h
e370: 65 6c 64 20 62 79 20 61 20 70 72 65 70 61 72 65  eld by a prepare
e380: 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a  d statement..  *
e390: 2f 0a 20 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e  /.  do {.    x.n
e3a0: 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 20 20  Needed = 0;.    
e3b0: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
e3c0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d  pace(&x, p->aMem
e3d0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
e3e0: 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72  m));.    p->aVar
e3f0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
e400: 2c 20 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  , p->aVar, nVar*
e410: 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
e420: 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c    p->apArg = all
e430: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
e440: 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f  pArg, nArg*sizeo
e450: 66 28 4d 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d  f(Mem*));.    p-
e460: 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70  >apCsr = allocSp
e470: 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 43 73 72  ace(&x, p->apCsr
e480: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
e490: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a  (VdbeCursor*));.
e4a0: 20 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67      p->aOnceFlag
e4b0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
e4c0: 2c 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  , p->aOnceFlag, 
e4d0: 6e 4f 6e 63 65 29 3b 0a 23 69 66 64 65 66 20 53  nOnce);.#ifdef S
e4e0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
e4f0: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
e500: 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
e510: 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61  ocSpace(&x, p->a
e520: 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69  nExec, p->nOp*si
e530: 7a 65 6f 66 28 69 36 34 29 29 3b 0a 23 65 6e 64  zeof(i64));.#end
e540: 69 66 0a 20 20 20 20 69 66 28 20 78 2e 6e 4e 65  if.    if( x.nNe
e550: 65 64 65 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b  eded==0 ) break;
e560: 0a 20 20 20 20 78 2e 70 53 70 61 63 65 20 3d 20  .    x.pSpace = 
e570: 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c 69 74  p->pFree = sqlit
e580: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
e590: 62 2c 20 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20  b, x.nNeeded);. 
e5a0: 20 20 20 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e     x.nFree = x.n
e5b0: 4e 65 65 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65  Needed;.  }while
e5c0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
e5d0: 6c 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75  led );..  p->nCu
e5e0: 72 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a  rsor = nCursor;.
e5f0: 20 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    p->nOnceFlag =
e600: 20 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d   nOnce;.  if( p-
e610: 3e 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e  >aVar ){.    p->
e620: 6e 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56  nVar = (ynVar)nV
e630: 61 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b  ar;.    for(n=0;
e640: 20 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20   n<nVar; n++){. 
e650: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
e660: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
e670: 3b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b  ;.      p->aVar[
e680: 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20  n].db = db;.    
e690: 7d 0a 20 20 7d 0a 20 20 70 2d 3e 6e 7a 56 61 72  }.  }.  p->nzVar
e6a0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72   = pParse->nzVar
e6b0: 3b 0a 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 70  ;.  p->azVar = p
e6c0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 3b 0a 20 20  Parse->azVar;.  
e6d0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20  pParse->nzVar = 
e6e0: 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 7a   0;.  pParse->az
e6f0: 56 61 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Var = 0;.  if( p
e700: 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d  ->aMem ){.    p-
e710: 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20 20 20  >aMem--;        
e720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e730: 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66 72 6f   aMem[] goes fro
e740: 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20  m 1..nMem */.   
e750: 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b   p->nMem = nMem;
e760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e770: 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20 66 72   /*       not fr
e780: 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a  om 0..nMem-1 */.
e790: 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d      for(n=1; n<=
e7a0: 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nMem; n++){.    
e7b0: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61    p->aMem[n].fla
e7c0: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
e7d0: 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  ed;.      p->aMe
e7e0: 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20  m[n].db = db;.  
e7f0: 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65 78 70    }.  }.  p->exp
e800: 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d 3e 65  lain = pParse->e
e810: 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65  xplain;.  sqlite
e820: 33 56 64 62 65 52 65 77 69 6e 64 28 70 29 3b 0a  3VdbeRewind(p);.
e830: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
e840: 20 56 44 42 45 20 63 75 72 73 6f 72 20 61 6e 64   VDBE cursor and
e850: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65   release all the
e860: 20 72 65 73 6f 75 72 63 65 73 20 74 68 61 74 20   resources that 
e870: 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70 70 65  cursor .** happe
e880: 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76  ns to hold..*/.v
e890: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 46  oid sqlite3VdbeF
e8a0: 72 65 65 43 75 72 73 6f 72 28 56 64 62 65 20 2a  reeCursor(Vdbe *
e8b0: 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70  p, VdbeCursor *p
e8c0: 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78 3d 3d  Cx){.  if( pCx==
e8d0: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b  0 ){.    return;
e8e0: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
e8f0: 43 78 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20 70 43  Cx->pBt==0 || pC
e900: 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  x->eCurType==CUR
e910: 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
e920: 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65 43 75  switch( pCx->eCu
e930: 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  rType ){.    cas
e940: 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54 45 52  e CURTYPE_SORTER
e950: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e960: 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65  3VdbeSorterClose
e970: 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20  (p->db, pCx);.  
e980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e990: 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
e9a0: 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20 20 20  E_BTREE: {.     
e9b0: 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b   if( pCx->pBt ){
e9c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e9d0: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
e9e0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  pBt);.        /*
e9f0: 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72 73 6f   The pCx->pCurso
ea00: 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73 65 20  r will be close 
ea10: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c 20 69  automatically, i
ea20: 66 20 69 74 20 65 78 69 73 74 73 2c 20 62 79 0a  f it exists, by.
ea30: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 63          ** the c
ea40: 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a 20 20  all above. */.  
ea50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ea60: 20 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e     assert( pCx->
ea70: 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
ea80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ea90: 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72  BtreeCloseCursor
eaa0: 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72  (pCx->uc.pCursor
eab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
eac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
ead0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
eae0: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
eaf0: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
eb00: 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  VTAB: {.      sq
eb10: 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73 6f  lite3_vtab_curso
eb20: 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78 2d 3e  r *pVCur = pCx->
eb30: 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20 20 20  uc.pVCur;.      
eb40: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f  const sqlite3_mo
eb50: 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20  dule *pModule = 
eb60: 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 70 4d  pVCur->pVtab->pM
eb70: 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61 73 73  odule;.      ass
eb80: 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56 74 61  ert( pVCur->pVta
eb90: 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  b->nRef>0 );.   
eba0: 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d     pVCur->pVtab-
ebb0: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 70  >nRef--;.      p
ebc0: 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65 28 70  Module->xClose(p
ebd0: 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62 72 65  VCur);.      bre
ebe0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
ebf0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
ec00: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
ec10: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 66  in the current f
ec20: 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rame..*/.static 
ec30: 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73 6f 72  void closeCursor
ec40: 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20 2a 70  sInFrame(Vdbe *p
ec50: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ){.  if( p->apCs
ec60: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
ec70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
ec80: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
ec90: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
eca0: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
ecb0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
ecc0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
ecd0: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
ece0: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
ecf0: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
ed00: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
ed10: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
ed20: 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73 20 73  opy the values s
ed30: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56 64 62  tored in the Vdb
ed40: 65 46 72 61 6d 65 20 73 74 72 75 63 74 75 72 65  eFrame structure
ed50: 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68   to its Vdbe. Th
ed60: 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66  is.** is used, f
ed70: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
ed80: 20 61 20 74 72 69 67 67 65 72 20 73 75 62 2d 70   a trigger sub-p
ed90: 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64  rogram is halted
eda0: 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63   to restore.** c
edb0: 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61  ontrol to the ma
edc0: 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69  in program..*/.i
edd0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 72  nt sqlite3VdbeFr
ede0: 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62 65 46  ameRestore(VdbeF
edf0: 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20  rame *pFrame){. 
ee00: 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d   Vdbe *v = pFram
ee10: 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43 75 72  e->v;.  closeCur
ee20: 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29 3b 0a  sorsInFrame(v);.
ee30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
ee40: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
ee50: 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78 65 63  ATUS.  v->anExec
ee60: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45 78 65   = pFrame->anExe
ee70: 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d 3e 61  c;.#endif.  v->a
ee80: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
ee90: 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->aOnceFlag;.  
eea0: 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->nOnceFlag = p
eeb0: 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67  Frame->nOnceFlag
eec0: 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70 46 72  ;.  v->aOp = pFr
eed0: 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e  ame->aOp;.  v->n
eee0: 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 70  Op = pFrame->nOp
eef0: 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20 70 46  ;.  v->aMem = pF
ef00: 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d  rame->aMem;.  v-
ef10: 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >nMem = pFrame->
ef20: 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43 73 72  nMem;.  v->apCsr
ef30: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43 73 72   = pFrame->apCsr
ef40: 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72 20 3d  ;.  v->nCursor =
ef50: 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73 6f 72   pFrame->nCursor
ef60: 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73 74 52  ;.  v->db->lastR
ef70: 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d 3e 6c  owid = pFrame->l
ef80: 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e  astRowid;.  v->n
ef90: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
efa0: 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d 3e 64  >nChange;.  v->d
efb0: 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  b->nChange = pFr
efc0: 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65 3b 0a  ame->nDbChange;.
efd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
efe0: 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e 64 62  eteAuxData(v->db
eff0: 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61 2c 20  , &v->pAuxData, 
f000: 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70 41 75  -1, 0);.  v->pAu
f010: 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65 2d 3e  xData = pFrame->
f020: 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46 72 61  pAuxData;.  pFra
f030: 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 30  me->pAuxData = 0
f040: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
f050: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
f060: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
f070: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
f080: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
f090: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
f0a0: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
f0b0: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
f0c0: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
f0d0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
f0e0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
f0f0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
f100: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
f110: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
f120: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
f130: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
f140: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
f150: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
f160: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
f170: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
f180: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
f190: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
f1a0: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
f1b0: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
f1c0: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
f1d0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
f1e0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
f1f0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
f200: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
f210: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
f220: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
f230: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
f240: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
f250: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
f260: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
f270: 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66 28 20  Frame(p);.  if( 
f280: 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 72  p->aMem ){.    r
f290: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 26  eleaseMemArray(&
f2a0: 70 2d 3e 61 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e  p->aMem[1], p->n
f2b0: 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  Mem);.  }.  whil
f2c0: 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20  e( p->pDelFrame 
f2d0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
f2e0: 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c   *pDel = p->pDel
f2f0: 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44  Frame;.    p->pD
f300: 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e  elFrame = pDel->
f310: 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c  pParent;.    sql
f320: 69 74 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c  ite3VdbeFrameDel
f330: 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a  ete(pDel);.  }..
f340: 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20    /* Delete any 
f350: 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69  auxdata allocati
f360: 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ons made by the 
f370: 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70  VM */.  if( p->p
f380: 41 75 78 44 61 74 61 20 29 20 73 71 6c 69 74 65  AuxData ) sqlite
f390: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
f3a0: 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41  ta(p->db, &p->pA
f3b0: 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a  uxData, -1, 0);.
f3c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75    assert( p->pAu
f3d0: 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  xData==0 );.}../
f3e0: 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68  *.** Clean up th
f3f0: 65 20 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e  e VM after a sin
f400: 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74  gle run..*/.stat
f410: 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28  ic void Cleanup(
f420: 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
f430: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
f440: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f450: 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75  DEBUG.  /* Execu
f460: 74 65 20 61 73 73 65 72 74 28 29 20 73 74 61 74  te assert() stat
f470: 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65  ements to ensure
f480: 20 74 68 61 74 20 74 68 65 20 56 64 62 65 2e 61   that the Vdbe.a
f490: 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a  pCsr[] and .  **
f4a0: 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72   Vdbe.aMem[] arr
f4b0: 61 79 73 20 68 61 76 65 20 61 6c 72 65 61 64 79  ays have already
f4c0: 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70   been cleaned up
f4d0: 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20  .  */.  int i;. 
f4e0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20   if( p->apCsr ) 
f4f0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
f500: 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65  ursor; i++) asse
f510: 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d  rt( p->apCsr[i]=
f520: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
f530: 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  Mem ){.    for(i
f540: 3d 31 3b 20 69 3c 3d 70 2d 3e 6e 4d 65 6d 3b 20  =1; i<=p->nMem; 
f550: 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e  i++) assert( p->
f560: 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d  aMem[i].flags==M
f570: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a  EM_Undefined );.
f580: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71    }.#endif..  sq
f590: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f5a0: 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  p->zErrMsg);.  p
f5b0: 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
f5c0: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
f5d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74   0;.}../*.** Set
f5e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
f5f0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68  esult columns th
f600: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
f610: 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c 0a  ned by this SQL.
f620: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  ** statement. Th
f630: 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61 74  is is now set at
f640: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72   compile time, r
f650: 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69 6e  ather than durin
f660: 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f  g.** execution o
f670: 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  f the vdbe progr
f680: 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  am so that sqlit
f690: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
f6a0: 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c  ) can.** be call
f6b0: 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61  ed on an SQL sta
f6c0: 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73 71  tement before sq
f6d0: 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f  lite3_step()..*/
f6e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
f6f0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65  eSetNumCols(Vdbe
f700: 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c   *p, int nResCol
f710: 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f  umn){.  Mem *pCo
f720: 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a  lName;.  int n;.
f730: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f740: 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73  p->db;..  releas
f750: 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f  eMemArray(p->aCo
f760: 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f  lName, p->nResCo
f770: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b  lumn*COLNAME_N);
f780: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f790: 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
f7a0: 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c  );.  n = nResCol
f7b0: 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20  umn*COLNAME_N;. 
f7c0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
f7d0: 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e   (u16)nResColumn
f7e0: 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20  ;.  p->aColName 
f7f0: 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65  = pColName = (Me
f800: 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  m*)sqlite3DbMall
f810: 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f  ocZero(db, sizeo
f820: 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66  f(Mem)*n );.  if
f830: 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30  ( p->aColName==0
f840: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69   ) return;.  whi
f850: 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20  le( n-- > 0 ){. 
f860: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61     pColName->fla
f870: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
f880: 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20     pColName->db 
f890: 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f  = p->db;.    pCo
f8a0: 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a  lName++;.  }.}..
f8b0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 61  /*.** Set the na
f8c0: 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74 68  me of the idx'th
f8d0: 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65   column to be re
f8e0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53 51  turned by the SQ
f8f0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  L statement..** 
f900: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 20  zName must be a 
f910: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c  pointer to a nul
f920: 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69   terminated stri
f930: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ng..**.** This c
f940: 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64 65  all must be made
f950: 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
f960: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e   sqlite3VdbeSetN
f970: 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  umCols()..**.** 
f980: 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d 65  The final parame
f990: 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20  ter, xDel, must 
f9a0: 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  be one of SQLITE
f9b0: 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45  _DYNAMIC, SQLITE
f9c0: 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51  _STATIC.** or SQ
f9d0: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20  LITE_TRANSIENT. 
f9e0: 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45 5f  If it is SQLITE_
f9f0: 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74 68  DYNAMIC, then th
fa00: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
fa10: 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20  .** to by zName 
fa20: 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79  will be freed by
fa30: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
fa40: 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20 69   when the vdbe i
fa50: 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a  s destroyed..*/.
fa60: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 53  int sqlite3VdbeS
fa70: 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62  etColName(.  Vdb
fa80: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
faa0: 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e 66   Vdbe being conf
fab0: 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  igured */.  int 
fac0: 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20  idx,            
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fae0: 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20  Index of column 
faf0: 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f  zName applies to
fb00: 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20 20   */.  int var,  
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fb20: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
fb30: 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63   the COLNAME_* c
fb40: 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f  onstants */.  co
fb50: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fb70: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66  * Pointer to buf
fb80: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e  fer containing n
fb90: 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ame */.  void (*
fba0: 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20 20  xDel)(void*)    
fbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
fbc0: 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73  ory management s
fbd0: 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d  trategy for zNam
fbe0: 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
fbf0: 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d  ;.  Mem *pColNam
fc00: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  e;.  assert( idx
fc10: 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29  <p->nResColumn )
fc20: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72 3c  ;.  assert( var<
fc30: 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69  COLNAME_N );.  i
fc40: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
fc50: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61 73  Failed ){.    as
fc60: 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20  sert( !zName || 
fc70: 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e  xDel!=SQLITE_DYN
fc80: 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74 75  AMIC );.    retu
fc90: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f  rn SQLITE_NOMEM_
fca0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65  BKPT;.  }.  asse
fcb0: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
fcc0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
fcd0: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
fce0: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
fcf0: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
fd00: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
fd10: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
fd20: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
fd30: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
fd40: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
fd50: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
fd60: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
fd70: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
fd80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fd90: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
fda0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
fdb0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
fdc0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
fdd0: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
fde0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
fdf0: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
fe00: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
fe10: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
fe20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
fe30: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
fe40: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
fe50: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
fe60: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
fe70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fe80: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
fe90: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
fea0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
feb0: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
fec0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
fed0: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
fee0: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
fef0: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
ff00: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
ff10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ff20: 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65 20      ** that are 
ff30: 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20 61  candidates for a
ff40: 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
ff50: 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20 20  t using a.      
ff60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
ff70: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a  master-journal *
ff80: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
ff90: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65  ITE_OK;.  int ne
ffa0: 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a  edXcommit = 0;..
ffb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ffc0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
ffd0: 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20 6f    /* With this o
ffe0: 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74  ption, sqlite3Vt
fff0: 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66 69  abSync() is defi
10000 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c 79  ned to be simply
10010 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   .  ** SQLITE_OK
10020 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73 65   so p is not use
10030 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45  d. .  */.  UNUSE
10040 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
10050 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66  #endif..  /* Bef
10060 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  ore doing anythi
10070 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68  ng else, call th
10080 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62 61  e xSync() callba
10090 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20  ck for any.  ** 
100a0 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74  virtual module t
100b0 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69 6e  ables written in
100c0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
100d0 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a 20  n. This has to. 
100e0 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66 6f   ** be done befo
100f0 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20 77  re determining w
10100 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72 20  hether a master 
10110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
10120 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c 20  .  ** required, 
10130 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63 61  as an xSync() ca
10140 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20 61  llback may add a
10150 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  n attached datab
10160 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ase.  ** to the 
10170 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a  transaction..  *
10180 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
10190 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29 3b  VtabSync(db, p);
101a0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
101b0 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29 20   determines (a) 
101c0 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f  if the commit ho
101d0 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  ok should be inv
101e0 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62  oked and.  ** (b
101f0 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61 62  ) how many datab
10200 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20 6f  ase files have o
10210 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73 61  pen write transa
10220 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a  ctions, not .  *
10230 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65 20  * including the 
10240 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20 28  temp database. (
10250 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  b) is important 
10260 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65 20  because if more 
10270 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64  than .  ** one d
10280 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73  atabase file has
10290 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20 74   an open write t
102a0 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61  ransaction, a ma
102b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  ster journal.  *
102c0 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69 72  * file is requir
102d0 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63  ed for an atomic
102e0 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20   commit..  */ . 
102f0 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10300 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
10310 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10320 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
10330 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
10340 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10350 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
10360 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68 65   ){.      /* Whe
10370 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64 61  ther or not a da
10380 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65 65  tabase might nee
10390 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  d a master journ
103a0 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a  al depends upon.
103b0 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75        ** its jou
103c0 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67  rnal mode (among
103d0 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e 20   other things). 
103e0 20 54 68 69 73 20 6d 61 74 72 69 78 20 64 65 74   This matrix det
103f0 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20 20  ermines which.  
10400 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d      ** journal m
10410 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73 74 65  odes use a maste
10420 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68  r journal and wh
10430 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20  ich do not */.  
10440 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
10450 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20   u8 aMJNeeded[] 
10460 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44  = {.        /* D
10470 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20  ELETE   */  1,. 
10480 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49 53         /* PERSIS
10490 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20  T   */ 1,.      
104a0 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20 2a    /* OFF       *
104b0 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 0,.        /* 
104c0 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a  TRUNCATE  */ 1,.
104d0 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52          /* MEMOR
104e0 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20  Y    */ 0,.     
104f0 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20 20     /* WAL       
10500 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20  */ 0.      };.  
10510 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
10520 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61 73  r;   /* Pager as
10530 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 42  sociated with pB
10540 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64 58  t */.      needX
10550 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20  commit = 1;.    
10560 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
10570 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ter(pBt);.      
10580 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
10590 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29 3b  BtreePager(pBt);
105a0 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 61  .      if( db->a
105b0 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[i].safety_lev
105c0 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48 52  el!=PAGER_SYNCHR
105d0 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20 20  ONOUS_OFF.      
105e0 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71   && aMJNeeded[sq
105f0 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f 75  lite3PagerGetJou
10600 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72 29  rnalMode(pPager)
10610 5d 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20 20  ].      ){ .    
10620 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d 31      assert( i!=1
10630 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72 61   );.        nTra
10640 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ns++;.      }.  
10650 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10660 42 74 72 65 65 45 78 63 6c 75 73 69 76 65 4c 6f  BtreeExclusiveLo
10670 63 6b 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  ck(pBt);.      s
10680 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
10690 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
106a0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
106b0 5f 4f 4d 49 54 5f 43 4f 4e 43 55 52 52 45 4e 54  _OMIT_CONCURRENT
106c0 0a 20 20 69 66 28 20 64 62 2d 3e 62 43 6f 6e 63  .  if( db->bConc
106d0 75 72 72 65 6e 74 20 26 26 20 28 72 63 20 26 20  urrent && (rc & 
106e0 30 78 46 46 29 3d 3d 53 51 4c 49 54 45 5f 42 55  0xFF)==SQLITE_BU
106f0 53 59 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6e 20  SY ){.    /* An 
10700 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
10710 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
10720 48 4f 54 20 77 61 73 20 65 6e 63 6f 75 6e 74 65  HOT was encounte
10730 72 65 64 20 77 68 69 6c 65 20 0a 20 20 20 20 2a  red while .    *
10740 2a 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  * attempting to 
10750 74 61 6b 65 20 74 68 65 20 57 52 49 54 45 52 20  take the WRITER 
10760 6c 6f 63 6b 20 6f 6e 20 61 20 77 61 6c 20 66 69  lock on a wal fi
10770 6c 65 2e 20 52 65 6c 65 61 73 65 20 74 68 65 0a  le. Release the.
10780 20 20 20 20 2a 2a 20 57 52 49 54 45 52 20 6c 6f      ** WRITER lo
10790 63 6b 73 20 6f 6e 20 61 6c 6c 20 77 61 6c 20 66  cks on all wal f
107a0 69 6c 65 73 20 61 6e 64 20 72 65 74 75 72 6e 20  iles and return 
107b0 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 20 20 66  early.  */.    f
107c0 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
107d0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
107e0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
107f0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10800 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10810 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
10820 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
10830 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
10840 74 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  t);.        sqli
10850 74 65 33 50 61 67 65 72 44 72 6f 70 45 78 63 6c  te3PagerDropExcl
10860 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74 65  usiveLock(sqlite
10870 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
10880 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
10890 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
108a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
108b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
108c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
108d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
108e0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
108f0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
10900 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
10910 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
10920 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
10930 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
10940 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
10950 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
10960 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
10970 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
10980 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
10990 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
109a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
109b0 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
109c0 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
109d0 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
109e0 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
109f0 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
10a00 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
10a10 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
10a20 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
10a30 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
10a40 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
10a50 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
10a60 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
10a70 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
10a80 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
10a90 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
10aa0 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
10ab0 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
10ac0 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
10ad0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
10ae0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
10af0 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
10b00 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
10b10 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
10b20 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
10b30 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
10b40 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
10b50 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
10b60 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
10b70 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
10b80 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
10b90 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
10ba0 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
10bb0 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
10bc0 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
10bd0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
10be0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
10bf0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
10c00 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
10c10 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
10c20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
10c30 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10c40 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
10c50 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
10c60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10c70 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
10c80 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
10c90 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
10ca0 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
10cb0 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
10cc0 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
10cd0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10ce0 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
10cf0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
10d00 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
10d10 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
10d20 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
10d30 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10d40 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
10d50 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
10d60 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
10d70 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
10d80 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
10d90 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
10da0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
10db0 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
10dc0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
10dd0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
10de0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10df0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10e00 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
10e10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10e20 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
10e30 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
10e40 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10e60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
10e70 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
10e80 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
10e90 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
10ea0 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
10eb0 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
10ec0 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
10ed0 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
10ee0 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
10ef0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
10f00 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
10f10 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
10f20 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79  itted atomically
10f30 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
10f40 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
10f50 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
10f60 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
10f70 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
10f80 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
10f90 30 3b 20 20 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d  0;   /* File-nam
10fa0 65 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72  e for the master
10fb0 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20   journal */.    
10fc0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 4d 61 69  char const *zMai
10fd0 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  nFile = sqlite3B
10fe0 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
10ff0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
11000 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  .    sqlite3_fil
11010 65 20 2a 70 4d 61 73 74 65 72 20 3d 20 30 3b 0a  e *pMaster = 0;.
11020 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
11030 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b   0;.    int res;
11040 0a 20 20 20 20 69 6e 74 20 72 65 74 72 79 43 6f  .    int retryCo
11050 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  unt = 0;.    int
11060 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a 0a 20 20 20   nMainFile;..   
11070 20 2f 2a 20 53 65 6c 65 63 74 20 61 20 6d 61 73   /* Select a mas
11080 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11090 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 4d 61   name */.    nMa
110a0 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  inFile = sqlite3
110b0 53 74 72 6c 65 6e 33 30 28 7a 4d 61 69 6e 46 69  Strlen30(zMainFi
110c0 6c 65 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  le);.    zMaster
110d0 20 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74   = sqlite3MPrint
110e0 66 28 64 62 2c 20 22 25 73 2d 6d 6a 58 58 58 58  f(db, "%s-mjXXXX
110f0 58 58 39 58 58 7a 22 2c 20 7a 4d 61 69 6e 46 69  XX9XXz", zMainFi
11100 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 61  le);.    if( zMa
11110 73 74 65 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  ster==0 ) return
11120 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
11130 50 54 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  PT;.    do {.   
11140 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
11150 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
11160 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
11170 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
11180 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
11190 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
111a0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
111b0 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
111c0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
111d0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
111e0 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
111f0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
11200 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
11210 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
11220 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
11230 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
11240 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
11250 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
11260 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
11270 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
11280 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
11290 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
112a0 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
112b0 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
112c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
112d0 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
112e0 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
112f0 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
11300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
11320 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
11330 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
11340 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
11350 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
11360 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
11370 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11380 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
11390 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
113a0 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
113b0 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
113c0 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
113d0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
113e0 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
113f0 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
11400 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
11410 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
11420 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
11430 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
11440 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
11450 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
11460 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
11470 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
11480 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
11490 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
114a0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
114b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
114c0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
114d0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
114e0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
114f0 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
11500 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11510 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
11520 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11530 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
11540 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
11550 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11560 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
11570 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
11580 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
11590 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
115a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
115b0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
115c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
115d0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
115e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
115f0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
11600 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
11610 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
11620 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
11630 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
11640 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11650 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
11660 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
11670 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
11680 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
11690 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
116a0 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
116b0 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
116c0 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
116d0 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
116e0 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
116f0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
11700 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
11710 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
11720 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
11730 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
11740 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
11750 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
11760 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
11770 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
11780 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
11790 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
117a0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
117b0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
117c0 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
117d0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
117e0 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
117f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
11800 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
11810 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
11820 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
11830 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
11840 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
11850 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11860 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
11870 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11880 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
11890 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
118a0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
118b0 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
118c0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
118d0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
118e0 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
118f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11900 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11910 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11920 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11930 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11940 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
11950 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
11960 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11970 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
11980 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11990 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
119a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
119b0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
119c0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
119d0 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
119e0 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
119f0 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
11a00 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
11a10 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
11a20 20 2a 2f 0a 20 20 20 20 69 66 28 20 30 3d 3d 28   */.    if( 0==(
11a30 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11a40 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
11a50 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
11a60 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
11a70 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
11a80 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
11a90 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
11aa0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
11ab0 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
11ac0 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11ad0 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
11af0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11b00 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
11b10 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11b20 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11b40 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
11b50 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
11b60 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
11b70 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
11b80 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
11b90 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
11ba0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
11bb0 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
11bc0 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
11bd0 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
11be0 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
11bf0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
11c00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11c10 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
11c20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
11c30 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
11c40 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
11c50 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
11c60 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11c70 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
11c80 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
11c90 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
11ca0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11cb0 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
11cc0 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
11cd0 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
11ce0 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
11cf0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11d00 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
11d10 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
11d20 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
11d30 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
11d40 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
11d50 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
11d60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
11d70 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
11d80 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
11d90 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11da0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11db0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
11dc0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11dd0 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11de0 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
11df0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11e00 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
11e10 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
11e20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
11e30 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
11e40 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11e50 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
11e60 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
11e70 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
11e80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
11e90 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
11ea0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11eb0 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
11ec0 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
11ed0 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
11ee0 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
11ef0 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
11f00 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
11f10 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
11f20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
11f30 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
11f40 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
11f50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11f60 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11f70 73 74 65 72 2c 20 31 29 3b 0a 20 20 20 20 73 71  ster, 1);.    sq
11f80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11f90 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7a 4d  zMaster);.    zM
11fa0 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
11fb0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
11fc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
11fd0 0a 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65  .    /* All file
11fe0 73 20 61 6e 64 20 64 69 72 65 63 74 6f 72 69 65  s and directorie
11ff0 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
12000 65 65 6e 20 73 79 6e 63 65 64 2c 20 73 6f 20 74  een synced, so t
12010 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20  he following.   
12020 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
12030 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12040 68 61 73 65 54 77 6f 28 29 20 61 72 65 20 6f 6e  haseTwo() are on
12050 6c 79 20 63 6c 6f 73 69 6e 67 20 66 69 6c 65 73  ly closing files
12060 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65 6c 65   and.    ** dele
12070 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69  ting or truncati
12080 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e 20 49 66 20  ng journals. If 
12090 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
120a0 72 6f 6e 67 20 77 68 69 6c 65 0a 20 20 20 20 2a  rong while.    *
120b0 2a 20 74 68 69 73 20 69 73 20 68 61 70 70 65 6e  * this is happen
120c0 69 6e 67 20 77 65 20 64 6f 6e 27 74 20 72 65 61  ing we don't rea
120d0 6c 6c 79 20 63 61 72 65 2e 20 54 68 65 20 69 6e  lly care. The in
120e0 74 65 67 72 69 74 79 20 6f 66 20 74 68 65 0a 20  tegrity of the. 
120f0 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
12100 6e 20 69 73 20 61 6c 72 65 61 64 79 20 67 75 61  n is already gua
12110 72 61 6e 74 65 65 64 2c 20 62 75 74 20 73 6f 6d  ranteed, but som
12120 65 20 73 74 72 61 79 20 27 63 6f 6c 64 27 20 6a  e stray 'cold' j
12130 6f 75 72 6e 61 6c 73 0a 20 20 20 20 2a 2a 20 6d  ournals.    ** m
12140 61 79 20 62 65 20 6c 79 69 6e 67 20 61 72 6f 75  ay be lying arou
12150 6e 64 2e 20 52 65 74 75 72 6e 69 6e 67 20 61 6e  nd. Returning an
12160 20 65 72 72 6f 72 20 63 6f 64 65 20 77 6f 6e 27   error code won'
12170 74 20 68 65 6c 70 20 6d 61 74 74 65 72 73 2e 0a  t help matters..
12180 20 20 20 20 2a 2f 0a 20 20 20 20 64 69 73 61 62      */.    disab
12190 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
121a0 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 73 71  errors();.    sq
121b0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
121c0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 66 6f  Malloc();.    fo
121d0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
121e0 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42  ; i++){ .      B
121f0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
12200 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
12210 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
12220 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12230 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
12240 70 42 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  pBt, 1);.      }
12250 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
12260 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
12270 63 28 29 3b 0a 20 20 20 20 65 6e 61 62 6c 65 5f  c();.    enable_
12280 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
12290 6f 72 73 28 29 3b 0a 0a 20 20 20 20 73 71 6c 69  ors();..    sqli
122a0 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62  te3VtabCommit(db
122b0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
122c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
122d0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
122e0 6e 65 20 63 68 65 63 6b 73 20 74 68 61 74 20 74  ne checks that t
122f0 68 65 20 73 71 6c 69 74 65 33 2e 6e 56 64 62 65  he sqlite3.nVdbe
12300 41 63 74 69 76 65 20 63 6f 75 6e 74 20 76 61 72  Active count var
12310 69 61 62 6c 65 0a 2a 2a 20 6d 61 74 63 68 65 73  iable.** matches
12320 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76   the number of v
12330 64 62 65 27 73 20 69 6e 20 74 68 65 20 6c 69 73  dbe's in the lis
12340 74 20 73 71 6c 69 74 65 33 2e 70 56 64 62 65 20  t sqlite3.pVdbe 
12350 74 68 61 74 20 61 72 65 0a 2a 2a 20 63 75 72 72  that are.** curr
12360 65 6e 74 6c 79 20 61 63 74 69 76 65 2e 20 41 6e  ently active. An
12370 20 61 73 73 65 72 74 69 6f 6e 20 66 61 69 6c 73   assertion fails
12380 20 69 66 20 74 68 65 20 74 77 6f 20 63 6f 75 6e   if the two coun
12390 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ts do not match.
123a0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 6e 20 69  .** This is an i
123b0 6e 74 65 72 6e 61 6c 20 73 65 6c 66 2d 63 68 65  nternal self-che
123c0 63 6b 20 6f 6e 6c 79 20 2d 20 69 74 20 69 73 20  ck only - it is 
123d0 6e 6f 74 20 61 6e 20 65 73 73 65 6e 74 69 61 6c  not an essential
123e0 20 70 72 6f 63 65 73 73 69 6e 67 0a 2a 2a 20 73   processing.** s
123f0 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tep..**.** This 
12400 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 4e 44  is a no-op if ND
12410 45 42 55 47 20 69 73 20 64 65 66 69 6e 65 64 2e  EBUG is defined.
12420 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
12430 55 47 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  UG.static void c
12440 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
12450 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t(sqlite3 *db){.
12460 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 69 6e 74    Vdbe *p;.  int
12470 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20   cnt = 0;.  int 
12480 6e 57 72 69 74 65 20 3d 20 30 3b 0a 20 20 69 6e  nWrite = 0;.  in
12490 74 20 6e 52 65 61 64 20 3d 20 30 3b 0a 20 20 70  t nRead = 0;.  p
124a0 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a 20 20   = db->pVdbe;.  
124b0 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
124c0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
124d0 5f 62 75 73 79 28 28 73 71 6c 69 74 65 33 5f 73  _busy((sqlite3_s
124e0 74 6d 74 2a 29 70 29 20 29 7b 0a 20 20 20 20 20  tmt*)p) ){.     
124f0 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 69 66   cnt++;.      if
12500 28 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30  ( p->readOnly==0
12510 20 29 20 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20   ) nWrite++;.   
12520 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61     if( p->bIsRea
12530 64 65 72 20 29 20 6e 52 65 61 64 2b 2b 3b 0a 20  der ) nRead++;. 
12540 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2d 3e     }.    p = p->
12550 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 61 73 73  pNext;.  }.  ass
12560 65 72 74 28 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56  ert( cnt==db->nV
12570 64 62 65 41 63 74 69 76 65 20 29 3b 0a 20 20 61  dbeActive );.  a
12580 73 73 65 72 74 28 20 6e 57 72 69 74 65 3d 3d 64  ssert( nWrite==d
12590 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b  b->nVdbeWrite );
125a0 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65 61 64  .  assert( nRead
125b0 3d 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  ==db->nVdbeRead 
125c0 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  );.}.#else.#defi
125d0 6e 65 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  ne checkActiveVd
125e0 62 65 43 6e 74 28 78 29 0a 23 65 6e 64 69 66 0a  beCnt(x).#endif.
125f0 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 56 64  ./*.** If the Vd
12600 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
12610 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
12620 6f 70 65 6e 65 64 20 61 20 73 74 61 74 65 6d 65  opened a stateme
12630 6e 74 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a  nt-transaction,.
12640 2a 2a 20 63 6c 6f 73 65 20 69 74 20 6e 6f 77 2e  ** close it now.
12650 20 41 72 67 75 6d 65 6e 74 20 65 4f 70 20 6d 75   Argument eOp mu
12660 73 74 20 62 65 20 65 69 74 68 65 72 20 53 41 56  st be either SAV
12670 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12680 6f 72 0a 2a 2a 20 53 41 56 45 50 4f 49 4e 54 5f  or.** SAVEPOINT_
12690 52 45 4c 45 41 53 45 2e 20 49 66 20 69 74 20 69  RELEASE. If it i
126a0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  s SAVEPOINT_ROLL
126b0 42 41 43 4b 2c 20 74 68 65 6e 20 74 68 65 20 73  BACK, then the s
126c0 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e  tatement.** tran
126d0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
126e0 64 20 62 61 63 6b 2e 20 49 66 20 65 4f 70 20 69  d back. If eOp i
126f0 73 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  s SAVEPOINT_RELE
12700 41 53 45 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a  ASE, then the .*
12710 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
12720 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69  saction is commi
12730 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  tted..**.** If a
12740 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
12750 73 2c 20 61 6e 20 53 51 4c 49 54 45 5f 49 4f 45  s, an SQLITE_IOE
12760 52 52 5f 58 58 58 20 65 72 72 6f 72 20 63 6f 64  RR_XXX error cod
12770 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 0a  e is returned. .
12780 2a 2a 20 4f 74 68 65 72 77 69 73 65 20 53 51 4c  ** Otherwise SQL
12790 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
127a0 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53  qlite3VdbeCloseS
127b0 74 61 74 65 6d 65 6e 74 28 56 64 62 65 20 2a 70  tatement(Vdbe *p
127c0 2c 20 69 6e 74 20 65 4f 70 29 7b 0a 20 20 73 71  , int eOp){.  sq
127d0 6c 69 74 65 33 20 2a 63 6f 6e 73 74 20 64 62 20  lite3 *const db 
127e0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
127f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
12800 20 20 2f 2a 20 49 66 20 70 2d 3e 69 53 74 61 74    /* If p->iStat
12810 65 6d 65 6e 74 20 69 73 20 67 72 65 61 74 65 72  ement is greater
12820 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e   than zero, then
12830 20 74 68 69 73 20 56 64 62 65 20 6f 70 65 6e 65   this Vdbe opene
12840 64 20 61 20 0a 20 20 2a 2a 20 73 74 61 74 65 6d  d a .  ** statem
12850 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12860 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 63  that should be c
12870 6c 6f 73 65 64 20 68 65 72 65 2e 20 54 68 65 20  losed here. The 
12880 6f 6e 6c 79 20 65 78 63 65 70 74 69 6f 6e 0a 20  only exception. 
12890 20 2a 2a 20 69 73 20 74 68 61 74 20 61 6e 20 49   ** is that an I
128a0 4f 20 65 72 72 6f 72 20 6d 61 79 20 68 61 76 65  O error may have
128b0 20 6f 63 63 75 72 72 65 64 2c 20 63 61 75 73 69   occurred, causi
128c0 6e 67 20 61 6e 20 65 6d 65 72 67 65 6e 63 79 20  ng an emergency 
128d0 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 2a 2a 20 49  rollback..  ** I
128e0 6e 20 74 68 69 73 20 63 61 73 65 20 28 64 62 2d  n this case (db-
128f0 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 29 2c  >nStatement==0),
12900 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
12910 74 68 69 6e 67 20 74 6f 20 64 6f 2e 0a 20 20 2a  thing to do..  *
12920 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6e 53 74 61  /.  if( db->nSta
12930 74 65 6d 65 6e 74 20 26 26 20 70 2d 3e 69 53 74  tement && p->iSt
12940 61 74 65 6d 65 6e 74 20 29 7b 0a 20 20 20 20 69  atement ){.    i
12950 6e 74 20 69 3b 0a 20 20 20 20 63 6f 6e 73 74 20  nt i;.    const 
12960 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 3d  int iSavepoint =
12970 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 2d 31   p->iStatement-1
12980 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
12990 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
129a0 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53  LLBACK || eOp==S
129b0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
129c0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
129d0 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3e 30 20  b->nStatement>0 
129e0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
129f0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 3d 3d 28 64  ->iStatement==(d
12a00 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2b 64 62  b->nStatement+db
12a10 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 29 20 29 3b  ->nSavepoint) );
12a20 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ..    for(i=0; i
12a30 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
12a40 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 20 3d  .      int rc2 =
12a50 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
12a60 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
12a70 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
12a80 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
12a90 20 20 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d          if( eOp=
12aa0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
12ab0 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ACK ){.         
12ac0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
12ad0 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
12ae0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
12af0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
12b00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12b10 20 20 20 20 20 69 66 28 20 72 63 32 3d 3d 53 51       if( rc2==SQ
12b20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12b30 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
12b40 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
12b50 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
12b60 52 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f  RELEASE, iSavepo
12b70 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  int);.        }.
12b80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
12b90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12ba0 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b         rc = rc2;
12bb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12bc0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d   }.    }.    db-
12bd0 3e 6e 53 74 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20  >nStatement--;. 
12be0 20 20 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74     p->iStatement
12bf0 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 72   = 0;..    if( r
12c00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12c10 20 20 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53        if( eOp==S
12c20 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12c30 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
12c40 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
12c50 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
12c60 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
12c70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12c80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
12c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12ca0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12cb0 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74  te3VtabSavepoint
12cc0 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52  (db, SAVEPOINT_R
12cd0 45 4c 45 41 53 45 2c 20 69 53 61 76 65 70 6f 69  ELEASE, iSavepoi
12ce0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
12cf0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   }..    /* If th
12d00 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
12d10 73 61 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67  saction is being
12d20 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6c   rolled back, al
12d30 73 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 0a  so restore the .
12d40 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
12d50 68 61 6e 64 6c 65 73 20 64 65 66 65 72 72 65 64  handles deferred
12d60 20 63 6f 6e 73 74 72 61 69 6e 74 20 63 6f 75 6e   constraint coun
12d70 74 65 72 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ter to the value
12d80 20 69 74 20 68 61 64 20 77 68 65 6e 20 0a 20 20   it had when .  
12d90 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
12da0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  nt transaction w
12db0 61 73 20 6f 70 65 6e 65 64 2e 20 20 2a 2f 0a 20  as opened.  */. 
12dc0 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
12dd0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
12de0 7b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66  {.      db->nDef
12df0 65 72 72 65 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e  erredCons = p->n
12e00 53 74 6d 74 44 65 66 43 6f 6e 73 3b 0a 20 20 20  StmtDefCons;.   
12e10 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
12e20 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74  ImmCons = p->nSt
12e30 6d 74 44 65 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20  mtDefImmCons;.  
12e40 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12e50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
12e60 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
12e70 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 74 72 61  alled when a tra
12e80 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 65 64 20  nsaction opened 
12e90 62 79 20 74 68 65 20 64 61 74 61 62 61 73 65 20  by the database 
12ea0 0a 2a 2a 20 68 61 6e 64 6c 65 20 61 73 73 6f 63  .** handle assoc
12eb0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
12ec0 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
12ed0 72 67 75 6d 65 6e 74 20 69 73 20 61 62 6f 75 74  rgument is about
12ee0 20 74 6f 20 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69   to be .** commi
12ef0 74 74 65 64 2e 20 49 66 20 74 68 65 72 65 20 61  tted. If there a
12f00 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
12f10 65 66 65 72 72 65 64 20 66 6f 72 65 69 67 6e 20  eferred foreign 
12f20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a  key constraint.*
12f30 2a 20 76 69 6f 6c 61 74 69 6f 6e 73 2c 20 72 65  * violations, re
12f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12f50 52 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  R. Otherwise, SQ
12f60 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
12f70 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
12f80 74 61 6e 64 69 6e 67 20 46 4b 20 76 69 6f 6c 61  tanding FK viola
12f90 74 69 6f 6e 73 20 61 6e 64 20 74 68 69 73 20 66  tions and this f
12fa0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
12fb0 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  .** SQLITE_ERROR
12fc0 2c 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  , set the result
12fd0 20 6f 66 20 74 68 65 20 56 4d 20 74 6f 20 53 51   of the VM to SQ
12fe0 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
12ff0 46 4f 52 45 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e  FOREIGNKEY.** an
13000 64 20 77 72 69 74 65 20 61 6e 20 65 72 72 6f 72  d write an error
13010 20 6d 65 73 73 61 67 65 20 74 6f 20 69 74 2e 20   message to it. 
13020 54 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c 49  Then return SQLI
13030 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66  TE_ERROR..*/.#if
13040 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13050 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 69 6e 74  _FOREIGN_KEY.int
13060 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
13070 6b 46 6b 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  kFk(Vdbe *p, int
13080 20 64 65 66 65 72 72 65 64 29 7b 0a 20 20 73 71   deferred){.  sq
13090 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
130a0 62 3b 0a 20 20 69 66 28 20 28 64 65 66 65 72 72  b;.  if( (deferr
130b0 65 64 20 26 26 20 28 64 62 2d 3e 6e 44 65 66 65  ed && (db->nDefe
130c0 72 72 65 64 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65  rredCons+db->nDe
130d0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 29 3e 30  ferredImmCons)>0
130e0 29 20 0a 20 20 20 7c 7c 20 28 21 64 65 66 65 72  ) .   || (!defer
130f0 72 65 64 20 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e  red && p->nFkCon
13100 73 74 72 61 69 6e 74 3e 30 29 20 0a 20 20 29 7b  straint>0) .  ){
13110 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
13120 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
13130 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 70  OREIGNKEY;.    p
13140 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
13150 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 20 20 73 71  OE_Abort;.    sq
13160 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
13170 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59 20 63  , "FOREIGN KEY c
13180 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
13190 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ");.    return S
131a0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
131b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
131c0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
131d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
131e0 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  e is called the 
131f0 77 68 65 6e 20 61 20 56 44 42 45 20 74 72 69 65  when a VDBE trie
13200 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66 20 74  s to halt.  If t
13210 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73 20 6d  he VDBE.** has m
13220 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e 64 20  ade changes and 
13230 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74  is in autocommit
13240 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f 6d 6d   mode, then comm
13250 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68 61 6e  it those.** chan
13260 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c 6c 62  ges.  If a rollb
13270 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c 20 74  ack is needed, t
13280 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c 6c 62  hen do the rollb
13290 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
132a0 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20 6f  routine is the o
132b0 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76 65 20  nly way to move 
132c0 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 20 56  the state of a V
132d0 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45  M from.** SQLITE
132e0 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20 53 51  _MAGIC_RUN to SQ
132f0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 2e  LITE_MAGIC_HALT.
13300 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65 73 73    It is harmless
13310 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68 69 73   to.** call this
13320 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20 69 73   on a VM that is
13330 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45 5f 4d   in the SQLITE_M
13340 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74 65 2e  AGIC_HALT state.
13350 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
13360 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20 49 66   error code.  If
13370 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f 75 6c   the commit coul
13380 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65 20 62  d not complete b
13390 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63  ecause of.** loc
133a0 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20 72 65  k contention, re
133b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
133c0 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42 55 53  .  If SQLITE_BUS
133d0 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 69  Y is returned, i
133e0 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65 20 63  t.** means the c
133f0 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68 61 70  lose did not hap
13400 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20 74 6f  pen and needs to
13410 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a 2a 2f   be repeated..*/
13420 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13430 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  Halt(Vdbe *p){. 
13440 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13460 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74 6f 72   /* Used to stor
13470 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65 74 75  e transient retu
13480 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20 73 71  rn codes */.  sq
13490 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
134a0 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75  b;..  /* This fu
134b0 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  nction contains 
134c0 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74 20 64  the logic that d
134d0 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73  etermines if a s
134e0 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a  tatement or.  **
134f0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
13500 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f  l be committed o
13510 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  r rolled back as
13520 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
13530 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  .  ** execution 
13540 6f 66 20 74 68 69 73 20 76 69 72 74 75 61 6c 20  of this virtual 
13550 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20  machine. .  **. 
13560 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68   ** If any of th
13570 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72 72 6f  e following erro
13580 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a 0a 20  rs occur:.  **. 
13590 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4e   **     SQLITE_N
135a0 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20 53 51  OMEM.  **     SQ
135b0 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a 2a 20  LITE_IOERR.  ** 
135c0 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a      SQLITE_FULL.
135d0 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
135e0 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a 0a 20  INTERRUPT.  **. 
135f0 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69 6e 74   ** Then the int
13600 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69 67 68  ernal cache migh
13610 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65 66 74  t have been left
13620 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   in an inconsist
13630 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65 2e 20  ent.  ** state. 
13640 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c   We need to roll
13650 62 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65  back the stateme
13660 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
13670 69 66 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  if there is.  **
13680 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63 6f 6d   one, or the com
13690 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74 69 6f  plete transactio
136a0 6e 20 69 66 20 74 68 65 72 65 20 69 73 20 6e 6f  n if there is no
136b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
136c0 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20  action..  */..  
136d0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
136e0 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72  iled ){.    p->r
136f0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
13700 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
13710 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
13720 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
13730 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
13740 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
13750 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
13760 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
13770 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
13780 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13790 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
137a0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
137b0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
137c0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
137d0 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
137e0 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
137f0 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
13800 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
13810 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
13820 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
13830 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
13840 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
13850 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
13860 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
13870 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
13880 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
13890 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
138a0 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
138b0 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
138c0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
138d0 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
138e0 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
138f0 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
13900 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
13910 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
13920 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
13930 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
13940 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
13950 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
13960 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
13970 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
13980 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
13990 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
139a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
139b0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
139c0 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
139d0 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
139e0 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
139f0 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
13a00 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
13a10 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
13a20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
13a30 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
13a40 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
13a50 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
13a60 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
13a70 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
13a80 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
13a90 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
13aa0 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
13ab0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
13ac0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
13ad0 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
13ae0 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
13af0 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
13b00 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
13b10 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
13b20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
13b30 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
13b40 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
13b50 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
13b60 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
13b70 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
13b80 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
13b90 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
13ba0 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
13bb0 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
13bc0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
13bd0 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
13be0 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
13bf0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
13c00 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
13c10 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
13c20 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
13c30 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
13c40 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
13c50 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
13c60 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
13c70 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
13c80 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
13c90 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
13ca0 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
13cb0 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
13cc0 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
13cd0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
13ce0 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
13cf0 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
13d00 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
13d10 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
13d20 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
13d30 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
13d40 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
13d50 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13d60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13d70 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
13d80 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
13d90 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
13da0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
13db0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
13dc0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
13dd0 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
13de0 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
13df0 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
13e00 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
13e10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13e20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
13e30 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
13e40 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
13e50 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13e60 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
13e70 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
13e80 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13e90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
13ea0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
13eb0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 0;.          p
13ec0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
13ed0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13ee0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
13ef0 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69 61  heck for immedia
13f00 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 76  te foreign key v
13f10 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20  iolations. */.  
13f20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13f30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13f40 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b  sqlite3VdbeCheck
13f50 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Fk(p, 0);.    }.
13f60 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
13f70 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
13f80 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68 69  g is set and thi
13f90 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63  s is the only ac
13fa0 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20 20  tive writer .   
13fb0 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65 20   ** VM, then we 
13fc0 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d 6d  do either a comm
13fd0 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6f  it or rollback o
13fe0 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  f the current tr
13ff0 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20 20  ansaction. .    
14000 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a 20  **.    ** Note: 
14010 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f 20  This block also 
14020 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20 74  runs if one of t
14030 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
14040 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20 2a  s handled .    *
14050 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63 75  * above has occu
14060 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  rred. .    */.  
14070 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56 74    if( !sqlite3Vt
14080 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20 20  abInSync(db) .  
14090 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43 6f     && db->autoCo
140a0 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64 62  mmit .     && db
140b0 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28 70  ->nVdbeWrite==(p
140c0 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a  ->readOnly==0) .
140d0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28      ){.      if(
140e0 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
140f0 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41 63  K || (p->errorAc
14100 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26 26  tion==OE_Fail &&
14110 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72   !isSpecialError
14120 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
14130 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  = sqlite3VdbeChe
14140 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20 20  ckFk(p, 1);.    
14150 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
14160 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14170 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e     if( NEVER(p->
14180 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20  readOnly) ){.   
14190 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
141a0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
141b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
141c0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
141d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
141e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
141f0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
14200 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20 20  IGNKEY;.        
14210 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20 20  }else{ .        
14220 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63 6f    /* The auto-co
14230 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72 75  mmit flag is tru
14240 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  e, the vdbe prog
14250 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73 66  ram was successf
14260 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ul .          **
14270 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20 46   or hit an 'OR F
14280 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74 20  AIL' constraint 
14290 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f  and there are no
142a0 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69 67   deferred foreig
142b0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6b  n.          ** k
142c0 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74  ey constraints t
142d0 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74 72  o hold up the tr
142e0 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20  ansaction. This 
142f0 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20 0a  means a commit .
14300 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
14310 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 20  required. */.   
14320 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
14330 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a 20  Commit(db, p);. 
14340 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14350 20 69 66 28 20 28 72 63 20 26 20 30 78 46 46 29   if( (rc & 0xFF)
14360 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
14370 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
14380 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14390 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
143a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
143b0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  rc;.        }els
143c0 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
143d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
143e0 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20   p->rc = rc;.   
143f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14400 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14410 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20  LITE_OK);.      
14420 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14430 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
14440 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  e{.          db-
14450 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d  >nDeferredCons =
14460 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
14470 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
14480 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ns = 0;.        
14490 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e    db->flags &= ~
144a0 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b  SQLITE_DeferFKs;
144b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
144c0 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61 6c  e3CommitInternal
144d0 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20 20  Changes(db);.   
144e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
144f0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14500 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
14510 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
14520 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14530 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14540 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d       db->nStatem
14550 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ent = 0;.    }el
14560 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e  se if( eStatemen
14570 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tOp==0 ){.      
14580 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14590 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f 72  E_OK || p->error
145a0 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
145b0 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  ){.        eStat
145c0 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f  ementOp = SAVEPO
145d0 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20 20  INT_RELEASE;.   
145e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e     }else if( p->
145f0 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
14600 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20  Abort ){.       
14610 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
14620 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14630 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  CK;.      }else{
14640 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14650 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14660 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
14670 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  LBACK);.        
14680 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
14690 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
146a0 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d      db->autoComm
146b0 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  it = 1;.        
146c0 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e 74 20  db->bConcurrent 
146d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
146e0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
146f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
14700 20 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65    /* If eStateme
14710 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  ntOp is non-zero
14720 2c 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65  , then a stateme
14730 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e  nt transaction n
14740 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
14750 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72  e committed or r
14760 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c  olled back. Call
14770 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
14780 65 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a  eStatement() to.
14790 20 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66      ** do so. If
147a0 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   this operation 
147b0 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
147c0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
147d0 74 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20  t statement.    
147e0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  ** error code is
147f0 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
14800 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
14810 20 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68   then promote th
14820 65 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74  e.    ** current
14830 20 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72   statement error
14840 20 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   code..    */.  
14850 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
14860 4f 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  Op ){.      rc =
14870 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73   sqlite3VdbeClos
14880 65 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53  eStatement(p, eS
14890 74 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20  tatementOp);.   
148a0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
148b0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
148c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
148d0 3e 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  >rc&0xff)==SQLIT
148e0 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a  E_CONSTRAINT ){.
148f0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
14900 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
14910 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14920 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
14930 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72           p->zErr
14940 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
14950 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
14960 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
14970 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
14980 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
14990 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
149a0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
149b0 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
149c0 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
149d0 20 20 64 62 2d 3e 62 43 6f 6e 63 75 72 72 65 6e    db->bConcurren
149e0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  t = 0;.        p
149f0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14a00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
14a10 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77      /* If this w
14a20 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50  as an INSERT, UP
14a30 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61  DATE or DELETE a
14a40 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20  nd no statement 
14a50 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20  transaction.    
14a60 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c  ** has been roll
14a70 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20  ed back, update 
14a80 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
14a90 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63  nection change-c
14aa0 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a  ounter. .    */.
14ab0 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67      if( p->chang
14ac0 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20  eCntOn ){.      
14ad0 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  if( eStatementOp
14ae0 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  !=SAVEPOINT_ROLL
14af0 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  BACK ){.        
14b00 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68  sqlite3VdbeSetCh
14b10 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68  anges(db, p->nCh
14b20 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ange);.      }el
14b30 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
14b40 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
14b50 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  s(db, 0);.      
14b60 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e  }.      p->nChan
14b70 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  ge = 0;.    }.. 
14b80 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
14b90 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73  e locks */.    s
14ba0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
14bb0 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65  p);.  }..  /* We
14bc0 20 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c   have successful
14bd0 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c  ly halted and cl
14be0 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65  osed the VM.  Re
14bf0 63 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20  cord this fact. 
14c00 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
14c10 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64  0 ){.    db->nVd
14c20 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20  beActive--;.    
14c30 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
14c40 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74   ) db->nVdbeWrit
14c50 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  e--;.    if( p->
14c60 62 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e  bIsReader ) db->
14c70 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20  nVdbeRead--;.   
14c80 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
14c90 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56  beActive>=db->nV
14ca0 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61  dbeRead );.    a
14cb0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
14cc0 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57  Read>=db->nVdbeW
14cd0 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65  rite );.    asse
14ce0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69  rt( db->nVdbeWri
14cf0 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70  te>=0 );.  }.  p
14d00 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
14d10 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65  AGIC_HALT;.  che
14d20 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28  ckActiveVdbeCnt(
14d30 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  db);.  if( db->m
14d40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14d50 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
14d60 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
14d70 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61  }..  /* If the a
14d80 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
14d90 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20  is set to true, 
14da0 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74  then any locks t
14db0 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20  hat were held.  
14dc0 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  ** by connection
14dd0 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65   db have now bee
14de0 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c  n released. Call
14df0 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69   sqlite3Connecti
14e00 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20  onUnlocked() .  
14e10 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79  ** to invoke any
14e20 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b   required unlock
14e30 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b  -notify callback
14e40 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  s..  */.  if( db
14e50 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a  ->autoCommit ){.
14e60 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65      sqlite3Conne
14e70 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62  ctionUnlocked(db
14e80 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
14e90 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ( db->nVdbeActiv
14ea0 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43  e>0 || db->autoC
14eb0 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e  ommit==0 || db->
14ec0 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b  nStatement==0 );
14ed0 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63  .  return (p->rc
14ee0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20  ==SQLITE_BUSY ? 
14ef0 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51  SQLITE_BUSY : SQ
14f00 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a  LITE_OK);.}.../*
14f10 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f  .** Each VDBE ho
14f20 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f  lds the result o
14f30 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
14f40 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  t sqlite3_step()
14f50 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72   call.** in p->r
14f60 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  c.  This routine
14f70 20 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c   sets that resul
14f80 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45  t back to SQLITE
14f90 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  _OK..*/.void sql
14fa0 69 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65  ite3VdbeResetSte
14fb0 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29  pResult(Vdbe *p)
14fc0 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49  {.  p->rc = SQLI
14fd0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
14fe0 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63  Copy the error c
14ff0 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65  ode and error me
15000 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20  ssage belonging 
15010 74 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73  to the VDBE pass
15020 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72  ed.** as the fir
15030 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69  st argument to i
15040 74 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ts database hand
15050 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79  le (so that they
15060 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74   will be .** ret
15070 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74  urned by calls t
15080 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  o sqlite3_errcod
15090 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  e() and sqlite3_
150a0 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a  errmsg())..**.**
150b0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
150c0 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68  oes not clear th
150d0 65 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64  e VDBE error cod
150e0 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75  e or message, ju
150f0 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65  st.** copies the
15100 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  m to the databas
15110 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
15120 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e   sqlite3VdbeTran
15130 73 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a  sferError(Vdbe *
15140 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
15150 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74  b = p->db;.  int
15160 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69   rc = p->rc;.  i
15170 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b  f( p->zErrMsg ){
15180 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
15190 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71  Malloc++;.    sq
151a0 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
151b0 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66  Malloc();.    if
151c0 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20  ( db->pErr==0 ) 
151d0 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74  db->pErr = sqlit
151e0 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a  e3ValueNew(db);.
151f0 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65      sqlite3Value
15200 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c  SetStr(db->pErr,
15210 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c   -1, p->zErrMsg,
15220 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
15230 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
15240 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
15250 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
15260 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61     db->bBenignMa
15270 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e  lloc--;.    db->
15280 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
15290 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
152a0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
152b0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
152c0 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
152d0 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
152e0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
152f0 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
15300 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
15310 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
15320 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
15330 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
15340 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
15350 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
15360 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
15370 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15380 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
15390 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
153a0 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
153b0 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
153c0 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
153d0 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
153e0 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
153f0 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
15400 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
15410 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
15420 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
15430 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15440 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
15450 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
15460 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
15470 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
15480 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
15490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
154a0 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
154b0 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
154c0 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
154d0 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
154e0 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
154f0 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
15500 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
15510 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
15520 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
15530 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
15540 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
15550 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
15560 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
15570 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
15580 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
15590 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
155a0 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
155b0 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
155c0 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
155d0 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
155e0 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
155f0 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
15600 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
15610 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
15620 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
15630 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
15640 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
15650 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
15660 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
15670 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
15680 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
15690 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
156a0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
156b0 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
156c0 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
156d0 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
156e0 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
156f0 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
15700 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
15710 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
15720 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
15730 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
15740 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
15750 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
15760 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
15770 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
15780 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
15790 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
157a0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
157b0 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
157c0 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
157d0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
157e0 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
157f0 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
15800 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
15810 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
15820 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
15830 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
15840 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
15850 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
15860 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
15870 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
15880 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
15890 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
158a0 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
158b0 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
158c0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
158d0 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
158e0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
158f0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
15900 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
15910 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
15920 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
15930 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
15940 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
15950 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
15960 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
15970 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
15980 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
15990 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
159a0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
159b0 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
159c0 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
159d0 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
159e0 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
159f0 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
15a00 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
15a10 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
15a20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
15a30 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
15a40 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
15a50 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
15a60 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
15a70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15a80 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
15a90 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15aa0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
15ab0 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
15ac0 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
15ad0 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
15ae0 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
15af0 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
15b00 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
15b10 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
15b20 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
15b30 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
15b40 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
15b50 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
15b60 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
15b70 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
15b80 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
15b90 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
15ba0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15bb0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
15bc0 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15bd0 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
15be0 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
15bf0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
15c00 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
15c10 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71        if( p->zSq
15c20 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
15c30 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20  r c, pc = 0;.   
15c40 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15c50 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
15c60 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
15c70 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20  p->zSql[i])!=0; 
15c80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
15c90 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66  if( pc=='\n' ) f
15ca0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
15cb0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  ");.          pu
15cc0 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
15cd0 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
15ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
15cf0 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66  if( pc!='\n' ) f
15d00 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
15d10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
15d30 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
15d40 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d    char zHdr[100]
15d50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
15d60 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
15d70 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22  f(zHdr), zHdr, "
15d80 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75  %6u %12llu %8llu
15d90 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
15da0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
15db0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
15dc0 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
15dd0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15de0 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
15df0 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
15e00 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
15e10 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70     );.        fp
15e20 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
15e30 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   zHdr);.        
15e40 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
15e50 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
15e60 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
15e70 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
15e80 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
15e90 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e  dif.  p->iCurren
15ea0 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  tTime = 0;.  p->
15eb0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
15ec0 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
15ed0 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
15ee0 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
15ef0 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
15f00 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
15f10 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
15f20 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
15f30 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
15f40 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
15f50 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
15f60 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
15f70 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
15f80 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
15f90 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
15fa0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
15fb0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
15fc0 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
15fd0 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
15fe0 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
15ff0 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
16000 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
16010 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
16020 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
16030 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
16040 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
16050 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
16060 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
16070 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
16080 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
16090 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
160a0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
160b0 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
160c0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
160d0 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
160e0 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
160f0 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
16100 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
16110 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
16120 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
16130 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
16140 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
16150 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
16160 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
16170 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
16180 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
16190 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
161a0 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
161b0 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
161c0 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
161d0 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
161e0 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
161f0 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
16200 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
16210 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
16220 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
16230 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
16240 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
16250 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
16260 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
16270 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
16280 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
16290 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
162a0 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
162b0 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
162c0 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
162d0 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
162e0 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
162f0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
16300 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
16310 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75  (sqlite3 *db, Au
16320 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20  xData **pp, int 
16330 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a  iOp, int mask){.
16340 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a    while( *pp ){.
16350 20 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75      AuxData *pAu
16360 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28  x = *pp;.    if(
16370 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c   (iOp<0).     ||
16380 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70   (pAux->iOp==iOp
16390 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e   && (pAux->iArg>
163a0 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d  31 || !(mask & M
163b0 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69  ASKBIT32(pAux->i
163c0 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20  Arg)))).    ){. 
163d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
163e0 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b  Aux->iArg==31 );
163f0 0a 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d  .      if( pAux-
16400 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20  >xDelete ){.    
16410 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74      pAux->xDelet
16420 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20  e(pAux->pAux);. 
16430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70       }.      *pp
16440 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a   = pAux->pNext;.
16450 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
16460 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20  ree(db, pAux);. 
16470 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16480 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
16490 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
164a0 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
164b0 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
164c0 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
164d0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
164e0 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
164f0 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
16500 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
16510 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
16520 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
16530 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
16540 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
16550 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
16560 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
16570 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
16580 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
16590 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
165a0 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
165b0 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
165c0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
165d0 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
165e0 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
165f0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
16600 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
16610 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
16620 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
16630 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
16640 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
16650 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
16660 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
16670 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
16680 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
16690 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
166a0 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
166b0 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
166c0 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
166d0 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
166e0 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
166f0 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
16700 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
16710 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
16720 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
16730 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
16740 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16750 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
16760 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
16770 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
16780 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16790 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c  azVar[i]);.  sql
167a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
167b0 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64 62 65  ->azVar);.  vdbe
167c0 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
167d0 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b  p->aOp, p->nOp);
167e0 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
167f0 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  (db, p->aColName
16800 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16810 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b  ee(db, p->zSql);
16820 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16830 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a  (db, p->pFree);.
16840 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16850 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
16860 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ATUS.  for(i=0; 
16870 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29  i<p->nScan; i++)
16880 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
16890 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
168a0 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  [i].zName);.  }.
168b0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
168c0 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23  db, p->aScan);.#
168d0 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  endif.}../*.** D
168e0 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
168f0 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  VDBE..*/.void sq
16900 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
16910 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  Vdbe *p){.  sqli
16920 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
16930 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65  NEVER(p==0) ) re
16940 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  turn;.  db = p->
16950 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
16960 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
16970 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
16980 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61   sqlite3VdbeClea
16990 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a  rObject(db, p);.
169a0 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29    if( p->pPrev )
169b0 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e  {.    p->pPrev->
169c0 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
169d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
169e0 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65  ssert( db->pVdbe
169f0 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70  ==p );.    db->p
16a00 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Vdbe = p->pNext;
16a10 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e  .  }.  if( p->pN
16a20 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e  ext ){.    p->pN
16a30 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e  ext->pPrev = p->
16a40 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e  pPrev;.  }.  p->
16a50 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
16a60 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62  IC_DEAD;.  p->db
16a70 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44   = 0;.  sqlite3D
16a80 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a  bFree(db, p);.}.
16a90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f  ./*.** The curso
16aa0 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64  r "p" has a pend
16ab0 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69  ing seek operati
16ac0 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20  on that has not 
16ad0 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72  yet been.** carr
16ae0 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74  ied out.  Seek t
16af0 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20  he cursor now.  
16b00 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16b10 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  rs, return.** th
16b20 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  e appropriate er
16b30 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
16b40 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e  tic int SQLITE_N
16b50 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65  OINLINE handleDe
16b60 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62  ferredMoveto(Vdb
16b70 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16b80 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64  nt res, rc;.#ifd
16b90 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
16ba0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
16bb0 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
16bc0 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
16bd0 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f  t( p->deferredMo
16be0 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  veto );.  assert
16bf0 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a  ( p->isTable );.
16c00 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
16c10 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16c20 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73  TREE );.  rc = s
16c30 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74  qlite3BtreeMovet
16c40 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e  oUnpacked(p->uc.
16c50 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d  pCursor, 0, p->m
16c60 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20  ovetoTarget, 0, 
16c70 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20  &res);.  if( rc 
16c80 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69  ) return rc;.  i
16c90 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75  f( res!=0 ) retu
16ca0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
16cb0 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53  T_BKPT;.#ifdef S
16cc0 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c  QLITE_TEST.  sql
16cd0 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
16ce0 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d  t++;.#endif.  p-
16cf0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
16d00 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  = 0;.  p->cacheS
16d10 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
16d20 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ALE;.  return SQ
16d30 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
16d40 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20  * Something has 
16d50 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22  moved cursor "p"
16d60 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20   out of place.  
16d70 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74  Maybe the row it
16d80 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20   was.** pointed 
16d90 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  to was deleted o
16da0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74  ut from under it
16db0 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20  .  Or maybe the 
16dc0 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62  btree was.** reb
16dd0 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76  alanced.  Whatev
16de0 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72  er the cause, tr
16df0 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22  y to restore "p"
16e00 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74   to the place it
16e10 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20  .** is supposed 
16e20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20  to be pointing. 
16e30 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20   If the row was 
16e40 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16e50 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75   under the.** cu
16e60 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75  rsor, set the cu
16e70 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f  rsor to point to
16e80 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a   a NULL row..*/.
16e90 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
16ea0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c  E_NOINLINE handl
16eb0 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62  eMovedCursor(Vdb
16ec0 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69  eCursor *p){.  i
16ed0 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  nt isDifferentRo
16ee0 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  w, rc;.  assert(
16ef0 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
16f00 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
16f10 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70   assert( p->uc.p
16f20 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61  Cursor!=0 );.  a
16f30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
16f40 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
16f50 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
16f60 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
16f70 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73  e3BtreeCursorRes
16f80 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73  tore(p->uc.pCurs
16f90 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74  or, &isDifferent
16fa0 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65  Row);.  p->cache
16fb0 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
16fc0 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69  TALE;.  if( isDi
16fd0 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e  fferentRow ) p->
16fe0 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72  nullRow = 1;.  r
16ff0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17000 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75  ** Check to ensu
17010 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  re that the curs
17020 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65  or is valid.  Re
17030 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72  store the cursor
17040 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20  .** if need be. 
17050 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20   Return any I/O 
17060 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72  error from the r
17070 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e  estore operation
17080 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17090 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72  VdbeCursorRestor
170a0 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29  e(VdbeCursor *p)
170b0 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  {.  assert( p->e
170c0 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
170d0 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20  _BTREE );.  if( 
170e0 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
170f0 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
17100 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
17110 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
17120 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
17130 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17140 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
17150 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72  ake sure the cur
17160 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74  sor p is ready t
17170 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  o read or write 
17180 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68  the row to which
17190 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
171a0 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74  positioned.  Ret
171b0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
171c0 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c  e if an OOM faul
171d0 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a  t or I/O error.*
171e0 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72  * prevents us fr
171f0 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74  om positioning t
17200 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73  he cursor to its
17210 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f   correct positio
17220 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f  n..**.** If a Mo
17230 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69  veTo operation i
17240 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65  s pending on the
17250 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74   given cursor, t
17260 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d  hen do that.** M
17270 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e  oveTo now.  If n
17280 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e  o move is pendin
17290 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  g, check to see 
172a0 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62  if the row has b
172b0 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f  een.** deleted o
172c0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
172d0 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20  e cursor and if 
172e0 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65  it has, mark the
172f0 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c   row as.** a NUL
17300 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  L row..**.** If 
17310 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
17320 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74  ready pointing t
17330 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f  o the correct ro
17340 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68  w and that row h
17350 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64  as.** not been d
17360 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
17370 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
17380 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
17390 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
173a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
173b0 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56  beCursorMoveto(V
173c0 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20  dbeCursor **pp, 
173d0 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56  int *piCol){.  V
173e0 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a  dbeCursor *p = *
173f0 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75  pp;.  if( p->eCu
17400 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
17410 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20  TREE ){.    if( 
17420 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
17430 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  o ){.      int i
17440 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Map;.      if( p
17450 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d  ->aAltMap && (iM
17460 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b  ap = p->aAltMap[
17470 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a  1+*piCol])>0 ){.
17480 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d          *pp = p-
17490 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20  >pAltCursor;.   
174a0 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d       *piCol = iM
174b0 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20  ap - 1;.        
174c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
174d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
174e0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66  return handleDef
174f0 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a  erredMoveto(p);.
17500 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
17510 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
17520 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
17530 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20  Cursor) ){.     
17540 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f   return handleMo
17550 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20  vedCursor(p);.  
17560 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
17570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
17580 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
17590 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a  ng functions:.**
175a0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
175b0 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73  erialType().** s
175c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
175d0 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c  TypeLen().** sql
175e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65  ite3VdbeSerialLe
175f0 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
17600 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a  beSerialPut().**
17610 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17620 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e  alGet().**.** en
17630 63 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f  capsulate the co
17640 64 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a  de that serializ
17650 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74  es values for st
17660 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a  orage in SQLite.
17670 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65  ** data and inde
17680 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20  x records. Each 
17690 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65  serialized value
176a0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a   consists of a.*
176b0 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20  * 'serial-type' 
176c0 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61  and a blob of da
176d0 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74  ta. The serial t
176e0 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65  ype is an 8-byte
176f0 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74   unsigned.** int
17700 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20  eger, stored as 
17710 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  a varint..**.** 
17720 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64  In an SQLite ind
17730 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73  ex record, the s
17740 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74  erial type is st
17750 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65  ored directly be
17760 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62  fore.** the blob
17770 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74   of data that it
17780 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e   corresponds to.
17790 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f   In a table reco
177a0 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a  rd, all serial.*
177b0 2a 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72  * types are stor
177c0 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
177d0 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61  of the record, a
177e0 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20  nd the blobs of 
177f0 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65  data at.** the e
17800 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20  nd. Hence these 
17810 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20  functions allow 
17820 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61  the caller to ha
17830 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69  ndle the.** seri
17840 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61  al-type and data
17850 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79   blob separately
17860 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ..**.** The foll
17870 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
17880 72 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75  ribes the variou
17890 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65  s storage classe
178a0 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a  s for data:.**.*
178b0 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20  *   serial type 
178c0 20 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20         bytes of 
178d0 64 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a  data      type.*
178e0 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *   ------------
178f0 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
17900 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d  ------    ------
17910 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20  ---------.**    
17920 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
17930 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17940 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20       NULL.**    
17950 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
17960 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
17970 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17980 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20  ger.**      2   
17990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179a0 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73    2            s
179b0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
179c0 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
179d0 20 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20              3   
179e0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
179f0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17a00 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4               
17a10 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
17a20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17a30 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20  r.**      5     
17a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a50 36 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  6            sig
17a60 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17a70 20 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20      6           
17a80 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20            8     
17a90 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17aa0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20  teger.**      7 
17ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ac0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17ad0 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20   IEEE float.**  
17ae0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
17af0 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17b00 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
17b10 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20  onstant 0.**    
17b20 20 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20    9             
17b30 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17b40 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
17b50 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31  stant 1.**     1
17b60 30 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20  0,11            
17b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b80 20 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20     reserved for 
17b90 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20  expansion.**    
17ba0 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20  N>=12 and even  
17bb0 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20       (N-12)/2   
17bc0 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20       BLOB.**    
17bd0 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20  N>=13 and odd   
17be0 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20       (N-13)/2   
17bf0 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20       text.**.** 
17c00 54 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65  The 8 and 9 type
17c10 73 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20  s were added in 
17c20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d  3.3.0, file form
17c30 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72  at 4.  Prior ver
17c40 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69  sions.** of SQLi
17c50 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65  te will not unde
17c60 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72  rstand those ser
17c70 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f  ial types..*/../
17c80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17c90 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20  serial-type for 
17ca0 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  the value stored
17cb0 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32   in pMem..*/.u32
17cc0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17cd0 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d  alType(Mem *pMem
17ce0 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61  , int file_forma
17cf0 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20  t, u32 *pLen){. 
17d00 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65   int flags = pMe
17d10 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20  m->flags;.  u32 
17d20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c  n;..  assert( pL
17d30 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66  en!=0 );.  if( f
17d40 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b  lags&MEM_Null ){
17d50 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a  .    *pLen = 0;.
17d60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
17d70 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
17d80 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20  M_Int ){.    /* 
17d90 46 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68  Figure out wheth
17da0 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20  er to use 1, 2, 
17db0 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e  4, 6 or 8 bytes.
17dc0 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d   */.#   define M
17dd0 41 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34  AX_6BYTE ((((i64
17de0 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32  )0x00008000)<<32
17df0 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d  )-1).    i64 i =
17e00 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20   pMem->u.i;.    
17e10 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69  u64 u;.    if( i
17e20 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20  <0 ){.      u = 
17e30 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ~i;.    }else{. 
17e40 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20       u = i;.    
17e50 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37  }.    if( u<=127
17e60 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69   ){.      if( (i
17e70 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66  &1)==i && file_f
17e80 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20  ormat>=4 ){.    
17e90 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
17ea0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b         return 8+
17eb0 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65  (u32)u;.      }e
17ec0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c  lse{.        *pL
17ed0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
17ee0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
17ef0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
17f00 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65  u<=32767 ){ *pLe
17f10 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b  n = 2; return 2;
17f20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33   }.    if( u<=83
17f30 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  88607 ){ *pLen =
17f40 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a   3; return 3; }.
17f50 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34      if( u<=21474
17f60 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d  83647 ){ *pLen =
17f70 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a   4; return 4; }.
17f80 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36      if( u<=MAX_6
17f90 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  BYTE ){ *pLen = 
17fa0 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20  6; return 5; }. 
17fb0 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
17fc0 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a    return 6;.  }.
17fd0 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
17fe0 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Real ){.    *pLe
17ff0 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72  n = 8;.    retur
18000 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
18010 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
18020 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
18030 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
18040 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
18050 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
18060 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
18070 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
18080 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
18090 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
180a0 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c  nZero;.  }.  *pL
180b0 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e  en = n;.  return
180c0 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28   ((n*2) + 12 + (
180d0 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21  (flags&MEM_Str)!
180e0 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  =0));.}../*.** T
180f0 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72  he sizes for ser
18100 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74  ial types less t
18110 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69  han 128.*/.stati
18120 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74  c const u8 sqlit
18130 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
18140 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f  [] = {.        /
18150 2a 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33  *  0   1   2   3
18160 20 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37     4   5   6   7
18170 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f     8   9 */   ./
18180 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31  *   0 */   0,  1
18190 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36  ,  2,  3,  4,  6
181a0 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30  ,  8,  8,  0,  0
181b0 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c  ,./*  10 */   0,
181c0 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c    0,  0,  0,  1,
181d0 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c    1,  2,  2,  3,
181e0 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20    3,./*  20 */  
181f0 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20   4,  4,  5,  5, 
18200 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20   6,  6,  7,  7, 
18210 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a   8,  8,./*  30 *
18220 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31  /   9,  9, 10, 1
18230 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31  0, 11, 11, 12, 1
18240 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34  2, 13, 13,./*  4
18250 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35  0 */  14, 14, 15
18260 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37  , 15, 16, 16, 17
18270 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a  , 17, 18, 18,./*
18280 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c    50 */  19, 19,
18290 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c   20, 20, 21, 21,
182a0 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c   22, 22, 23, 23,
182b0 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20  ./*  60 */  24, 
182c0 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20  24, 25, 25, 26, 
182d0 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20  26, 27, 27, 28, 
182e0 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32  28,./*  70 */  2
182f0 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33  9, 29, 30, 30, 3
18300 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33  1, 31, 32, 32, 3
18310 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f  3, 33,./*  80 */
18320 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35    34, 34, 35, 35
18330 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37  , 36, 36, 37, 37
18340 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30  , 38, 38,./*  90
18350 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c   */  39, 39, 40,
18360 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c   40, 41, 41, 42,
18370 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20   42, 43, 43,./* 
18380 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20  100 */  44, 44, 
18390 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20  45, 45, 46, 46, 
183a0 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a  47, 47, 48, 48,.
183b0 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34  /* 110 */  49, 4
183c0 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35  9, 50, 50, 51, 5
183d0 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35  1, 52, 52, 53, 5
183e0 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34  3,./* 120 */  54
183f0 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36  , 54, 55, 55, 56
18400 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a  , 56, 57, 57.};.
18410 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
18420 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  e length of the 
18430 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69  data correspondi
18440 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69  ng to the suppli
18450 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a  ed serial-type..
18460 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  */.u32 sqlite3Vd
18470 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
18480 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
18490 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  {.  if( serial_t
184a0 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20  ype>=128 ){.    
184b0 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
184c0 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c  ype-12)/2;.  }el
184d0 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
184e0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a  serial_type<12 .
184f0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
18500 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
18510 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65  izes[serial_type
18520 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ]==(serial_type 
18530 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72  - 12)/2 );.    r
18540 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61  eturn sqlite3Sma
18550 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
18560 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a  al_type];.  }.}.
18570 75 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e  u8 sqlite3VdbeOn
18580 65 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c  eByteSerialTypeL
18590 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70  en(u8 serial_typ
185a0 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65  e){.  assert( se
185b0 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b  rial_type<128 );
185c0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
185d0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
185e0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a  serial_type];  .
185f0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61  }../*.** If we a
18600 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65  re on an archite
18610 63 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64  cture with mixed
18620 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67  -endian floating
18630 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a   .** points (ex:
18640 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70   ARM7) then swap
18650 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74   the lower 4 byt
18660 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20  es with the .** 
18670 75 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20  upper 4 bytes.  
18680 52 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  Return the resul
18690 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73  t..**.** For mos
186a0 74 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c  t architectures,
186b0 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   this is a no-op
186c0 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a  ..**.** (later):
186d0 20 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64    It is reported
186e0 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20   to me that the 
186f0 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f  mixed-endian pro
18700 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20  blem.** on ARM7 
18710 69 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68  is an issue with
18720 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74   GCC, not with t
18730 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49  he ARM7 chip.  I
18740 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20  t seems.** that 
18750 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f  early versions o
18760 66 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65  f GCC stored the
18770 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20   two words of a 
18780 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20  64-bit.** float 
18790 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64  in the wrong ord
187a0 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72  er.  And that er
187b0 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f  ror has been pro
187c0 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20  pagated.** ever 
187d0 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d  since.  The blam
187e0 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
187f0 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74  rily with GCC, t
18800 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69  hough..** GCC mi
18810 67 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f  ght have just co
18820 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65  pying the proble
18830 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63  m from a prior c
18840 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d  ompiler..** I am
18850 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20   also told that 
18860 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  newer versions o
18870 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f  f GCC that follo
18880 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  w a different.**
18890 20 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74   ABI get the byt
188a0 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a  e order right..*
188b0 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20  *.** Developers 
188c0 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20  using SQLite on 
188d0 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63  an ARM7 should c
188e0 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74  ompile and run t
188f0 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74  heir.** applicat
18900 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ion using -DSQLI
18910 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65  TE_DEBUG=1 at le
18920 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20  ast once.  With 
18930 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64  DEBUG.** enabled
18940 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62  , some asserts b
18950 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65  elow will ensure
18960 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f   that the byte o
18970 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74  rder of.** float
18980 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
18990 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a   is correct..**.
189a0 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20  ** (2007-08-30) 
189b0 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20   Frank van Vugt 
189c0 68 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73  has studied this
189d0 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79   problem closely
189e0 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64  .** and has send
189f0 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f   his findings to
18a00 20 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65   the SQLite deve
18a10 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a  lopers.  Frank.*
18a20 2a 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f  * writes that so
18a30 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73  me Linux kernels
18a40 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20   offer floating 
18a50 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a  point hardware.*
18a60 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74  * emulation that
18a70 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69   uses only 32-bi
18a80 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74  t mantissas inst
18a90 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a  ead of a full .*
18aa0 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71  * 48-bits as req
18ab0 75 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45  uired by the IEE
18ac0 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68  E standard.  (Th
18ad0 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e  is is the.** CON
18ae0 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20  FIG_FPE_FASTFPE 
18af0 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63  option.)  On suc
18b00 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74  h systems, float
18b10 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74  ing point.** byt
18b20 65 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d  e swapping becom
18b30 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61  es very complica
18b40 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70  ted.  To avoid p
18b50 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20  roblems,.** the 
18b60 6e 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73  necessary byte s
18b70 77 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69  wapping is carri
18b80 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36  ed out using a 6
18b90 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a  4-bit integer.**
18ba0 20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36   rather than a 6
18bb0 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72  4-bit float.  Fr
18bc0 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74  ank assures us t
18bd0 68 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72  hat the code her
18be0 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68  e.** works for h
18bf0 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76  im.  We, the dev
18c00 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f  elopers, have no
18c10 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64   way to independ
18c20 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20  ently.** verify 
18c30 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20  this, but Frank 
18c40 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68  seems to know wh
18c50 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67  at he is talking
18c60 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20   about.** so we 
18c70 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69  trust him..*/.#i
18c80 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  fdef SQLITE_MIXE
18c90 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
18ca0 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20  LOAT.static u64 
18cb0 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e  floatSwap(u64 in
18cc0 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20  ){.  union {.   
18cd0 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20   u64 r;.    u32 
18ce0 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75  i[2];.  } u;.  u
18cf0 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69  32 t;..  u.r = i
18d00 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b  n;.  t = u.i[0];
18d10 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b  .  u.i[0] = u.i[
18d20 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74  1];.  u.i[1] = t
18d30 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a  ;.  return u.r;.
18d40 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  }.# define swapM
18d50 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
18d60 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61  X)  X = floatSwa
18d70 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  p(X).#else.# def
18d80 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64  ine swapMixedEnd
18d90 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64  ianFloat(X).#end
18da0 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  if../*.** Write 
18db0 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64  the serialized d
18dc0 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65  ata blob for the
18dd0 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e   value stored in
18de0 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62   pMem into .** b
18df0 75 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65  uf. It is assume
18e00 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
18e10 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20  r has allocated 
18e20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
18e30 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
18e40 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18e50 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e  written..**.** n
18e60 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  Buf is the amoun
18e70 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20  t of space left 
18e80 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63  in buf[].  The c
18e90 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
18ea0 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f  ible.** for allo
18eb0 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70  cating enough sp
18ec0 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20  ace to buf[] to 
18ed0 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20  hold the entire 
18ee0 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65  field, exclusive
18ef0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d  .** of the pMem-
18f00 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66  >u.nZero bytes f
18f10 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61  or a MEM_Zero va
18f20 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
18f30 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18f40 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77  bytes actually w
18f50 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b  ritten into buf[
18f60 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a  ].  The number.*
18f70 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68  * of bytes in th
18f80 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61  e zero-filled ta
18f90 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69  il is included i
18fa0 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  n the return val
18fb0 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68  ue only.** if th
18fc0 6f 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a  ose bytes were z
18fd0 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a  eroed in buf[]..
18fe0 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56  */ .u32 sqlite3V
18ff0 64 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20  dbeSerialPut(u8 
19000 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c  *buf, Mem *pMem,
19010 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
19020 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20  ){.  u32 len;.. 
19030 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20   /* Integer and 
19040 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65  Real */.  if( se
19050 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20  rial_type<=7 && 
19060 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b  serial_type>0 ){
19070 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20  .    u64 v;.    
19080 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73  u32 i;.    if( s
19090 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b  erial_type==7 ){
190a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
190b0 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66  izeof(v)==sizeof
190c0 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20  (pMem->u.r) );. 
190d0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20       memcpy(&v, 
190e0 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65  &pMem->u.r, size
190f0 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77  of(v));.      sw
19100 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
19110 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65  at(v);.    }else
19120 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d  {.      v = pMem
19130 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20  ->u.i;.    }.   
19140 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74   len = i = sqlit
19150 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73  e3SmallTypeSizes
19160 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20  [serial_type];. 
19170 20 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29     assert( i>0 )
19180 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
19190 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28  buf[--i] = (u8)(
191a0 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76  v&0xFF);.      v
191b0 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69   >>= 8;.    }whi
191c0 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74  le( i );.    ret
191d0 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
191e0 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f  /* String or blo
191f0 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61  b */.  if( seria
19200 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
19210 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
19220 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67  n + ((pMem->flag
19230 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d  s & MEM_Zero)?pM
19240 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20  em->u.nZero:0). 
19250 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28              == (
19260 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53  int)sqlite3VdbeS
19270 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
19280 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20  ial_type) );.   
19290 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a   len = pMem->n;.
192a0 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20      if( len>0 ) 
192b0 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d  memcpy(buf, pMem
192c0 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72  ->z, len);.    r
192d0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
192e0 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e    /* NULL or con
192f0 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f  stants 0 or 1 */
19300 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
19310 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20  /* Input "x" is 
19320 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e  a sequence of un
19330 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72  signed character
19340 73 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74  s that represent
19350 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e   a.** big-endian
19360 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72   integer.  Retur
19370 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  n the equivalent
19380 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a   native integer.
19390 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42  */.#define ONE_B
193a0 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28  YTE_INT(x)    ((
193b0 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69  i8)(x)[0]).#defi
193c0 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  ne TWO_BYTE_INT(
193d0 78 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28  x)    (256*(i8)(
193e0 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a  (x)[0])|(x)[1]).
193f0 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59  #define THREE_BY
19400 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33  TE_INT(x)  (6553
19410 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
19420 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32  (x)[1]<<8)|(x)[2
19430 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f  ]).#define FOUR_
19440 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28  BYTE_UINT(x)  ((
19450 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29  (u32)(x)[0]<<24)
19460 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
19470 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
19480 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
19490 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37  YTE_INT(x) (1677
194a0 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  7216*(i8)((x)[0]
194b0 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28  )|((x)[1]<<16)|(
194c0 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33  (x)[2]<<8)|(x)[3
194d0 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69  ])../*.** Deseri
194e0 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62  alize the data b
194f0 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  lob pointed to b
19500 79 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20  y buf as serial 
19510 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65  type serial_type
19520 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68  .** and store th
19530 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d  e result in pMem
19540 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
19550 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65  mber of bytes re
19560 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ad..**.** This f
19570 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65  unction is imple
19580 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65  mented as two se
19590 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20  parate routines 
195a0 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  for performance.
195b0 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65  .** The few case
195c0 73 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c  s that require l
195d0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
195e0 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e  re broken out in
195f0 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a  to a separate.**
19600 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74   routine so that
19610 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74   in most cases t
19620 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d  he overhead of m
19630 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20  oving the stack 
19640 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76  pointer.** is av
19650 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69  oided..*/ .stati
19660 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49  c u32 SQLITE_NOI
19670 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28  NLINE serialGet(
19680 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
19690 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20  d char *buf,    
196a0 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65   /* Buffer to de
196b0 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a  serialize from *
196c0 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74  /.  u32 serial_t
196d0 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
196e0 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
196f0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19700 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20  */.  Mem *pMem  
19710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19720 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
19730 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65  l to write value
19740 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36   into */.){.  u6
19750 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  4 x = FOUR_BYTE_
19760 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32  UINT(buf);.  u32
19770 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   y = FOUR_BYTE_U
19780 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20  INT(buf+4);.  x 
19790 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20  = (x<<32) + y;. 
197a0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
197b0 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56  ==6 ){.    /* EV
197c0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38  IDENCE-OF: R-298
197d0 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69  51-52272 Value i
197e0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36  s a big-endian 6
197f0 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f  4-bit.    ** two
19800 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
19810 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65  eger. */.    pMe
19820 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29  m->u.i = *(i64*)
19830 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  &x;.    pMem->fl
19840 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19850 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19860 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65  m->u.i<0 );.  }e
19870 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  lse{.    /* EVID
19880 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33  ENCE-OF: R-57343
19890 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20  -49114 Value is 
198a0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45  a big-endian IEE
198b0 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69  E 754-2008 64-bi
198c0 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e  t.    ** floatin
198d0 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20  g point number. 
198e0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
198f0 4e 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69  NDEBUG) && !defi
19900 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
19910 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
19920 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
19930 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20  at integers and 
19940 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19950 61 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61  alues use the sa
19960 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f  me.    ** byte o
19970 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20  rder.  Or, that 
19980 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  if SQLITE_MIXED_
19990 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
199a0 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66  AT is.    ** def
199b0 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74  ined that 64-bit
199c0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
199d0 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72  values really ar
199e0 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65  e mixed.    ** e
199f0 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ndian..    */.  
19a00 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
19a10 36 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78  64 t1 = ((u64)0x
19a20 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20  3ff00000)<<32;. 
19a30 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
19a40 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b  double r1 = 1.0;
19a50 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31  .    u64 t2 = t1
19a60 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
19a70 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a  ndianFloat(t2);.
19a80 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19a90 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74  of(r1)==sizeof(t
19aa0 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31  2) && memcmp(&r1
19ab0 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31  , &t2, sizeof(r1
19ac0 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ))==0 );.#endif.
19ad0 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
19ae0 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65  of(x)==8 && size
19af0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38  of(pMem->u.r)==8
19b00 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65   );.    swapMixe
19b10 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b  dEndianFloat(x);
19b20 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65  .    memcpy(&pMe
19b30 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65  m->u.r, &x, size
19b40 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d  of(x));.    pMem
19b50 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  ->flags = sqlite
19b60 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72  3IsNaN(pMem->u.r
19b70 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d  ) ? MEM_Null : M
19b80 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72  EM_Real;.  }.  r
19b90 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73  eturn 8;.}.u32 s
19ba0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
19bb0 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Get(.  const uns
19bc0 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c  igned char *buf,
19bd0 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74       /* Buffer t
19be0 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72  o deserialize fr
19bf0 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69  om */.  u32 seri
19c00 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20  al_type,        
19c10 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
19c20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c  type to deserial
19c30 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d  ize */.  Mem *pM
19c40 65 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  em              
19c50 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
19c60 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76   cell to write v
19c70 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a  alue into */.){.
19c80 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c    switch( serial
19c90 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73  _type ){.    cas
19ca0 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72  e 10:   /* Reser
19cb0 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75  ved for future u
19cc0 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31  se */.    case 1
19cd0 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  1:   /* Reserved
19ce0 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
19cf0 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b  */.    case 0: {
19d00 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20    /* Null */.   
19d10 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19d20 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35  F: R-24078-09375
19d30 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c   Value is a NULL
19d40 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19d50 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
19d60 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  l;.      break;.
19d70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31      }.    case 1
19d80 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49  : {.      /* EVI
19d90 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38  DENCE-OF: R-4488
19da0 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73  5-25196 Value is
19db0 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63   an 8-bit twos-c
19dc0 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20  omplement.      
19dd0 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  ** integer. */. 
19de0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
19df0 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75   ONE_BYTE_INT(bu
19e00 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
19e10 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19e20 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
19e30 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
19e40 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
19e50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32      }.    case 2
19e60 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69  : { /* 2-byte si
19e70 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
19e80 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19e90 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35  E-OF: R-49794-35
19ea0 30 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62  026 Value is a b
19eb0 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74  ig-endian 16-bit
19ec0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
19ed0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
19ee0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
19ef0 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45  ->u.i = TWO_BYTE
19f00 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
19f10 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19f20 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
19f30 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
19f40 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
19f50 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 2;.    }.   
19f60 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
19f70 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
19f80 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
19f90 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
19fa0 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65  7839-54301 Value
19fb0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19fc0 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   24-bit.      **
19fd0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19fe0 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19ff0 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
1a000 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75  HREE_BYTE_INT(bu
1a010 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a020 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a030 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a040 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a050 20 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a        return 3;.
1a060 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1a070 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1a080 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a090 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a0a0 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36  E-OF: R-01849-26
1a0b0 30 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62  079 Value is a b
1a0c0 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74  ig-endian 32-bit
1a0d0 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  .      ** twos-c
1a0e0 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
1a0f0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
1a100 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54  ->u.i = FOUR_BYT
1a110 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64  E_INT(buf);.#ifd
1a120 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20  ef __HP_cc .    
1a130 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64    /* Work around
1a140 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f   a sign-extensio
1a150 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20  n bug in the HP 
1a160 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f  compiler for HP/
1a170 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  UX */.      if( 
1a180 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d  buf[0]&0x80 ) pM
1a190 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66  em->u.i |= 0xfff
1a1a0 66 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b  fffff80000000LL;
1a1b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d  .#endif.      pM
1a1c0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a1d0 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a1e0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a1f0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a200 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   4;.    }.    ca
1a210 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1a220 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a230 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
1a240 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38  DENCE-OF: R-5038
1a250 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73  5-09674 Value is
1a260 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38   a big-endian 48
1a270 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
1a280 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
1a290 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
1a2a0 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52  pMem->u.i = FOUR
1a2b0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32  _BYTE_UINT(buf+2
1a2c0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1a2d0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1a2e0 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a2f0 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a300 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a310 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a320 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36  ;.      return 6
1a330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a340 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20   6:   /* 8-byte 
1a350 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a360 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20  /.    case 7: { 
1a370 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67  /* IEEE floating
1a380 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20   point */.      
1a390 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63  /* These use loc
1a3a0 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f  al variables, so
1a3b0 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65   do them in a se
1a3c0 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20  parate routine. 
1a3d0 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
1a3e0 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20   having to move 
1a3f0 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65  the frame pointe
1a400 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  r in the common 
1a410 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  case */.      re
1a420 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62  turn serialGet(b
1a430 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70  uf,serial_type,p
1a440 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Mem);.    }.    
1a450 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e  case 8:    /* In
1a460 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63  teger 0 */.    c
1a470 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74  ase 9: {  /* Int
1a480 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20  eger 1 */.      
1a490 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a4a0 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61  R-12976-22893 Va
1a4b0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
1a4c0 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f  er 0. */.      /
1a4d0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a4e0 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c  -18143-12121 Val
1a4f0 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1a500 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  r 1. */.      pM
1a510 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c  em->u.i = serial
1a520 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70  _type-8;.      p
1a530 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
1a540 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75  _Int;.      retu
1a550 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1a560 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
1a570 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a580 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56   R-14606-31564 V
1a590 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74  alue is a BLOB t
1a5a0 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20  hat is (N-12)/2 
1a5b0 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a  bytes in.      *
1a5c0 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20  * length..      
1a5d0 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
1a5e0 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61  R-28401-00140 Va
1a5f0 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20  lue is a string 
1a600 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f  in the text enco
1a610 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a  ding and.      *
1a620 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73  * (N-13)/2 bytes
1a630 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20   in length. */. 
1a640 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
1a650 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20  t u16 aFlag[] = 
1a660 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45  { MEM_Blob|MEM_E
1a670 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45  phem, MEM_Str|ME
1a680 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20  M_Ephem };.     
1a690 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72   pMem->z = (char
1a6a0 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d   *)buf;.      pM
1a6b0 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em->n = (serial_
1a6c0 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20  type-12)/2;.    
1a6d0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a6e0 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70  aFlag[serial_typ
1a6f0 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75  e&1];.      retu
1a700 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20  rn pMem->n;.    
1a710 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
1a720 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ;.}./*.** This r
1a730 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
1a740 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69  o allocate suffi
1a750 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20  cient space for 
1a760 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  an UnpackedRecor
1a770 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c  d.** structure l
1a780 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62  arge enough to b
1a790 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69  e used with sqli
1a7a0 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70  te3VdbeRecordUnp
1a7b0 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20  ack() if.** the 
1a7c0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
1a7d0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b  s a pointer to K
1a7e0 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  eyInfo structure
1a7f0 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a   pKeyInfo..**.**
1a800 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69   The space is ei
1a810 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75  ther allocated u
1a820 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61  sing sqlite3DbMa
1a830 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f  llocRaw() or fro
1a840 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20  m within.** the 
1a850 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72  unaligned buffer
1a860 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20   passed via the 
1a870 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64  second and third
1a880 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73   arguments (pres
1a890 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20  umably.** stack 
1a8a0 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66  space). If the f
1a8b0 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46  ormer, then *ppF
1a8c0 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20  ree is set to a 
1a8d0 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f  pointer that sho
1a8e0 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75  uld.** be eventu
1a8f0 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68  ally freed by th
1a900 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
1a910 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20  qlite3DbFree(). 
1a920 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61  Or, if the .** a
1a930 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20  llocation comes 
1a940 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f  from the pSpace/
1a950 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20  szSpace buffer, 
1a960 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74  *ppFree is set t
1a970 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65  o NULL.** before
1a980 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a   returning..**.*
1a990 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  * If an OOM erro
1a9a0 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69  r occurs, NULL i
1a9b0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55  s returned..*/.U
1a9c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73  npackedRecord *s
1a9d0 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55  qlite3VdbeAllocU
1a9e0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20  npackedRecord(. 
1a9f0 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e   KeyInfo *pKeyIn
1aa00 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fo,             
1aa10 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20   /* Description 
1aa20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f  of the record */
1aa30 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c  .  char *pSpace,
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa50 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20     /* Unaligned 
1aa60 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
1aa70 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65  */.  int szSpace
1aa80 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1aa90 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1aaa0 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65  pSpace[] in byte
1aab0 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70  s */.  char **pp
1aac0 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20  Free            
1aad0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43         /* OUT: C
1aae0 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65  aller should fre
1aaf0 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a  e this pointer *
1ab00 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52  /.){.  UnpackedR
1ab10 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20  ecord *p;       
1ab20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b         /* Unpack
1ab30 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74  ed record to ret
1ab40 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66  urn */.  int nOf
1ab50 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
1ab60 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72           /* Incr
1ab70 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20  ement pSpace by 
1ab80 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74  nOff to align it
1ab90 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b   */.  int nByte;
1aba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1abb0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1abc0 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65  of bytes require
1abd0 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f  d for *p */..  /
1abe0 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69  * We want to shi
1abf0 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70  ft the pointer p
1ac00 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68  Space up such th
1ac10 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20  at it is 8-byte 
1ac20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68  aligned..  ** Th
1ac30 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63  us, we need to c
1ac40 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65  alculate a value
1ac50 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20  , nOff, between 
1ac60 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66  0 and 7, to shif
1ac70 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20  t .  ** it by.  
1ac80 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72  If pSpace is alr
1ac90 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67  eady 8-byte alig
1aca0 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64  ned, nOff should
1acb0 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20   be zero..  */. 
1acc0 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51   nOff = (8 - (SQ
1acd0 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
1ace0 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20  pSpace) & 7)) & 
1acf0 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  7;.  nByte = ROU
1ad00 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63  ND8(sizeof(Unpac
1ad10 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69  kedRecord)) + si
1ad20 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49  zeof(Mem)*(pKeyI
1ad30 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a  nfo->nField+1);.
1ad40 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70    if( nByte>szSp
1ad50 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20  ace+nOff ){.    
1ad60 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63  p = (UnpackedRec
1ad70 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  ord *)sqlite3DbM
1ad80 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66  allocRaw(pKeyInf
1ad90 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20  o->db, nByte);. 
1ada0 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68     *ppFree = (ch
1adb0 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20  ar *)p;.    if( 
1adc0 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
1add0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20   }else{.    p = 
1ade0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a  (UnpackedRecord*
1adf0 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a  )&pSpace[nOff];.
1ae00 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b      *ppFree = 0;
1ae10 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20  .  }..  p->aMem 
1ae20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a  = (Mem*)&((char*
1ae30 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  )p)[ROUND8(sizeo
1ae40 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1ae50 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ))];.  assert( p
1ae60 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1ae70 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70  der!=0 );.  p->p
1ae80 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e  KeyInfo = pKeyIn
1ae90 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20  fo;.  p->nField 
1aea0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  = pKeyInfo->nFie
1aeb0 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e  ld + 1;.  return
1aec0 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
1aed0 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65  en the nKey-byte
1aee0 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72   encoding of a r
1aef0 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c  ecord in pKey[],
1af00 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a   populate the .*
1af10 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  * UnpackedRecord
1af20 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63   structure indic
1af30 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72  ated by the four
1af40 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  th argument with
1af50 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73   the.** contents
1af60 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20   of the decoded 
1af70 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64  record..*/ .void
1af80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1af90 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49  rdUnpack(.  KeyI
1afa0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20  nfo *pKeyInfo,  
1afb0 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f     /* Informatio
1afc0 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f  n about the reco
1afd0 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69  rd format */.  i
1afe0 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20  nt nKey,        
1aff0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1b000 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   the binary reco
1b010 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  rd */.  const vo
1b020 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f  id *pKey,      /
1b030 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63  * The binary rec
1b040 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  ord */.  Unpacke
1b050 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20  dRecord *p      
1b060 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73  /* Populate this
1b070 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72   structure befor
1b080 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a  e returning. */.
1b090 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  ){.  const unsig
1b0a0 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d  ned char *aKey =
1b0b0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1b0c0 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20   char *)pKey;.  
1b0d0 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64  int d; .  u32 id
1b0e0 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
1b0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b100 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f  set in aKey[] to
1b110 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
1b120 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20  u16 u;          
1b130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b140 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
1b150 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33   counter */.  u3
1b160 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a  2 szHdr;.  Mem *
1b170 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a  pMem = p->aMem;.
1b180 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63  .  p->default_rc
1b190 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1b1a0 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e  EIGHT_BYTE_ALIGN
1b1b0 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20  MENT(pMem) );.  
1b1c0 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1b1d0 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1b1e0 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75    d = szHdr;.  u
1b1f0 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69   = 0;.  while( i
1b200 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e  dx<szHdr && d<=n
1b210 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73  Key ){.    u32 s
1b220 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20  erial_type;..   
1b230 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e   idx += getVarin
1b240 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20  t32(&aKey[idx], 
1b250 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1b260 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b    pMem->enc = pK
1b270 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1b280 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79   pMem->db = pKey
1b290 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a  Info->db;.    /*
1b2a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30   pMem->flags = 0
1b2b0 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65  ; // sqlite3Vdbe
1b2c0 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c  SerialGet() will
1b2d0 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73   set this for us
1b2e0 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a   */.    pMem->sz
1b2f0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  Malloc = 0;.    
1b300 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1b310 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1b320 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1b330 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1b340 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1b350 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1b360 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1b370 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1b380 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
1b390 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1b3a0 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
1b3b0 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1b3c0 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1b3d0 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1b3e0 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1b3f0 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1b400 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1b410 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1b420 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1b430 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1b440 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1b450 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b460 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1b470 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1b480 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1b490 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b4a0 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1b4b0 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1b4c0 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1b4d0 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1b4e0 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1b4f0 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1b500 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1b510 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b520 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1b530 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1b540 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1b550 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1b560 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1b570 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1b580 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1b590 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1b5a0 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1b5b0 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1b5c0 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1b5d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1b5e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1b5f0 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1b600 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1b610 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1b620 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1b630 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1b640 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1b650 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1b660 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1b670 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1b680 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1b690 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1b6a0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1b6b0 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1b6c0 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1b6d0 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1b6e0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b6f0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b700 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1b710 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1b720 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1b730 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1b740 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1b750 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1b760 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1b770 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1b780 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1b790 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1b7a0 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1b7b0 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1b7c0 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1b7d0 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b7e0 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1b7f0 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1b800 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1b810 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b820 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1b830 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1b840 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1b850 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1b860 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1b870 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b880 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1b890 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1b8a0 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1b8b0 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1b8c0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1b8d0 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1b8e0 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1b8f0 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1b900 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1b910 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1b920 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1b930 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1b940 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1b950 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1b960 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1b970 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1b980 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1b990 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1b9a0 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1b9b0 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1b9c0 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1b9d0 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1b9e0 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1b9f0 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1ba00 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1ba10 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1ba20 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1ba30 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1ba40 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1ba50 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1ba60 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1ba70 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1ba80 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1ba90 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1baa0 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1bab0 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1bac0 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1bad0 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1bae0 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1baf0 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1bb00 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1bb10 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1bb20 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1bb30 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1bb40 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bb50 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1bb60 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1bb70 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1bb80 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1bb90 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1bba0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1bbb0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bbc0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1bbd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1bbe0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1bbf0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1bc00 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1bc10 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1bc20 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1bc30 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1bc40 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1bc50 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1bc60 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1bc70 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1bc80 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1bc90 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1bca0 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1bcb0 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1bcc0 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1bcd0 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1bce0 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1bcf0 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1bd00 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1bd10 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1bd20 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1bd30 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bd40 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1bd50 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1bd60 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1bd70 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1bd80 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1bd90 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1bda0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1bdb0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1bdc0 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1bdd0 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1bde0 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1bdf0 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1be00 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1be10 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1be20 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1be30 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1be40 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1be50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1be60 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1be70 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1be80 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1be90 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1bea0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1beb0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1bec0 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1bed0 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1bee0 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1bef0 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1bf00 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1bf10 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1bf20 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1bf30 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1bf40 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1bf50 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1bf60 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1bf70 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1bf80 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1bf90 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1bfa0 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1bfb0 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1bfc0 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1bfd0 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1bfe0 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1bff0 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1c000 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1c010 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1c020 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1c030 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1c040 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1c050 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1c060 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1c070 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1c080 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1c090 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1c0a0 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1c0b0 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1c0c0 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1c0d0 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1c0e0 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1c0f0 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1c100 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c110 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1c120 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1c130 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c140 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c150 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1c160 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1c170 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1c180 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1c190 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1c1a0 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1c1b0 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1c1c0 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1c1d0 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1c1e0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1c1f0 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1c200 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1c210 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1c220 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c230 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1c240 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1c250 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1c260 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1c270 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1c280 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1c290 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c2a0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1c2b0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c2c0 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1c2d0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c2e0 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1c2f0 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1c300 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1c310 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1c320 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1c330 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1c340 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1c350 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1c360 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1c370 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1c380 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1c390 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1c3a0 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1c3b0 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1c3c0 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1c3d0 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1c3e0 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1c3f0 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1c400 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1c410 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1c420 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c430 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1c440 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1c450 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1c460 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1c470 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1c480 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1c490 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1c4a0 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1c4b0 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1c4c0 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1c4d0 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1c4e0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c4f0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c500 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c510 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1c520 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1c530 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1c540 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1c550 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1c560 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1c570 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1c580 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1c590 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1c5a0 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1c5b0 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1c5c0 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1c5d0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c5e0 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c5f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c600 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1c610 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1c620 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1c630 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1c640 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1c650 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1c660 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1c670 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1c680 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1c690 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1c6a0 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1c6b0 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1c6c0 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1c6d0 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1c6e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1c6f0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1c700 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1c710 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1c720 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c730 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1c740 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1c750 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1c760 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1c770 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1c780 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1c790 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1c7a0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c7b0 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1c7c0 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1c7d0 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1c7e0 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1c7f0 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1c800 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c810 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1c820 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1c830 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1c840 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1c850 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1c860 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1c870 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1c880 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1c890 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1c8a0 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1c8b0 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1c8c0 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1c8d0 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1c8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8f0 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1c900 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1c910 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1c920 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1c930 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1c940 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1c950 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1c960 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1c970 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1c980 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1c990 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1c9a0 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1c9b0 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1c9c0 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1c9d0 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1c9e0 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1c9f0 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1ca00 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1ca10 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1ca20 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1ca30 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1ca40 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1ca50 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1ca60 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1ca70 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1ca80 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ca90 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1caa0 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1cab0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cac0 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1cad0 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1cae0 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1caf0 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1cb00 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1cb10 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1cb20 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1cb30 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cb40 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1cb50 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1cb60 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1cb70 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1cb80 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1cb90 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1cba0 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1cbb0 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1cbc0 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1cbd0 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1cbe0 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1cbf0 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1cc00 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1cc10 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1cc20 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1cc30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1cc40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cc50 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
1cc60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cc70 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
1cc80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1cc90 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1cca0 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e  mpare two blobs.
1ccb0 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1ccc0 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1ccd0 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1cce0 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  t.** is less tha
1ccf0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1cd00 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1cd10 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74   second, respect
1cd20 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65  ively..** If one
1cd30 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69   blob is a prefi
1cd40 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
1cd50 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72  then the shorter
1cd60 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a   is the lessor..
1cd70 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1cd80 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1cd90 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1cda0 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1cdb0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1cdc0 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63  {.  int c = memc
1cdd0 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e  mp(pB1->z, pB2->
1cde0 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e  z, pB1->n>pB2->n
1cdf0 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d   ? pB2->n : pB1-
1ce00 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72  >n);.  if( c ) r
1ce10 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72  eturn c;.  retur
1ce20 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e  n pB1->n - pB2->
1ce30 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  n;.}../*.** Do a
1ce40 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
1ce50 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67  een a 64-bit sig
1ce60 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
1ce70 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  a 64-bit floatin
1ce80 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g-point.** numbe
1ce90 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  r.  Return negat
1cea0 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1ceb0 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1cec0 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73  rst (i64) is les
1ced0 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c  s than,.** equal
1cee0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1cef0 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  than the second 
1cf00 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  (double)..*/.sta
1cf10 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
1cf20 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69  ntFloatCompare(i
1cf30 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b  64 i, double r){
1cf40 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f  .  if( sizeof(LO
1cf50 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38  NGDOUBLE_TYPE)>8
1cf60 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   ){.    LONGDOUB
1cf70 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e  LE_TYPE x = (LON
1cf80 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a  GDOUBLE_TYPE)i;.
1cf90 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65      if( x<r ) re
1cfa0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1cfb0 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   x>r ) return +1
1cfc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1cfd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
1cfe0 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   y;.    double s
1cff0 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32  ;.    if( r<-922
1d000 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1d010 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .0 ) return +1;.
1d020 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37      if( r>922337
1d030 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20  2036854775807.0 
1d040 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d050 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20   y = (i64)r;.   
1d060 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72   if( i<y ) retur
1d070 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e  n -1;.    if( i>
1d080 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79  y ){.      if( y
1d090 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1d0a0 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75   && r>0.0 ) retu
1d0b0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1d0c0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  urn +1;.    }.  
1d0d0 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b    s = (double)i;
1d0e0 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72  .    if( s<r ) r
1d0f0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d100 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( s>r ) return +
1d110 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1d120 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1d130 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1d140 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1d150 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1d160 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1d170 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1d180 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1d190 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1d1a0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1d1b0 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1d1c0 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1d1d0 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1d1e0 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1d1f0 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1d200 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1d210 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1d220 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1d230 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1d240 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1d250 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1d260 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1d270 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1d280 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1d290 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1d2a0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1d2b0 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1d2c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1d2d0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1d2e0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1d2f0 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1d300 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1d310 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1d320 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1d330 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1d340 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1d350 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1d360 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1d370 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1d380 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63  f2;.  assert( (c
1d390 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20  ombined_flags & 
1d3a0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
1d3b0 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1d3c0 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1d3d0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1d3e0 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1d3f0 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1d400 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1d410 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1d420 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1d430 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
1d440 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
1d450 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
1d460 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c  ;.  }..  /* At l
1d470 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
1d480 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20  two values is a 
1d490 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66  number.  */.  if
1d4a0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1d4b0 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1d4c0 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  al) ){.    if( (
1d4d0 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1d4e0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1d4f0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1d500 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1d510 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1d520 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1d530 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1d540 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1d550 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1d560 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1d570 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1d580 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1d590 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r < pMem2->u.
1d5a0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1d5b0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1d5c0 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r > pMem2->u.r
1d5d0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d5e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d5f0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1d600 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1d610 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1d620 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1d630 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1d640 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1d650 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70  re(pMem1->u.i, p
1d660 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem2->u.r);.    
1d670 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d680 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d690 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d6a0 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1d6b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1d6c0 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f2&MEM_Int)!=0 
1d6d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1d6e0 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  n -sqlite3IntFlo
1d6f0 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d  atCompare(pMem2-
1d700 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72  >u.i, pMem1->u.r
1d710 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1d720 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1d730 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1d740 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .    return +1;.
1d750 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1d760 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1d770 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1d780 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1d790 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1d7a0 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1d7b0 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1d7c0 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1d7d0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1d7e0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1d7f0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1d800 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1d810 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1d820 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1d830 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1d840 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1d850 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1d860 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1d870 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1d880 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1d890 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d   || pMem1->db->m
1d8a0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1d8b0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1d8c0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1d8d0 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1d8e0 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1d8f0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1d900 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1d910 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1d920 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1d930 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1d940 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1d950 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1d960 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1d970 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1d980 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1d990 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1d9a0 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1d9b0 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1d9c0 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1d9d0 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1d9e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1d9f0 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1da00 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1da10 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1da20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1da30 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1da40 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1da50 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1da60 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1da70 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1da80 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1da90 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1daa0 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1dab0 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1dac0 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1dad0 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1dae0 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1daf0 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1db00 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1db10 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1db20 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1db30 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1db40 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1db50 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1db60 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1db70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1db80 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1db90 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1dba0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1dbb0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1dbc0 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1dbd0 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1dbe0 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1dbf0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1dc00 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1dc10 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1dc20 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1dc30 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1dc40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1dc50 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1dc60 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1dc70 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1dc80 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1dc90 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1dca0 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1dcb0 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1dcc0 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1dcd0 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1dce0 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1dcf0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1dd00 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1dd10 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1dd20 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1dd30 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1dd40 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1dd50 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1dd60 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1dd70 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1dd80 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1dd90 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1dda0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1ddb0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1ddc0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1ddd0 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1dde0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1ddf0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1de00 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1de10 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1de20 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1de30 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1de40 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1de50 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1de60 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1de70 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1de80 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1de90 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1dea0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1deb0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1dec0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1ded0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1dee0 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1def0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1df00 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1df10 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1df20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1df30 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1df40 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1df50 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1df60 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1df70 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1df80 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1df90 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1dfa0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1dfb0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1dfc0 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1dfd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1dfe0 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1dff0 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1e000 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1e010 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1e020 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1e030 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1e040 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1e050 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1e060 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1e070 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1e080 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1e090 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1e0a0 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1e0b0 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1e0c0 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1e0d0 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1e0e0 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1e0f0 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1e100 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1e110 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1e120 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1e130 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1e140 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1e150 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1e160 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1e170 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1e180 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1e190 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1e1a0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1e1b0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1e1c0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1e1d0 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1e1e0 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1e1f0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1e200 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1e210 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1e220 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1e230 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1e240 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1e250 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1e260 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1e270 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1e280 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1e290 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1e2a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1e2b0 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1e2c0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1e2d0 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1e2e0 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1e2f0 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1e300 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1e310 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1e320 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1e330 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1e340 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1e350 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1e360 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1e370 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1e380 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1e390 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1e3a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1e3b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e3c0 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1e3d0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1e3e0 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1e3f0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1e400 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1e410 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1e420 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1e430 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e450 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1e460 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1e470 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1e480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e490 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1e4a0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1e4b0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1e4c0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1e4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e4e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e4f0 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1e500 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1e510 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1e520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e530 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1e540 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1e550 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1e560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e570 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e580 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1e590 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1e5a0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e5c0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1e5d0 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1e5e0 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1e5f0 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1e600 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1e610 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1e620 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1e630 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1e640 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1e650 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1e660 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1e670 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1e680 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1e690 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1e6a0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1e6b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1e6c0 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1e6d0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1e6e0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1e6f0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1e700 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1e710 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1e720 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1e730 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1e740 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1e750 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1e760 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1e770 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1e780 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1e790 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1e7a0 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1e7b0 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1e7c0 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1e7d0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1e7e0 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1e7f0 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1e800 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1e810 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1e820 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1e830 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1e840 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1e850 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1e860 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1e870 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1e880 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1e890 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1e8a0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1e8b0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1e8c0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1e8d0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1e8e0 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1e8f0 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1e900 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1e910 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1e920 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1e930 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1e940 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1e950 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1e960 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1e970 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1e980 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1e990 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1e9a0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1e9b0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1e9c0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1e9d0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1e9e0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1e9f0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1ea00 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1ea10 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1ea20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1ea30 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1ea40 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1ea50 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1ea60 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1ea70 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1ea80 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1ea90 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1eaa0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1eab0 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =10 ){.        r
1eac0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1ead0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1eae0 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1eaf0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1eb00 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1eb10 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1eb20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1eb30 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1eb40 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1eb50 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1eb60 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33     rc = -sqlite3
1eb70 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1eb80 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e  pRhs->u.i, mem1.
1eb90 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1eba0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
1ebb0 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
1ebc0 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
1ebd0 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
1ebe0 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
1ebf0 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
1ec00 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1ec10 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1ec20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1ec30 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1ec40 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1ec50 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1ec60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ec70 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1ec80 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
1ec90 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1eca0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1ecb0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1ecc0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1ecd0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ece0 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
1ecf0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1ed00 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61  types 12 or grea
1ed10 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20  ter are strings 
1ed20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74  and blobs (great
1ed30 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20  er than.        
1ed40 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70  ** numbers). Typ
1ed50 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65  es 10 and 11 are
1ed60 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65   currently "rese
1ed70 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1ed80 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22  .        ** use"
1ed90 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1eda0 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68  really matter wh
1edb0 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  at the results o
1edc0 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20  f comparing.    
1edd0 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e      ** them to n
1ede0 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61  umberic values a
1edf0 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  re.  */.        
1ee00 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1ee10 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1ee20 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1ee30 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ee40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ee50 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1ee60 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1ee70 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1ee80 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1ee90 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1eea0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  7 ){.          i
1eeb0 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73  f( mem1.u.r<pRhs
1eec0 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1eed0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1eee0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1eef0 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d  ( mem1.u.r>pRhs-
1ef00 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1ef10 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1ef20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ef30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ef40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1ef50 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65  tFloatCompare(me
1ef60 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e  m1.u.i, pRhs->u.
1ef70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1ef80 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1ef90 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72   /* RHS is a str
1efa0 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ing */.    else 
1efb0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1efc0 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
1efd0 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1efe0 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1eff0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1f000 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f010 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f020 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f030 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ype<12 ){.      
1f040 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f050 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1f060 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1f070 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f080 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1f090 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e  {.        mem1.n
1f0a0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1f0b0 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1f0c0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f0d0 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67  +mem1.n)==(unsig
1f0e0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f0f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1f100 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75  d1+mem1.n+1)==(u
1f110 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1f120 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1f130 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69  +mem1.n) > (unsi
1f140 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1f150 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1f160 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1f170 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f180 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1f190 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f1a0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1f1b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1f1c0 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
1f1d0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
1f1e0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e           mem1.en
1f1f0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1f200 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  c;.          mem
1f210 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
1f220 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  >db;.          m
1f230 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em1.flags = MEM_
1f240 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  Str;.          m
1f250 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26  em1.z = (char*)&
1f260 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20  aKey1[d1];.     
1f270 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
1f280 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1f290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d                &m
1f2a0 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49  em1, pRhs, pKeyI
1f2b0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26  nfo->aColl[i], &
1f2c0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a  pPKey2->errCode.
1f2d0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1f2e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f2f0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1f300 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68   MIN(mem1.n, pRh
1f310 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1f320 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1f330 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1f340 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1f350 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1f360 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68  c = mem1.n - pRh
1f370 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d  s->n; .        }
1f380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f390 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f3a0 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65  blob */.    else
1f3b0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1f3c0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20   & MEM_Blob ){. 
1f3d0 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1f3e0 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1f3f0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1f400 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1f410 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1f420 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1f430 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72  _type<12 || (ser
1f440 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1f450 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f460 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1f470 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53  {.        int nS
1f480 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  tr = (serial_typ
1f490 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1f4a0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1f4b0 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67  d1+nStr)==(unsig
1f4c0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f4d0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1f4e0 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73  d1+nStr+1)==(uns
1f4f0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1f500 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e         if( (d1+n
1f510 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64  Str) > (unsigned
1f520 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20  )nKey1 ){.      
1f530 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43      pPKey2->errC
1f540 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45  ode = (u8)SQLITE
1f550 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1f560 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1f570 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1f580 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20    /* Corruption 
1f590 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  */.        }else
1f5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
1f5b0 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c  nCmp = MIN(nStr,
1f5c0 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20   pRhs->n);.     
1f5d0 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70       rc = memcmp
1f5e0 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68  (&aKey1[d1], pRh
1f5f0 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20  s->z, nCmp);.   
1f600 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30         if( rc==0
1f610 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70   ) rc = nStr - p
1f620 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20  Rhs->n;.        
1f630 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f640 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e  .    /* RHS is n
1f650 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b  ull */.    else{
1f660 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1f670 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1f680 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 65  ;.      rc = (se
1f690 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20  rial_type!=0);. 
1f6a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63     }..    if( rc
1f6b0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1f6c0 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1f6d0 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1f6e0 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20      rc = -rc;.  
1f6f0 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
1f700 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
1f710 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1f720 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1f730 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73   rc) );.      as
1f740 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1f750 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1f760 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1f770 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
1f780 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
1f790 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a  ++;.    pRhs++;.
1f7a0 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
1f7b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1f7c0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1f7d0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c  .    idx1 += sql
1f7e0 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65  ite3VarintLen(se
1f7f0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77  rial_type);.  }w
1f800 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69  hile( idx1<(unsi
1f810 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20 69  gned)szHdr1 && i
1f820 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
1f830 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64  && d1<=(unsigned
1f840 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20  )nKey1 );..  /* 
1f850 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  No memory alloca
1f860 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65  tion is ever use
1f870 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76  d on mem1.  Prov
1f880 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a  e this using.  *
1f890 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
1f8a0 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74 68  assert().  If th
1f8b0 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c 73  e assert() fails
1f8c0 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20 61  , it indicates a
1f8d0 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61  .  ** memory lea
1f8e0 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20  k and a need to 
1f8f0 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  call sqlite3Vdbe
1f900 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31  MemRelease(&mem1
1f910 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ).  */.  assert(
1f920 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
1f930 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30  0 );..  /* rc==0
1f940 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74   here means that
1f950 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20   one or both of 
1f960 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
1f970 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
1f980 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
1f990 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
1f9a0 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
1f9b0 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75  Return the defau
1f9c0 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
1f9d0 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1f9e0 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20  CORRUPT_DB .    
1f9f0 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64     || vdbeRecord
1fa00 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1fa10 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1fa20 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  2, pPKey2->defau
1fa30 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c  lt_rc) .       |
1fa40 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e  | pKeyInfo->db->
1fa50 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29  mallocFailed.  )
1fa60 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65  ;.  pPKey2->eqSe
1fa70 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  en = 1;.  return
1fa80 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1fa90 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  _rc;.}.int sqlit
1faa0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1fab0 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  are(.  int nKey1
1fac0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
1fad0 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b  ey1,   /* Left k
1fae0 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
1faf0 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
1fb00 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1fb10 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74   key */.){.  ret
1fb20 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1fb30 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
1fb40 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
1fb50 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d  1, pPKey2, 0);.}
1fb60 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  .../*.** This fu
1fb70 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
1fb80 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
1fb90 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
1fba0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
1fbb0 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
1fbc0 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
1fbd0 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65  ey2 is an intege
1fbe0 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a  r, and (b) the .
1fbf0 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  ** size-of-heade
1fc00 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65 20  r varint at the 
1fc10 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
1fc20 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
1fc30 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20   single.** byte 
1fc40 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68  (i.e. is less th
1fc50 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54  an 128)..**.** T
1fc60 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73  o avoid concerns
1fc70 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76   about buffer ov
1fc80 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f  erreads, this ro
1fc90 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73  utine is only us
1fca0 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73  ed.** on schemas
1fcb0 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d   where the maxim
1fcc0 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72 20  um valid header 
1fcd0 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65 73  size is 63 bytes
1fce0 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61   or less..*/.sta
1fcf0 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1fd00 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20  rdCompareInt(.  
1fd10 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1fd20 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1fd30 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1fd40 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1fd50 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20  PKey2        /* 
1fd60 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1fd70 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79    const u8 *aKey
1fd80 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29   = &((const u8*)
1fd90 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75  pKey1)[*(const u
1fda0 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d  8*)pKey1 & 0x3F]
1fdb0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
1fdc0 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38  ype = ((const u8
1fdd0 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69  *)pKey1)[1];.  i
1fde0 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b  nt res;.  u32 y;
1fdf0 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20  .  u64 x;.  i64 
1fe00 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d  v = pPKey2->aMem
1fe10 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c  [0].u.i;.  i64 l
1fe20 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72  hs;..  vdbeAsser
1fe30 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1fe40 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70  nLimits(nKey1, p
1fe50 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b  Key1, pPKey2->pK
1fe60 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72  eyInfo);.  asser
1fe70 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29  t( (*(u8*)pKey1)
1fe80 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50  <=0x3F || CORRUP
1fe90 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68  T_DB );.  switch
1fea0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
1feb0 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f  .    case 1: { /
1fec0 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 1-byte signed 
1fed0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1fee0 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f   lhs = ONE_BYTE_
1fef0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1ff00 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1ff10 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1ff20 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1ff30 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73  2: { /* 2-byte s
1ff40 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1ff50 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f  .      lhs = TWO
1ff60 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1ff70 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1ff80 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20   lhs<0 );.      
1ff90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
1ffa0 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d   case 3: { /* 3-
1ffb0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
1ffc0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73  ger */.      lhs
1ffd0 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e   = THREE_BYTE_IN
1ffe0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1fff0 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20000 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20010 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
20020 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
20030 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20040 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59       y = FOUR_BY
20050 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
20060 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29       lhs = (i64)
20070 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20  *(int*)&y;.     
20080 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
20090 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
200a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
200b0 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73  5: { /* 6-byte s
200c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
200d0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55  .      lhs = FOU
200e0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
200f0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
20100 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
20110 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
20120 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
20130 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20140 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
20150 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67   { /* 8-byte sig
20160 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
20170 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59       x = FOUR_BY
20180 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
20190 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
201a0 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
201b0 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
201c0 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78   lhs = *(i64*)&x
201d0 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
201e0 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
201f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20200 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20    case 8: .     
20210 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20   lhs = 0;.      
20220 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
20230 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31  9:.      lhs = 1
20240 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
20250 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65      /* This case
20260 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65   could be remove
20270 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69  d without changi
20280 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  ng the results o
20290 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a  f running.    **
202a0 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c   this code. Incl
202b0 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73 20  uding it causes 
202c0 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20  gcc to generate 
202d0 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68 20  a faster switch 
202e0 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  .    ** statemen
202f0 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e  t (since the ran
20300 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61 72  ge of switch tar
20310 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20  gets now starts 
20320 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20  at zero and.    
20330 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73  ** is contiguous
20340 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63  ) but does not c
20350 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61  ause any duplica
20360 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65  te code to be ge
20370 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28  nerated.    ** (
20380 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65 72  as gcc is clever
20390 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69   enough to combi
203a0 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20  ne the two like 
203b0 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20  cases). Other . 
203c0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20     ** compilers 
203d0 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72  might be similar
203e0 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20  .  */ .    case 
203f0 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20  0: case 7:.     
20400 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
20410 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20420 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20430 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66  PKey2);..    def
20440 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75  ault:.      retu
20450 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
20460 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
20470 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20480 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e  );.  }..  if( v>
20490 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
204a0 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d   pPKey2->r1;.  }
204b0 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29  else if( v<lhs )
204c0 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  {.    res = pPKe
204d0 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20  y2->r2;.  }else 
204e0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
204f0 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54  ld>1 ){.    /* T
20500 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
20510 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
20520 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61  are equal. Compa
20530 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20  re the trailing 
20540 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
20550 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71   */.    res = sq
20560 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20570 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e  ompareWithSkip(n
20580 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20590 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65  ey2, 1);.  }else
205a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72  {.    /* The fir
205b0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
205c0 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71   two keys are eq
205d0 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72  ual and there ar
205e0 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20  e no trailing.  
205f0 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74    ** fields. Ret
20600 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
20610 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63  ult_rc in this c
20620 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20  ase. */.    res 
20630 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
20640 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32  t_rc;.    pPKey2
20650 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
20660 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
20670 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
20680 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
20690 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29  , pPKey2, res) )
206a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a  ;.  return res;.
206b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
206c0 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74  nction is an opt
206d0 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f  imized version o
206e0 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  f sqlite3VdbeRec
206f0 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a  ordCompare() .**
20700 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66 69   that (a) the fi
20710 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b  rst field of pPK
20720 65 79 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c  ey2 is a string,
20730 20 74 68 61 74 20 28 62 29 20 74 68 65 20 66 69   that (b) the fi
20740 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65  rst field.** use
20750 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
20760 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20  sequence BINARY 
20770 61 6e 64 20 28 63 29 20 74 68 61 74 20 74 68 65  and (c) that the
20780 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
20790 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68  varint .** at th
207a0 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
207b0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
207c0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a   a single byte..
207d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
207e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
207f0 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65  tring(.  int nKe
20800 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
20810 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
20820 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
20830 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
20840 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
20850 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
20860 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f   u8 *aKey1 = (co
20870 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20  nst u8*)pKey1;. 
20880 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65   int serial_type
20890 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20  ;.  int res;..  
208a0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
208b0 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20  aMem[0].flags & 
208c0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62  MEM_Str );.  vdb
208d0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
208e0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b  tWithinLimits(nK
208f0 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
20900 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20  y2->pKeyInfo);. 
20910 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
20920 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74  ey1[1], serial_t
20930 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69  ype);.  if( seri
20940 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20  al_type<12 ){.  
20950 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20960 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r1;      /* (pKe
20970 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e  y1/nKey1) is a n
20980 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20  umber or a null 
20990 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21  */.  }else if( !
209a0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30  (serial_type & 0
209b0 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73  x01) ){ .    res
209c0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20   = pPKey2->r2;  
209d0 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b      /* (pKey1/nK
209e0 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a  ey1) is a blob *
209f0 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  /.  }else{.    i
20a00 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74  nt nCmp;.    int
20a10 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73   nStr;.    int s
20a20 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  zHdr = aKey1[0];
20a30 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65  ..    nStr = (se
20a40 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20  rial_type-12) / 
20a50 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64  2;.    if( (szHd
20a60 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79  r + nStr) > nKey
20a70 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79  1 ){.      pPKey
20a80 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
20a90 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
20aa0 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
20ab0 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72  rn 0;    /* Corr
20ac0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
20ad0 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20      nCmp = MIN( 
20ae0 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
20af0 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72  n, nStr );.    r
20b00 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65  es = memcmp(&aKe
20b10 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79  y1[szHdr], pPKey
20b20 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43  2->aMem[0].z, nC
20b30 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65  mp);..    if( re
20b40 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  s==0 ){.      re
20b50 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79  s = nStr - pPKey
20b60 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20  2->aMem[0].n;.  
20b70 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
20b80 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  {.        if( pP
20b90 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29  Key2->nField>1 )
20ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
20bb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
20bc0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
20bd0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
20be0 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20   pPKey2, 1);.   
20bf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
20c00 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
20c10 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
20c20 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
20c30 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20  ->eqSeen = 1;.  
20c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
20c50 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
20c60 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70  .        res = p
20c70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20  PKey2->r2;.     
20c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20c90 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
20ca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
20cb0 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b  lse if( res>0 ){
20cc0 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b  .      res = pPK
20cd0 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c  ey2->r2;.    }el
20ce0 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20  se{.      res = 
20cf0 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20  pPKey2->r1;.    
20d00 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  }.  }..  assert(
20d10 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20d20 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70  reDebug(nKey1, p
20d30 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65  Key1, pPKey2, re
20d40 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52  s).       || COR
20d50 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c  RUPT_DB.       |
20d60 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  | pPKey2->pKeyIn
20d70 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
20d80 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75  iled.  );.  retu
20d90 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn res;.}../*.**
20da0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
20db0 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56  r to an sqlite3V
20dc0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20dd0 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75  () compatible fu
20de0 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62  nction.** suitab
20df0 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67  le for comparing
20e00 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f   serialized reco
20e10 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63  rds to the unpac
20e20 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73 65  ked record passe
20e30 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79  d.** as the only
20e40 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65   argument..*/.Re
20e50 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69  cordCompare sqli
20e60 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61  te3VdbeFindCompa
20e70 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  re(UnpackedRecor
20e80 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69  d *p){.  /* vari
20e90 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  ntRecordCompareI
20ea0 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52  nt() and varintR
20eb0 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69  ecordCompareStri
20ec0 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65  ng() both assume
20ed0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73  .  ** that the s
20ee0 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20ef0 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73  rint that occurs
20f00 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20f10 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a   each record.  *
20f20 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67  * fits in a sing
20f30 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73  le byte (i.e. is
20f40 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76   127 or less). v
20f50 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
20f60 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73  reInt().  ** als
20f70 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69  o assumes that i
20f80 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65  t is safe to ove
20f90 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20 62  rread a buffer b
20fa0 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a  y at least the .
20fb0 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73    ** maximum pos
20fc0 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64  sible legal head
20fd0 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62  er size plus 8 b
20fe0 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74 68  ytes. Because th
20ff0 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72  ere is.  ** guar
21000 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74 20  anteed to be at 
21010 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f  least 74 (but no
21020 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66 20  t 136) bytes of 
21030 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e  padding followin
21040 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66  g each.  ** buff
21050 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61 72  er passed to var
21060 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
21070 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73  Int() this makes
21080 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74   it convenient t
21090 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65  o.  ** limit the
210a0 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61   size of the hea
210b0 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73 20  der to 64 bytes 
210c0 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20 74  in cases where t
210d0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20  he first field. 
210e0 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65   ** is an intege
210f0 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  r..  **.  ** The
21100 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
21110 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d  enforce this lim
21120 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65  it is to conside
21130 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77  r only records w
21140 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c  ith.  ** 13 fiel
21150 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74  ds or less. If t
21160 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 69  he first field i
21170 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68  s an integer, th
21180 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a  e maximum legal.
21190 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65    ** header size
211a0 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20   is (12*5 + 1 + 
211b0 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20  1) bytes.  */.  
211c0 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f  if( (p->pKeyInfo
211d0 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b  ->nField + p->pK
211e0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29  eyInfo->nXField)
211f0 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20  <=13 ){.    int 
21200 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b  flags = p->aMem[
21210 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66  0].flags;.    if
21220 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ( p->pKeyInfo->a
21230 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a  SortOrder[0] ){.
21240 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b        p->r1 = 1;
21250 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d  .      p->r2 = -
21260 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
21270 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a      p->r1 = -1;.
21280 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b        p->r2 = 1;
21290 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
212a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29  flags & MEM_Int)
212b0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
212c0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
212d0 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20  reInt;.    }.   
212e0 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
212f0 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20   & MEM_Real );. 
21300 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
21310 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b  gs & MEM_Null );
21320 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
21330 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
21340 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67  );.    if( (flag
21350 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45  s & (MEM_Real|ME
21360 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29  M_Null|MEM_Blob)
21370 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49  )==0 && p->pKeyI
21380 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30  nfo->aColl[0]==0
21390 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
213a0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ( flags & MEM_St
213b0 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r );.      retur
213c0 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
213d0 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d  areString;.    }
213e0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
213f0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
21400 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  Compare;.}../*.*
21410 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74  * pCur points at
21420 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20   an index entry 
21430 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
21440 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20  e OP_MakeRecord 
21450 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20  opcode..** Read 
21460 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c  the rowid (the l
21470 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65  ast field in the
21480 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f   record) and sto
21490 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e  re it in *rowid.
214a0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
214b0 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
214c0 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20  ng works, or an 
214d0 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72  error code other
214e0 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72  wise..**.** pCur
214f0 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69   might be pointi
21500 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69  ng to text obtai
21510 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75  ned from a corru
21520 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
21530 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74  ..** So the cont
21540 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  ent cannot be tr
21550 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f  usted.  Do appro
21560 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e  priate checks on
21570 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f   the content..*/
21580 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
21590 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33  IdxRowid(sqlite3
215a0 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a   *db, BtCursor *
215b0 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64  pCur, i64 *rowid
215c0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
215d0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
215e0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20  .  u32 szHdr;   
215f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
21600 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
21610 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20  u32 typeRowid;  
21620 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65    /* Serial type
21630 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f   of the rowid */
21640 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b  .  u32 lenRowid;
21650 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
21660 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d  the rowid */.  M
21670 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47  em m, v;..  /* G
21680 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  et the size of t
21690 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20  he index entry. 
216a0 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e   Only indices en
216b0 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20  tries of less.  
216c0 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72 65  ** than 2GiB are
216d0 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68   support - anyth
216e0 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62  ing large must b
216f0 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  e database corru
21700 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20  ption..  ** Any 
21710 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65  corruption is de
21720 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65  tected in sqlite
21730 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
21740 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f  tr(), though, so
21750 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20  .  ** this code 
21760 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d  can safely assum
21770 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20  e that nCellKey 
21780 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a  is 32-bits  .  *
21790 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
217a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49 73  te3BtreeCursorIs
217b0 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20  Valid(pCur) );. 
217c0 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20   VVA_ONLY(rc =) 
217d0 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53  sqlite3BtreeKeyS
217e0 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c  ize(pCur, &nCell
217f0 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Key);.  assert( 
21800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
21810 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20       /* pCur is 
21820 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
21830 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
21840 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ail */.  assert(
21850 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c   (nCellKey & SQL
21860 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75  ITE_MAX_U32)==(u
21870 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a  64)nCellKey );..
21880 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65    /* Read in the
21890 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
218a0 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  t of the index e
218b0 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ntry */.  sqlite
218c0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
218d0 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
218e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
218f0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
21900 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
21910 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
21920 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
21930 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  c;.  }..  /* The
21940 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73   index entry mus
21950 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20 68  t begin with a h
21960 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20  eader size */.  
21970 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33  (void)getVarint3
21980 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64  2((u8*)m.z, szHd
21990 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20  r);.  testcase( 
219a0 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65  szHdr==3 );.  te
219b0 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d  stcase( szHdr==m
219c0 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  .n );.  if( unli
219d0 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20  kely(szHdr<3 || 
219e0 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20  (int)szHdr>m.n) 
219f0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
21a00 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
21a10 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
21a20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68  last field of th
21a30 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62  e index should b
21a40 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74  e an integer - t
21a50 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56  he ROWID..  ** V
21a60 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6c  erify that the l
21a70 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79  ast entry really
21a80 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   is an integer. 
21a90 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
21aa0 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a  rint32((u8*)&m.z
21ab0 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52  [szHdr-1], typeR
21ac0 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73  owid);.  testcas
21ad0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20  e( typeRowid==1 
21ae0 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
21af0 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20  ypeRowid==2 );. 
21b00 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
21b10 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73  owid==3 );.  tes
21b20 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
21b30 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==4 );.  testcas
21b40 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20  e( typeRowid==5 
21b50 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
21b60 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20  ypeRowid==6 );. 
21b70 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
21b80 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73  owid==8 );.  tes
21b90 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
21ba0 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  ==9 );.  if( unl
21bb0 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c  ikely(typeRowid<
21bc0 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39  1 || typeRowid>9
21bd0 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37   || typeRowid==7
21be0 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21bf0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21c00 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77  on;.  }.  lenRow
21c10 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c  id = sqlite3Smal
21c20 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52  lTypeSizes[typeR
21c30 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73  owid];.  testcas
21c40 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48  e( (u32)m.n==szH
21c50 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20  dr+lenRowid );. 
21c60 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75   if( unlikely((u
21c70 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e  32)m.n<szHdr+len
21c80 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f  Rowid) ){.    go
21c90 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
21ca0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
21cb0 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74  /* Fetch the int
21cc0 65 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64  eger off the end
21cd0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65   of the index re
21ce0 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  cord */.  sqlite
21cf0 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28  3VdbeSerialGet((
21d00 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e  u8*)&m.z[m.n-len
21d10 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69  Rowid], typeRowi
21d20 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64  d, &v);.  *rowid
21d30 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69   = v.u.i;.  sqli
21d40 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
21d50 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
21d60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
21d70 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61   Jump here if da
21d80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
21d90 6e 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66  n is detected af
21da0 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20  ter m has been. 
21db0 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20   ** allocated.  
21dc0 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63  Free the m objec
21dd0 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  t and return SQL
21de0 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a  ITE_CORRUPT. */.
21df0 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
21e00 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65  tion:.  testcase
21e10 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20  ( m.szMalloc!=0 
21e20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
21e30 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
21e40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21e50 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a  CORRUPT_BKPT;.}.
21e60 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
21e70 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e  he key of the in
21e80 64 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63  dex entry that c
21e90 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e  ursor pC is poin
21ea0 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a  ting to against.
21eb0 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e  ** the key strin
21ec0 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  g in pUnpacked. 
21ed0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65   Write into *pRe
21ee0 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68  s a number.** th
21ef0 61 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  at is negative, 
21f00 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76  zero, or positiv
21f10 65 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20  e if pC is less 
21f20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a  than, equal to,.
21f30 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  ** or greater th
21f40 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52  an pUnpacked.  R
21f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
21f60 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a  on success..**.*
21f70 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65  * pUnpacked is e
21f80 69 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69  ither created wi
21f90 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72  thout a rowid or
21fa0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f   is truncated so
21fb0 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74   that it.** omit
21fc0 73 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74  s the rowid at t
21fd0 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77  he end.  The row
21fe0 69 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  id at the end of
21ff0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
22000 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61  .** is ignored a
22010 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20  s well.  Hence, 
22020 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c  this routine onl
22030 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70  y compares the p
22040 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74  refixes .** of t
22050 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f  he keys prior to
22060 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64   the final rowid
22070 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65  , not the entire
22080 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   key..*/.int sql
22090 69 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f  ite3VdbeIdxKeyCo
220a0 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33  mpare(.  sqlite3
220b0 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
220c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
220d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
220e0 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72   */.  VdbeCursor
220f0 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20   *pC,           
22100 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
22110 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20  rsor to compare 
22120 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70  against */.  Unp
22130 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e  ackedRecord *pUn
22140 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a  packed,       /*
22150 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f   Unpacked versio
22160 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  n of key */.  in
22170 74 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20  t *res          
22180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22190 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70  * Write the comp
221a0 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65  arison result he
221b0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e  re */.){.  i64 n
221c0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
221d0 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f  nt rc;.  BtCurso
221e0 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d  r *pCur;.  Mem m
221f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d  ;..  assert( pC-
22200 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
22210 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43  PE_BTREE );.  pC
22220 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72  ur = pC->uc.pCur
22230 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73  sor;.  assert( s
22240 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
22250 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
22260 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
22270 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
22280 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
22290 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
222a0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
222b0 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
222c0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
222d0 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
222e0 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
222f0 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
22300 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
22310 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
22320 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
22330 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
22340 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
22350 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
22360 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
22370 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
22380 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
22390 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
223a0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
223b0 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
223c0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
223d0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
223e0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
223f0 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
22400 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
22410 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
22420 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
22430 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
22440 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
22450 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20   rc;.  }.  *res 
22460 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
22470 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20  ordCompare(m.n, 
22480 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b  m.z, pUnpacked);
22490 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
224a0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
224b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
224c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
224d0 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
224e0 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74   value to be ret
224f0 75 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75  urned by subsequ
22500 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ent calls to.** 
22510 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
22520 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  ) on the databas
22530 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a  e handle 'db'. .
22540 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
22550 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71  dbeSetChanges(sq
22560 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
22570 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72  Change){.  asser
22580 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22590 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
225a0 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67   );.  db->nChang
225b0 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64  e = nChange;.  d
225c0 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20  b->nTotalChange 
225d0 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  += nChange;.}../
225e0 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20  *.** Set a flag 
225f0 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75  in the vdbe to u
22600 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
22610 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74   counter when it
22620 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a   is finalised.**
22630 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f   or reset..*/.vo
22640 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f  id sqlite3VdbeCo
22650 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20  untChanges(Vdbe 
22660 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65  *v){.  v->change
22670 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  CntOn = 1;.}../*
22680 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70  .** Mark every p
22690 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
226a0 74 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  t associated wit
226b0 68 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  h a database con
226c0 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78  nection.** as ex
226d0 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  pired..**.** An 
226e0 65 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e  expired statemen
226f0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63  t means that rec
22700 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68  ompilation of th
22710 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a  e statement is.*
22720 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74  * recommend.  St
22730 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20  atements expire 
22740 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70  when things happ
22750 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65  en that make the
22760 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f  ir.** programs o
22770 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69  bsolete.  Removi
22780 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20  ng user-defined 
22790 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c  functions or col
227a0 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
227b0 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67  ces, or changing
227c0 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f   an authorizatio
227d0 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74  n function are t
227e0 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74  he types of.** t
227f0 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20  hings that make 
22800 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
22810 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f  nts obsolete..*/
22820 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
22830 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
22840 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64  ments(sqlite3 *d
22850 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
22860 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64   for(p = db->pVd
22870 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  be; p; p=p->pNex
22880 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72  t){.    p->expir
22890 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ed = 1;.  }.}../
228a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
228b0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
228c0 74 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62  ted with the Vdb
228d0 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73  e..*/.sqlite3 *s
228e0 71 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62  qlite3VdbeDb(Vdb
228f0 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *v){.  return 
22900 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v->db;.}../*.** 
22910 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
22920 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76   to an sqlite3_v
22930 61 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63  alue structure c
22940 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61  ontaining the va
22950 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72  lue bound.** par
22960 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56  ameter iVar of V
22970 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20  M v. Except, if 
22980 74 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20  the value is an 
22990 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  SQL NULL, return
229a0 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20   .** 0 instead. 
229b0 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c  Unless it is NUL
229c0 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74  L, apply affinit
229d0 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68  y aff (one of th
229e0 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a  e SQLITE_AFF_*.*
229f0 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20  * constants) to 
22a00 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65  the value before
22a10 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a   returning it..*
22a20 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65  *.** The returne
22a30 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20  d value must be 
22a40 66 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c  freed by the cal
22a50 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ler using sqlite
22a60 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f  3ValueFree()..*/
22a70 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  .sqlite3_value *
22a80 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f  sqlite3VdbeGetBo
22a90 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76  undValue(Vdbe *v
22aa0 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61  , int iVar, u8 a
22ab0 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ff){.  assert( i
22ac0 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76  Var>0 );.  if( v
22ad0 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65   ){.    Mem *pMe
22ae0 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61  m = &v->aVar[iVa
22af0 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d  r-1];.    if( 0=
22b00 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  =(pMem->flags & 
22b10 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20  MEM_Null) ){.   
22b20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
22b30 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33   *pRet = sqlite3
22b40 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b  ValueNew(v->db);
22b50 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20  .      if( pRet 
22b60 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
22b70 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d  e3VdbeMemCopy((M
22b80 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29  em *)pRet, pMem)
22b90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22ba0 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e  3ValueApplyAffin
22bb0 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53  ity(pRet, aff, S
22bc0 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
22bd0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
22be0 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20  n pRet;.    }.  
22bf0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
22c00 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
22c10 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56   SQL variable iV
22c20 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69  ar so that bindi
22c30 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74  ng a new value t
22c40 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20  o it signals.** 
22c50 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74  to sqlite3_reopt
22c60 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d  imize() that re-
22c70 70 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74  preparing the st
22c80 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75  atement may resu
22c90 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65  lt.** in a bette
22ca0 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f  r query plan..*/
22cb0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
22cc0 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65  eSetVarmask(Vdbe
22cd0 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a   *v, int iVar){.
22ce0 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30    assert( iVar>0
22cf0 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33   );.  if( iVar>3
22d00 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d  2 ){.    v->expm
22d10 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66  ask = 0xffffffff
22d20 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76  ;.  }else{.    v
22d30 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75  ->expmask |= ((u
22d40 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29  32)1 << (iVar-1)
22d50 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65  );.  }.}..#ifnde
22d60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
22d70 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a  RTUALTABLE./*.**
22d80 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20   Transfer error 
22d90 6d 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f  message text fro
22da0 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61  m an sqlite3_vta
22db0 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20  b.zErrMsg (text 
22dc0 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d  stored.** in mem
22dd0 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
22de0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
22df0 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45  ) into a Vdbe.zE
22e00 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
22e10 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
22e20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
22e30 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a  lite3DbMalloc)..
22e40 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
22e50 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28  tabImportErrmsg(
22e60 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  Vdbe *p, sqlite3
22e70 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20  _vtab *pVtab){. 
22e80 20 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72   if( pVtab->zErr
22e90 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
22ea0 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
22eb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
22ec0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
22ed0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
22ee0 67 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72  g = sqlite3DbStr
22ef0 44 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a  Dup(db, pVtab->z
22f00 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c  ErrMsg);.    sql
22f10 69 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d  ite3_free(pVtab-
22f20 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
22f30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
22f40 30 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  0;.  }.}.#endif 
22f50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
22f60 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a     IRTUALTABLE */.