/ Hex Artifact Content
Login

Artifact 2c15cf88de4df97428318c8cfac0dea873dae451:


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 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c 6f  PagerExclusiveLo
10670 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
10680 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
10690 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a  ave(pBt);.    }.
106a0 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51    }.  if( rc!=SQ
106b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
106c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
106d0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
106e0 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e 73   any write-trans
106f0 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20  actions at all, 
10700 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69  invoke the commi
10710 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20  t hook */.  if( 
10720 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20 64  needXcommit && d
10730 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10740 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 64  ck ){.    rc = d
10750 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
10760 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  ck(db->pCommitAr
10770 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
10780 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10790 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
107a0 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20  _COMMITHOOK;.   
107b0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
107c0 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e   simple case - n
107d0 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  o more than one 
107e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e  database file (n
107f0 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a  ot counting the.
10800 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62 61    ** TEMP databa
10810 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73 61  se) has a transa
10820 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20 20  ction active.   
10830 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  There is no need
10840 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61   for the.  ** ma
10850 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ster-journal..  
10860 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 72  **.  ** If the r
10870 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 73  eturn value of s
10880 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10890 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a 65  lename() is a ze
108a0 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73  ro length.  ** s
108b0 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20  tring, it means 
108c0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
108d0 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72  e is :memory: or
108e0 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20 49   a temp file.  I
108f0 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61 73  n .  ** that cas
10900 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  e we do not supp
10910 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69  ort atomic multi
10920 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73  -file commits, s
10930 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a 20  o use the .  ** 
10940 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65 6e  simple case then
10950 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   too..  */.  if(
10960 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65   0==sqlite3Strle
10970 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65 65  n30(sqlite3Btree
10980 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
10990 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20  aDb[0].pBt)).   
109a0 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29  || nTrans<=1.  )
109b0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  {.    for(i=0; r
109c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
109d0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
109e0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
109f0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10a00 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
10a10 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
10a20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10a30 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74  mmitPhaseOne(pBt
10a40 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10a50 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74    }..    /* Do t
10a60 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69  he commit only i
10a70 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 20  f all databases 
10a80 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d  successfully com
10a90 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20 0a  plete phase 1. .
10aa0 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66      ** If one of
10ab0 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69 74   the BtreeCommit
10ac0 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73  PhaseOne() calls
10ad0 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e 64   fails, this ind
10ae0 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a  icates an.    **
10af0 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65 20   IO error while 
10b00 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
10b10 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
10b20 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c   file. It is unl
10b30 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75  ikely,.    ** bu
10b40 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20  t could happen. 
10b50 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62 61  In this case aba
10b60 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  ndon processing 
10b70 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
10b80 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rror..    */.   
10b90 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10ba0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
10bb0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10bc0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10bd0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10be0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
10bf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
10c00 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10c10 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29 3b  haseTwo(pBt, 0);
10c20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10c30 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10c40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10c50 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74 28  lite3VtabCommit(
10c60 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  db);.    }.  }..
10c70 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78    /* The complex
10c80 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69 73   case - There is
10c90 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72   a multi-file wr
10ca0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
10cb0 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69  active..  ** Thi
10cc0 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61 73  s requires a mas
10cd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10ce0 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20 74   to ensure the t
10cf0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20  ransaction is.  
10d00 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f  ** committed ato
10d10 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69  mically..  */.#i
10d20 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
10d30 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b  T_DISKIO.  else{
10d40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
10d50 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66   *pVfs = db->pVf
10d60 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61  s;.    char *zMa
10d70 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46  ster = 0;   /* F
10d80 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65  ile-name for the
10d90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10da0 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73  */.    char cons
10db0 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73  t *zMainFile = s
10dc0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10dd0 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
10de0 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  ].pBt);.    sqli
10df0 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
10e00 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f  r = 0;.    i64 o
10e10 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69  ffset = 0;.    i
10e20 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20  nt res;.    int 
10e30 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a  retryCount = 0;.
10e40 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c      int nMainFil
10e50 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63  e;..    /* Selec
10e60 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  t a master journ
10e70 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a  al file name */.
10e80 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20      nMainFile = 
10e90 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
10ea0 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
10eb0 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  zMaster = sqlite
10ec0 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73  3MPrintf(db, "%s
10ed0 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20  -mjXXXXXX9XXz", 
10ee0 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20  zMainFile);.    
10ef0 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29  if( zMaster==0 )
10f00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10f10 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64  OMEM_BKPT;.    d
10f20 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52  o {.      u32 iR
10f30 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28  andom;.      if(
10f40 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20   retryCount ){. 
10f50 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79         if( retry
10f60 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20  Count>100 ){.   
10f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
10f80 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
10f90 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c  "MJ delete: %s",
10fa0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
10fb0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
10fc0 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
10fd0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
10fe0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
10ff0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72 79   }else if( retry
11000 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  Count==1 ){.    
11010 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
11020 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22  g(SQLITE_FULL, "
11030 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c  MJ collide: %s",
11040 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11050 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
11060 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b     retryCount++;
11070 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
11080 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
11090 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e  (iRandom), &iRan
110a0 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  dom);.      sqli
110b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c  te3_snprintf(13,
110c0 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46   &zMaster[nMainF
110d0 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25  ile], "-mj%06X9%
110e0 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02X",.          
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11100 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38       (iRandom>>8
11110 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e  )&0xffffff, iRan
11120 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20  dom&0xff);.     
11130 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75   /* The antipenu
11140 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74 65  ltimate characte
11150 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  r of the master 
11160 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
11170 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39  t.      ** be "9
11180 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20  " to avoid name 
11190 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20  collisions when 
111a0 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61  using 8+3 filena
111b0 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73  mes. */.      as
111c0 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71  sert( zMaster[sq
111d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
111e0 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29  aster)-3]=='9' )
111f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 46  ;.      sqlite3F
11200 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e  ileSuffix3(zMain
11210 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  File, zMaster);.
11220 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11230 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
11240 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
11250 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20  _ACCESS_EXISTS, 
11260 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c  &res);.    }whil
11270 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
11280 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69   && res );.    i
11290 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
112a0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65   ){.      /* Ope
112b0 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
112c0 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72  rnal. */.      r
112d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
112e0 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d  nMalloc(pVfs, zM
112f0 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c  aster, &pMaster,
11300 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49   .          SQLI
11310 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
11320 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  E|SQLITE_OPEN_CR
11330 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20  EATE|.          
11340 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
11350 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45  USIVE|SQLITE_OPE
11360 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
11370 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
11380 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
11390 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
113a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
113b0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
113c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
113d0 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72     }. .    /* Wr
113e0 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ite the name of 
113f0 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66 69  each database fi
11400 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61  le in the transa
11410 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e  ction into the n
11420 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72  ew.    ** master
11430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
11440 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11450 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20  s at this point 
11460 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64  close.    ** and
11470 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11480 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11490 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64   All the individ
114a0 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
114b0 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68  s.    ** still h
114c0 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68  ave 'null' as th
114d0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
114e0 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65   pointer, so the
114f0 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20  y will roll.    
11500 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ** back independ
11510 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75  ently if a failu
11520 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a  re occurs..    *
11530 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
11540 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
11550 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11560 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11570 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  t;.      if( sql
11580 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
11590 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
115a0 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a     char const *z
115b0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74  File = sqlite3Bt
115c0 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d  reeGetJournalnam
115d0 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  e(pBt);.        
115e0 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a  if( zFile==0 ){.
115f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
11600 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54  ue;  /* Ignore T
11610 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a  EMP and :memory:
11620 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
11630 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11640 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d  assert( zFile[0]
11650 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  !=0 );.        r
11660 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
11670 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c  te(pMaster, zFil
11680 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  e, sqlite3Strlen
11690 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66  30(zFile)+1, off
116a0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f 66  set);.        of
116b0 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 53  fset += sqlite3S
116c0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
116d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
116e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
116f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11700 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
11710 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
11720 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
11730 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30  pVfs, zMaster, 0
11740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11750 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
11760 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
11770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11780 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11790 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
117a0 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  nc the master jo
117b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74  urnal file. If t
117c0 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
117d0 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20 2a  IAL device.    *
117e0 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 68  * flag is set th
117f0 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
11800 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
11810 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73  f( 0==(sqlite3Os
11820 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
11830 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26 53  stics(pMaster)&S
11840 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
11850 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26 20  ENTIAL).     && 
11860 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
11870 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
11880 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 53  Master, SQLITE_S
11890 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20  YNC_NORMAL)).   
118a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
118b0 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
118c0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  ster);.      sql
118d0 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
118e0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
118f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11900 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
11910 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
11920 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
11930 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64 62   Sync all the db
11940 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20   files involved 
11950 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
11960 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61 6c  on. The same cal
11970 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74 68  l.    ** sets th
11980 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11990 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63 68   pointer in each
119a0 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
119b0 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  nal. If.    ** a
119c0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 68  n error occurs h
119d0 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65  ere, do not dele
119e0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
119f0 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
11a00 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
11a10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
11a20 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 63  ring the first c
11a30 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
11a40 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11a50 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e  PhaseOne(), then
11a60 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61 6e   there is a chan
11a70 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  ce that the.    
11a80 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
11a90 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f  l file will be o
11aa0 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65 20  rphaned. But we 
11ab0 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69 74  cannot delete it
11ac0 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65  ,.    ** in case
11ad0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11ae0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77 61  nal file name wa
11af0 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
11b00 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a  he journal.    *
11b10 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74 68  * file before th
11b20 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  e failure occurr
11b30 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ed..    */.    f
11b40 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
11b50 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
11b60 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20  Db; i++){ .     
11b70 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
11b80 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20  ->aDb[i].pBt;.  
11b90 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
11ba0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11bb0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
11bc0 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73  aseOne(pBt, zMas
11bd0 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ter);.      }.  
11be0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 4f    }.    sqlite3O
11bf0 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74  sCloseFree(pMast
11c00 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
11c10 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
11c20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
11c30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11c40 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11c50 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11c60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11c70 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
11c80 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
11c90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
11ca0 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20 74  is commits the t
11cb0 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74 65  ransaction. Afte
11cc0 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74  r.    ** doing t
11cd0 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f 72  his the director
11ce0 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61 69  y is synced agai
11cf0 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e 64  n before any ind
11d00 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74  ividual.    ** t
11d10 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65 73  ransaction files
11d20 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20 20   are deleted..  
11d30 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
11d40 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
11d50 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b  fs, zMaster, 1);
11d60 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11d70 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11d80 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
11d90 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
11da0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11db0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
11dc0 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
11dd0 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
11de0 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
11df0 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
11e00 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
11e10 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
11e20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
11e30 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
11e40 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
11e50 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
11e60 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
11e70 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
11e80 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
11e90 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
11ea0 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
11eb0 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
11ec0 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
11ed0 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
11ee0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
11ef0 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
11f00 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
11f10 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
11f20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
11f30 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
11f40 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
11f50 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
11f60 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
11f70 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
11f80 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11f90 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
11fa0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
11fb0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11fc0 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11fd0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11fe0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11ff0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
12000 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12010 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12020 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
12030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12040 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
12050 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
12060 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
12070 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
12080 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
12090 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
120a0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
120b0 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
120c0 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
120d0 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
120e0 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
120f0 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
12100 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
12110 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
12120 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
12130 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
12140 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
12150 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
12160 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
12170 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
12180 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
12190 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
121a0 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
121b0 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
121c0 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
121d0 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
121e0 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
121f0 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
12200 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
12210 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
12220 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
12230 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
12240 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
12250 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
12260 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
12270 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
12280 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
12290 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
122a0 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
122b0 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
122c0 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
122d0 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
122e0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
122f0 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
12300 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
12310 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
12320 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
12330 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
12340 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
12350 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
12360 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
12370 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
12380 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
12390 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
123a0 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
123b0 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
123c0 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
123d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
123e0 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
123f0 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
12400 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
12410 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
12420 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
12430 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
12440 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
12450 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
12460 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
12470 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
12480 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
12490 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
124a0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
124b0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
124c0 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
124d0 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
124e0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
124f0 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
12500 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12510 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
12520 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
12530 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
12540 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
12550 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
12560 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
12570 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
12580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12590 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
125a0 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
125b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
125c0 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
125d0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
125e0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
125f0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
12600 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
12610 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
12620 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
12630 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12640 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
12650 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
12660 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
12670 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
12680 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
12690 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
126a0 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
126b0 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
126c0 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
126d0 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
126e0 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
126f0 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
12700 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
12710 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
12720 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
12730 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
12740 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
12750 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
12760 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
12770 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
12780 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
12790 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
127a0 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
127b0 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
127c0 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
127d0 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
127e0 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
127f0 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
12800 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
12810 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12820 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
12830 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
12840 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
12850 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
12860 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
12870 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
12880 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12890 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
128a0 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
128b0 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
128c0 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
128d0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
128e0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
128f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12900 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
12910 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
12920 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
12930 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
12940 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
12950 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12960 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12970 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12990 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
129a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
129b0 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
129c0 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
129d0 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
129e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
129f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
12a00 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12a10 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12a20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12a30 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
12a40 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
12a50 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
12a60 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12a70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12a80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
12a90 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
12aa0 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
12ab0 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
12ac0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12ad0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12ae0 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
12af0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12b00 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
12b10 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
12b20 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  e the .    ** da
12b30 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
12b40 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
12b50 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
12b60 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
12b70 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
12b80 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12b90 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
12ba0 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f  .  */.    if( eO
12bb0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12bc0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64  LBACK ){.      d
12bd0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
12be0 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f   = p->nStmtDefCo
12bf0 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44  ns;.      db->nD
12c00 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
12c10 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43   p->nStmtDefImmC
12c20 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
12c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12c40 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
12c50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
12c60 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
12c70 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
12c80 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
12c90 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
12ca0 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
12cb0 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
12cc0 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
12cd0 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
12ce0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
12cf0 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
12d00 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
12d10 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
12d20 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
12d30 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
12d40 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
12d50 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
12d60 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
12d70 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
12d80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12d90 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
12da0 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
12db0 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
12dc0 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
12dd0 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
12de0 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
12df0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12e00 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
12e10 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
12e20 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12e30 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
12e40 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
12e50 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
12e60 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
12e70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12e80 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
12e90 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
12ea0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
12eb0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
12ec0 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
12ed0 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
12ee0 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
12ef0 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
12f00 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
12f10 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
12f20 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
12f30 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
12f40 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12f50 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
12f60 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
12f70 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
12f80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12f90 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12fa0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
12fb0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
12fc0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12fd0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
12fe0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
12ff0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
13000 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
13010 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
13020 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
13030 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
13040 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
13050 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
13060 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
13070 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
13080 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
13090 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
130a0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
130b0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
130c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
130d0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
130e0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
130f0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
13100 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
13110 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
13120 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
13130 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
13140 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
13150 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
13160 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
13170 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
13180 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
13190 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
131a0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
131b0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
131c0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
131d0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
131e0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
131f0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
13200 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
13210 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
13220 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
13230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13240 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
13250 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
13260 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
13270 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
13280 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
13290 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
132a0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
132b0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
132c0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
132d0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
132e0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
132f0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
13300 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
13310 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
13320 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
13330 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
13340 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
13350 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
13360 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
13370 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
13380 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
13390 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
133a0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
133b0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
133c0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
133d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
133e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
133f0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
13400 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
13410 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
13420 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
13430 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
13440 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
13450 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
13460 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
13470 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
13480 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
13490 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
134a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
134b0 20 2a 2f 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d   */..  if( db->m
134c0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
134d0 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
134e0 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20  E_NOMEM_BKPT;.  
134f0 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65  }.  if( p->aOnce
13500 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d  Flag ) memset(p-
13510 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70  >aOnceFlag, 0, p
13520 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20  ->nOnceFlag);.  
13530 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
13540 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
13550 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
13560 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
13570 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
13580 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
13590 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
135a0 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
135b0 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
135c0 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
135d0 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
135e0 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
135f0 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
13600 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
13610 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13620 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
13630 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
13640 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
13650 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
13660 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
13670 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
13680 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
13690 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
136a0 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
136b0 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
136c0 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
136d0 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
136e0 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
136f0 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
13700 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
13710 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
13720 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
13730 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
13740 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
13750 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
13760 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
13770 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
13780 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
13790 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
137a0 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
137b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
137c0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
137d0 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
137e0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
137f0 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
13800 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
13810 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
13820 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
13830 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
13840 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13850 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
13860 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
13870 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
13880 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
13890 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
138a0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
138b0 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
138c0 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
138d0 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
138e0 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
138f0 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
13900 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
13910 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
13920 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
13930 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
13940 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
13950 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
13960 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
13970 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
13980 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
13990 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
139a0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
139b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
139c0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
139d0 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
139e0 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
139f0 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
13a00 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
13a10 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
13a20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
13a30 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
13a40 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
13a50 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
13a60 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
13a70 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
13a80 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
13a90 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
13aa0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
13ab0 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
13ac0 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
13ad0 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
13ae0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
13af0 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
13b00 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
13b10 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
13b20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
13b30 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
13b40 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
13b50 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13b60 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
13b70 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
13b80 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
13b90 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
13ba0 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
13bb0 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
13bc0 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
13bd0 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
13be0 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
13bf0 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
13c00 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13c10 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
13c20 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
13c30 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
13c40 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
13c50 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
13c60 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
13c70 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
13c80 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
13c90 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
13ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
13cb0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
13cc0 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
13cd0 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
13ce0 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
13cf0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13d00 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
13d10 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
13d20 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
13d30 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
13d40 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
13d50 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
13d60 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
13d70 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
13d80 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
13d90 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
13da0 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
13db0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
13dc0 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
13dd0 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
13de0 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
13df0 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13e00 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
13e10 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
13e20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
13e30 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
13e40 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
13e50 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
13e60 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
13e70 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
13e80 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
13e90 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
13ea0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13eb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
13ec0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
13ed0 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
13ee0 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
13ef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13f00 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
13f10 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
13f20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
13f40 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
13f50 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
13f60 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
13f70 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
13f80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f90 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
13fa0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
13fb0 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
13fc0 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
13fd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
13fe0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13ff0 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
14000 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
14010 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
14020 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
14030 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
14040 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
14050 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
14060 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
14070 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
14080 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
14090 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
140a0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
140b0 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
140c0 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
140d0 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
140e0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
140f0 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
14100 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
14110 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14120 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
14130 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
14140 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14150 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
14160 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
14170 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
14180 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
14190 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
141a0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
141b0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
141c0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
141d0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
141e0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
141f0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14200 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14210 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
14220 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
14230 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
14240 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
14250 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
14260 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
14270 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
14280 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
14290 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
142a0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
142b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
142c0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
142d0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
142e0 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
142f0 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
14310 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
14320 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
14330 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
14340 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
14350 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
14360 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
14370 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
14380 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
14390 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
143a0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
143b0 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
143c0 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
143d0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
143e0 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
143f0 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
14400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14410 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
14420 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
14430 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
14440 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
14450 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
14460 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
14470 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
14480 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
14490 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
144a0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
144b0 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
144c0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
144d0 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
144e0 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
144f0 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
14500 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
14510 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
14520 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
14530 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
14540 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
14550 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
14560 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
14570 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
14580 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
14590 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
145a0 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
145b0 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
145c0 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
145d0 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
145e0 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
145f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14600 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
14610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14620 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
14630 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
14640 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
14650 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
14660 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
14670 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
14680 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
14690 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
146a0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
146b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
146c0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
146d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
146e0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
146f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14700 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
14710 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
14720 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
14730 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
14740 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
14750 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
14760 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
14770 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
14780 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14790 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
147a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
147b0 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
147c0 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
147d0 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
147e0 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
147f0 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
14800 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
14810 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14820 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
14830 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
14840 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
14850 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
14860 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
14870 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
14880 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
14890 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
148a0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
148b0 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
148c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
148d0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
148e0 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
148f0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14900 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
14910 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
14920 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
14930 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
14940 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
14950 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
14960 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
14970 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
14980 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
14990 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
149a0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
149b0 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
149c0 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
149d0 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
149e0 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
149f0 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
14a00 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
14a10 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
14a20 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
14a30 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
14a40 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
14a50 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
14a60 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
14a70 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
14a80 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
14a90 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
14aa0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
14ab0 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
14ac0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
14ad0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14ae0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
14af0 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a  NOMEM_BKPT;.  }.
14b00 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74  .  /* If the aut
14b10 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
14b20 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68   set to true, th
14b30 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61  en any locks tha
14b40 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a  t were held.  **
14b50 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   by connection d
14b60 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  b have now been 
14b70 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73  released. Call s
14b80 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
14b90 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a  Unlocked() .  **
14ba0 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72   to invoke any r
14bb0 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e  equired unlock-n
14bc0 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e  otify callbacks.
14bd0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
14be0 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20  autoCommit ){.  
14bf0 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
14c00 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b  ionUnlocked(db);
14c10 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
14c20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
14c30 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d  0 || db->autoCom
14c40 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53  mit==0 || db->nS
14c50 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20  tatement==0 );. 
14c60 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d   return (p->rc==
14c70 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51  SQLITE_BUSY ? SQ
14c80 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49  LITE_BUSY : SQLI
14c90 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TE_OK);.}.../*.*
14ca0 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64  * Each VDBE hold
14cb0 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  s the result of 
14cc0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
14cd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63  sqlite3_step() c
14ce0 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e  all.** in p->rc.
14cf0 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73    This routine s
14d00 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74 20  ets that result 
14d10 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f  back to SQLITE_O
14d20 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  K..*/.void sqlit
14d30 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70 52  e3VdbeResetStepR
14d40 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a  esult(Vdbe *p){.
14d50 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14d60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
14d70 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  py the error cod
14d80 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73  e and error mess
14d90 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  age belonging to
14da0 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65 64   the VDBE passed
14db0 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73 74  .** as the first
14dc0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73   argument to its
14dd0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14de0 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20 77   (so that they w
14df0 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72  ill be .** retur
14e00 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20  ned by calls to 
14e10 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
14e20 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72  ) and sqlite3_er
14e30 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54  rmsg())..**.** T
14e40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  his function doe
14e50 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20  s not clear the 
14e60 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20  VDBE error code 
14e70 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74  or message, just
14e80 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20  .** copies them 
14e90 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
14ea0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
14eb0 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
14ec0 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29  erError(Vdbe *p)
14ed0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
14ee0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72  = p->db;.  int r
14ef0 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28  c = p->rc;.  if(
14f00 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20   p->zErrMsg ){. 
14f10 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61     db->bBenignMa
14f20 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  lloc++;.    sqli
14f30 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14f40 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28 20  lloc();.    if( 
14f50 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64 62  db->pErr==0 ) db
14f60 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65 33  ->pErr = sqlite3
14f70 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
14f80 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14f90 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d  tStr(db->pErr, -
14fa0 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53  1, p->zErrMsg, S
14fb0 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
14fc0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
14fd0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
14fe0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
14ff0 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c   db->bBenignMall
15000 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65 72  oc--;.    db->er
15010 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d 65  rCode = rc;.  }e
15020 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
15030 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 20  Error(db, rc);. 
15040 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15050 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
15060 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f  _ENABLE_SQLLOG./
15070 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49 54  *.** If an SQLIT
15080 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 20  E_CONFIG_SQLLOG 
15090 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65 72  hook is register
150a0 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68 61  ed and the VM ha
150b0 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a 20  s been run, .** 
150c0 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73 74  invoke it..*/.st
150d0 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49 6e  atic void vdbeIn
150e0 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65 20  vokeSqllog(Vdbe 
150f0 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *v){.  if( sqlit
15100 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
15110 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63 3d  Sqllog && v->rc=
15120 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76 2d  =SQLITE_OK && v-
15130 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e 3d  >zSql && v->pc>=
15140 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
15150 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69 74  Expanded = sqlit
15160 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c 28  e3VdbeExpandSql(
15170 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20 20  v, v->zSql);.   
15180 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d 3e   assert( v->db->
15190 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b 0a  init.busy==0 );.
151a0 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64 65      if( zExpande
151b0 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  d ){.      sqlit
151c0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
151d0 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20 20  Sqllog(.        
151e0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
151f0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
15200 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e 64  , v->db, zExpand
15210 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a 20  ed, 1.      );. 
15220 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
15230 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  ee(v->db, zExpan
15240 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ded);.    }.  }.
15250 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
15260 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
15270 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  g(x).#endif../*.
15280 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56 44  ** Clean up a VD
15290 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
152a0 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64 65  on but do not de
152b0 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a 75  lete the VDBE ju
152c0 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74 65  st yet..** Write
152d0 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73 61   any error messa
152e0 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d  ges into *pzErrM
152f0 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  sg.  Return the 
15300 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a 0a  result code..**.
15310 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
15320 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74 68  utine is run, th
15330 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62 65  e VDBE should be
15340 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78 65   ready to be exe
15350 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e 0a  cuted.** again..
15360 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61 74  **.** To look at
15370 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79 2c   it another way,
15380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15390 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 6f  sets the state o
153a0 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c  f the.** virtual
153b0 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56 44   machine from VD
153c0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72 20  BE_MAGIC_RUN or 
153d0 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
153e0 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45 5f  back to.** VDBE_
153f0 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a 69  MAGIC_INIT..*/.i
15400 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  nt sqlite3VdbeRe
15410 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  set(Vdbe *p){.  
15420 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 64  sqlite3 *db;.  d
15430 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
15440 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20 6e   If the VM did n
15450 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c 65  ot run to comple
15460 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65 6e  tion or if it en
15470 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20 2a  countered an.  *
15480 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69 74  * error, then it
15490 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65 20   might not have 
154a0 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f 70  been halted prop
154b0 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a 20  erly.  So halt. 
154c0 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a 2f   ** it now..  */
154d0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48 61  .  sqlite3VdbeHa
154e0 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  lt(p);..  /* If 
154f0 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
15500 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61 6c  run even partial
15510 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66 65  ly, then transfe
15520 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  r the error code
15530 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20  .  ** and error 
15540 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68 65  message from the
15550 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20 6d   VDBE into the m
15560 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74 72  ain database str
15570 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20 2a  ucture.  But.  *
15580 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68 61  * if the VDBE ha
15590 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74 20  s just been set 
155a0 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20 6e  to run but has n
155b0 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65 63  ot actually exec
155c0 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69 6e  uted any.  ** in
155d0 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c 20  structions yet, 
155e0 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20 64  leave the main d
155f0 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e  atabase error in
15600 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61 6e  formation unchan
15610 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ged..  */.  if( 
15620 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
15630 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
15640 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
15650 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
15660 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  r(p);.    sqlite
15670 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
15680 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e  ErrMsg);.    p->
15690 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
156a0 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f   if( p->runOnlyO
156b0 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65 64  nce ) p->expired
156c0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 1;.  }else if
156d0 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65 78  ( p->rc && p->ex
156e0 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20  pired ){.    /* 
156f0 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61 67  The expired flag
15700 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65 20   was set on the 
15710 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65 20  VDBE before the 
15720 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20 2a  first call.    *
15730 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74 65  * to sqlite3_ste
15740 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73 74  p(). For consist
15750 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c 69  ency (since sqli
15760 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a 20  te3_step() was. 
15770 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20 73     ** called), s
15780 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  et the database 
15790 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63 61  error in this ca
157a0 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20 20  se as well..    
157b0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  */.    sqlite3Er
157c0 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 70  rorWithMsg(db, p
157d0 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  ->rc, p->zErrMsg
157e0 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d 3e   ? "%s" : 0, p->
157f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71  zErrMsg);.    sq
15800 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15810 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15820 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
15830 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c 61  .  }..  /* Recla
15840 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75 73  im all memory us
15850 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a 20  ed by the VDBE. 
15860 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70 29   */.  Cleanup(p)
15870 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72 6f  ;..  /* Save pro
15880 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  filing informati
15890 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44 42  on from this VDB
158a0 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  E run..  */.#ifd
158b0 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
158c0 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75    {.    FILE *ou
158d0 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65 5f  t = fopen("vdbe_
158e0 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22 61  profile.out", "a
158f0 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74 20  ");.    if( out 
15900 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
15910 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15920 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20 20  t, "---- ");.   
15930 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
15940 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
15950 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15960 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70 5b   "%02x", p->aOp[
15970 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20 20  i].opcode);.    
15980 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e 74    }.      fprint
15990 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  f(out, "\n");.  
159a0 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20      if( p->zSql 
159b0 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
159c0 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20 20  c, pc = 0;.     
159d0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
159e0 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
159f0 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70 2d  for(i=0; (c = p-
15a00 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69 2b  >zSql[i])!=0; i+
15a10 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
15a20 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc=='\n' ) fpr
15a30 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
15a40 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 63  ;.          putc
15a50 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  (c, out);.      
15a60 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
15a70 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
15a80 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70 72  ( pc!='\n' ) fpr
15a90 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b  intf(out, "\n");
15aa0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
15ab0 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
15ac0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15ad0 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b 0a  char zHdr[100];.
15ae0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15af0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
15b00 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25 36  zHdr), zHdr, "%6
15b10 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20 22  u %12llu %8llu "
15b20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15b30 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20 20  aOp[i].cnt,.    
15b40 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
15b50 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20 20  .cycles,.       
15b60 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
15b70 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d 2e  t>0 ? p->aOp[i].
15b80 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69 5d  cycles/p->aOp[i]
15b90 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20 20  .cnt : 0.       
15ba0 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   );.        fpri
15bb0 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
15bc0 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  Hdr);.        sq
15bd0 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
15be0 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f 70  (out, i, &p->aOp
15bf0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
15c00 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b      fclose(out);
15c10 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
15c20 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74 54  f.  p->iCurrentT
15c30 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d 61  ime = 0;.  p->ma
15c40 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
15c50 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e 20  _INIT;.  return 
15c60 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72 4d  p->rc & db->errM
15c70 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20 43  ask;.}. ./*.** C
15c80 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c 65  lean up and dele
15c90 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72 20  te a VDBE after 
15ca0 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74 75  execution.  Retu
15cb0 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77 68  rn an integer wh
15cc0 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72 65  ich is.** the re
15cd0 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69 74  sult code.  Writ
15ce0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
15cf0 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a 70  age text into *p
15d00 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
15d10 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61 6c  sqlite3VdbeFinal
15d20 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ize(Vdbe *p){.  
15d30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15d40 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  OK;.  if( p->mag
15d50 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic==VDBE_MAGIC_R
15d60 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d 3d  UN || p->magic==
15d70 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  VDBE_MAGIC_HALT 
15d80 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15d90 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29 3b  te3VdbeReset(p);
15da0 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72 63  .    assert( (rc
15db0 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61 73   & p->db->errMas
15dc0 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20 20  k)==rc );.  }.  
15dd0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15de0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15df0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  c;.}../*.** If p
15e00 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73 20  arameter iOp is 
15e10 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
15e20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65 20  then invoke the 
15e30 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a 2a  destructor for.*
15e40 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79 20  * all auxiliary 
15e50 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 75  data pointers cu
15e60 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20 62  rrently cached b
15e70 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  y the VM passed 
15e80 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  as.** the first 
15e90 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
15ea0 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67 72  Or, if iOp is gr
15eb0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
15ec0 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  ual to zero, the
15ed0 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  n the destructor
15ee0 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76 6f   is.** only invo
15ef0 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61 75  ked for those au
15f00 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69  xiliary data poi
15f10 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62 79  nters created by
15f20 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66 75   the user .** fu
15f30 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20 62  nction invoked b
15f40 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69 6f  y the OP_Functio
15f50 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73 74  n opcode at inst
15f60 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20 0a  ruction iOp of .
15f70 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e 64  ** VM pVdbe, and
15f80 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a 2a   only then if:.*
15f90 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61 73  *.**    * the as
15fa0 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69 6f  sociated functio
15fb0 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  n parameter is t
15fc0 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65 72  he 32nd or later
15fd0 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20 20   (counting.**   
15fe0 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f 20     from left to 
15ff0 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a 2a  right), or.**.**
16000 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65 73      * the corres
16010 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20 61  ponding bit in a
16020 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73 20  rgument mask is 
16030 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68 65  clear (where the
16040 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20 66   first.**      f
16050 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
16060 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  r corresponds to
16070 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a 2f   bit 0 etc.)..*/
16080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16090 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 73  eDeleteAuxData(s
160a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78 44  qlite3 *db, AuxD
160b0 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69 4f  ata **pp, int iO
160c0 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20 20  p, int mask){.  
160d0 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20  while( *pp ){.  
160e0 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78 20    AuxData *pAux 
160f0 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28  = *pp;.    if( (
16100 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28  iOp<0).     || (
16110 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26  pAux->iOp==iOp &
16120 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31  & (pAux->iArg>31
16130 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53   || !(mask & MAS
16140 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72  KBIT32(pAux->iAr
16150 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  g)))).    ){.   
16160 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41 75     testcase( pAu
16170 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20  x->iArg==31 );. 
16180 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78       if( pAux->x
16190 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20  Delete ){.      
161a0 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28    pAux->xDelete(
161b0 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20  pAux->pAux);.   
161c0 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d     }.      *pp =
161d0 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20   pAux->pNext;.  
161e0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
161f0 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20  e(db, pAux);.   
16200 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70   }else{.      pp
16210 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a  = &pAux->pNext;.
16220 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
16230 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  ** Free all memo
16240 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
16250 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73 73  th the Vdbe pass
16260 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
16270 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78   argument,.** ex
16280 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20  cept for object 
16290 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73  itself, which is
162a0 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a   preserved..**.*
162b0 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  * The difference
162c0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66 75   between this fu
162d0 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74  nction and sqlit
162e0 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20 69  e3VdbeDelete() i
162f0 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65  s that.** VdbeDe
16300 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69  lete() also unli
16310 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72 6f  nks the Vdbe fro
16320 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d  m the list of VM
16330 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
16340 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
16350 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64  e connection and
16360 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63   frees the objec
16370 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69  t itself..*/.voi
16380 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65  d sqlite3VdbeCle
16390 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33  arObject(sqlite3
163a0 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
163b0 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53    SubProgram *pS
163c0 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e  ub, *pNext;.  in
163d0 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70  t i;.  assert( p
163e0 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62  ->db==0 || p->db
163f0 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73  ==db );.  releas
16400 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61  eMemArray(p->aVa
16410 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72  r, p->nVar);.  r
16420 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
16430 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
16440 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
16450 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62  E_N);.  for(pSub
16460 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53  =p->pProgram; pS
16470 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b  ub; pSub=pNext){
16480 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75  .    pNext = pSu
16490 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64  b->pNext;.    vd
164a0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
164b0 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75  , pSub->aOp, pSu
164c0 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c  b->nOp);.    sql
164d0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
164e0 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Sub);.  }.  for(
164f0 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e  i=p->nzVar-1; i>
16500 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33  =0; i--) sqlite3
16510 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a  DbFree(db, p->az
16520 56 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c 69 74  Var[i]);.  sqlit
16530 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16540 61 7a 56 61 72 29 3b 0a 20 20 76 64 62 65 46 72  azVar);.  vdbeFr
16550 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d  eeOpArray(db, p-
16560 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20  >aOp, p->nOp);. 
16570 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16580 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b  b, p->aColName);
16590 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
165a0 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20  (db, p->zSql);. 
165b0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
165c0 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69  b, p->pFree);.#i
165d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
165e0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
165f0 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  US.  for(i=0; i<
16600 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a  p->nScan; i++){.
16610 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
16620 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69  e(db, p->aScan[i
16630 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ].zName);.  }.  
16640 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16650 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e  , p->aScan);.#en
16660 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  dif.}../*.** Del
16670 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44  ete an entire VD
16680 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  BE..*/.void sqli
16690 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64  te3VdbeDelete(Vd
166a0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
166b0 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45  3 *db;..  if( NE
166c0 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75  VER(p==0) ) retu
166d0 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  rn;.  db = p->db
166e0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
166f0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
16700 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
16710 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f  qlite3VdbeClearO
16720 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20  bject(db, p);.  
16730 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a  if( p->pPrev ){.
16740 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e      p->pPrev->pN
16750 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
16760 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
16770 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d  ert( db->pVdbe==
16780 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64  p );.    db->pVd
16790 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  be = p->pNext;. 
167a0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78   }.  if( p->pNex
167b0 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  t ){.    p->pNex
167c0 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
167d0 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  rev;.  }.  p->ma
167e0 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
167f0 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d  _DEAD;.  p->db =
16800 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46   0;.  sqlite3DbF
16810 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f  ree(db, p);.}../
16820 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20  *.** The cursor 
16830 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e  "p" has a pendin
16840 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e  g seek operation
16850 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65   that has not ye
16860 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65  t been.** carrie
16870 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65  d out.  Seek the
16880 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66   cursor now.  If
16890 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
168a0 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20  , return.** the 
168b0 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
168c0 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
168d0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49  c int SQLITE_NOI
168e0 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65  NLINE handleDefe
168f0 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43  rredMoveto(VdbeC
16900 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
16910 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66   res, rc;.#ifdef
16920 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65   SQLITE_TEST.  e
16930 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
16940 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a  3_search_count;.
16950 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
16960 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65   p->deferredMove
16970 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  to );.  assert( 
16980 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20  p->isTable );.  
16990 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
169a0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
169b0 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  EE );.  rc = sql
169c0 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 55  ite3BtreeMovetoU
169d0 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70 43  npacked(p->uc.pC
169e0 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f 76  ursor, 0, p->mov
169f0 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26 72  etoTarget, 0, &r
16a00 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  es);.  if( rc ) 
16a10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28  return rc;.  if(
16a20 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72 6e   res!=0 ) return
16a30 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
16a40 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51 4c  BKPT;.#ifdef SQL
16a50 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69 74  ITE_TEST.  sqlit
16a60 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 2b  e3_search_count+
16a70 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 64  +;.#endif.  p->d
16a80 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d 20  eferredMoveto = 
16a90 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74 61  0;.  p->cacheSta
16aa0 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41 4c  tus = CACHE_STAL
16ab0 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  E;.  return SQLI
16ac0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
16ad0 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d 6f  Something has mo
16ae0 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20 6f  ved cursor "p" o
16af0 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d 61  ut of place.  Ma
16b00 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20 77  ybe the row it w
16b10 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f  as.** pointed to
16b20 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74   was deleted out
16b30 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e 20   from under it. 
16b40 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62 74   Or maybe the bt
16b50 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61 6c  ree was.** rebal
16b60 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65 72  anced.  Whatever
16b70 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79 20   the cause, try 
16b80 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20 74  to restore "p" t
16b90 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a 2a  o the place it.*
16ba0 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74 6f  * is supposed to
16bb0 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20 49   be pointing.  I
16bc0 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64 65  f the row was de
16bd0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
16be0 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72 73  nder the.** curs
16bf0 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72 73  or, set the curs
16c00 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61  or to point to a
16c10 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73 74   NULL row..*/.st
16c20 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16c30 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 4d  NOINLINE handleM
16c40 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65 43  ovedCursor(VdbeC
16c50 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ursor *p){.  int
16c60 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 2c   isDifferentRow,
16c70 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
16c80 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54  ->eCurType==CURT
16c90 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 61  YPE_BTREE );.  a
16ca0 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43 75  ssert( p->uc.pCu
16cb0 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rsor!=0 );.  ass
16cc0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
16cd0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
16ce0 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
16cf0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
16d00 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74 6f  BtreeCursorResto
16d10 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  re(p->uc.pCursor
16d20 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52 6f  , &isDifferentRo
16d30 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74  w);.  p->cacheSt
16d40 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
16d50 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66 66  LE;.  if( isDiff
16d60 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e 75  erentRow ) p->nu
16d70 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65 74  llRow = 1;.  ret
16d80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16d90 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72 65   Check to ensure
16da0 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72   that the cursor
16db0 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73 74   is valid.  Rest
16dc0 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a 2a  ore the cursor.*
16dd0 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20 52  * if need be.  R
16de0 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65 72  eturn any I/O er
16df0 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65 73  ror from the res
16e00 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  tore operation..
16e10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
16e20 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28  beCursorRestore(
16e30 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
16e40 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75    assert( p->eCu
16e50 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
16e60 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73 71  TREE );.  if( sq
16e70 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16e80 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
16e90 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
16ea0 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
16eb0 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
16ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ed0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  OK;.}../*.** Mak
16ee0 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73 6f  e sure the curso
16ef0 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f 20  r p is ready to 
16f00 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
16f10 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20 69  e row to which i
16f20 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70 6f  t.** was last po
16f30 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75 72  sitioned.  Retur
16f40 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
16f50 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20  if an OOM fault 
16f60 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20  or I/O error.** 
16f70 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f 6d  prevents us from
16f80 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68 65   positioning the
16f90 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20 63   cursor to its c
16fa0 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e  orrect position.
16fb0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65  .**.** If a Move
16fc0 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73 20  To operation is 
16fd0 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20 67  pending on the g
16fe0 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68 65  iven cursor, the
16ff0 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76  n do that.** Mov
17000 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20  eTo now.  If no 
17010 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67 2c  move is pending,
17020 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
17030 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65 65   the row has bee
17040 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75 74  n.** deleted out
17050 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
17060 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69 74  cursor and if it
17070 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20 72   has, mark the r
17080 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20  ow as.** a NULL 
17090 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  row..**.** If th
170a0 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65  e cursor is alre
170b0 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
170c0 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77 20  the correct row 
170d0 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61 73  and that row has
170e0 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c  .** not been del
170f0 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
17100 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c 20  der the cursor, 
17110 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
17120 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
17130 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
17140 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62  CursorMoveto(Vdb
17150 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69 6e  eCursor **pp, in
17160 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64 62  t *piCol){.  Vdb
17170 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70 70  eCursor *p = *pp
17180 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54  ;.  if( p->eCurT
17190 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
171a0 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  EE ){.    if( p-
171b0 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20  >deferredMoveto 
171c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d 61  ){.      int iMa
171d0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  p;.      if( p->
171e0 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61 70  aAltMap && (iMap
171f0 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31 2b   = p->aAltMap[1+
17200 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20 20  *piCol])>0 ){.  
17210 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70        *pp = p->p
17220 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  AltCursor;.     
17230 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61 70     *piCol = iMap
17240 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   - 1;.        re
17250 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17260 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
17270 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65 72  turn handleDefer
17280 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20 20  redMoveto(p);.  
17290 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
172a0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
172b0 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75  sMoved(p->uc.pCu
172c0 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 72  rsor) ){.      r
172d0 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
172e0 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20 20  dCursor(p);.    
172f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
17300 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17310 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
17320 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
17330 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
17340 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71 6c  ialType().** sql
17350 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
17360 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74  peLen().** sqlit
17370 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e 28  e3VdbeSerialLen(
17380 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17390 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20 73  SerialPut().** s
173a0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
173b0 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61  Get().**.** enca
173c0 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64 65  psulate the code
173d0 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65 73   that serializes
173e0 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f 72   values for stor
173f0 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a 2a  age in SQLite.**
17400 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78 20   data and index 
17410 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73 65  records. Each se
17420 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20 63  rialized value c
17430 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a 20  onsists of a.** 
17440 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61 6e  'serial-type' an
17450 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  d a blob of data
17460 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79 70  . The serial typ
17470 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20 75  e is an 8-byte u
17480 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65 67  nsigned.** integ
17490 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61 20  er, stored as a 
174a0 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e  varint..**.** In
174b0 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65 78   an SQLite index
174c0 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65 72   record, the ser
174d0 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f 72  ial type is stor
174e0 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66 6f  ed directly befo
174f0 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20 6f  re.** the blob o
17500 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20 63  f data that it c
17510 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20 49  orresponds to. I
17520 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72 64  n a table record
17530 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a 20  , all serial.** 
17540 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65 64  types are stored
17550 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
17560 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e 64   the record, and
17570 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64 61   the blobs of da
17580 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e 64  ta at.** the end
17590 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66 75  . Hence these fu
175a0 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74 68  nctions allow th
175b0 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e 64  e caller to hand
175c0 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61 6c  le the.** serial
175d0 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20 62  -type and data b
175e0 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e 0a  lob separately..
175f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
17600 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
17610 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73 20  bes the various 
17620 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73 20  storage classes 
17630 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20  for data:.**.** 
17640 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20 20    serial type   
17650 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64 61       bytes of da
17660 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a 20  ta      type.** 
17670 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17680 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
17690 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  ----    --------
176a0 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20  -------.**      
176b0 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
176c0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
176d0 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20 20     NULL.**      
176e0 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
176f0 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
17700 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17710 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20 20  r.**      2     
17720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17730 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  2            sig
17740 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17750 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
17760 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20 20            3     
17770 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17780 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34 20  teger.**      4 
17790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177a0 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20      4           
177b0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
177c0 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20 20  **      5       
177d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36 20                6 
177e0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
177f0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17800 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 20    6             
17810 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20          8       
17820 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17830 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20 20  ger.**      7   
17840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17850 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 49    8            I
17860 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20 20  EEE float.**    
17870 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 20    8             
17880 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
17890 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e       Integer con
178a0 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20 20  stant 0.**      
178b0 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  9               
178c0 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
178d0 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74     Integer const
178e0 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30 2c  ant 1.**     10,
178f0 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20  11              
17900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17910 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65 78   reserved for ex
17920 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e  pansion.**    N>
17930 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20 20  =12 and even    
17940 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20 20     (N-12)/2     
17950 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e     BLOB.**    N>
17960 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20 20  =13 and odd     
17970 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20 20     (N-13)/2     
17980 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68     text.**.** Th
17990 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73 20  e 8 and 9 types 
179a0 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33 2e  were added in 3.
179b0 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61 74  3.0, file format
179c0 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73 69   4.  Prior versi
179d0 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74 65  ons.** of SQLite
179e0 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72 73   will not unders
179f0 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69 61  tand those seria
17a00 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a  l types..*/../*.
17a10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
17a20 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74 68  rial-type for th
17a30 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
17a40 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73  n pMem..*/.u32 s
17a50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17a60 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20  Type(Mem *pMem, 
17a70 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74 2c  int file_format,
17a80 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20 69   u32 *pLen){.  i
17a90 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d  nt flags = pMem-
17aa0 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b  >flags;.  u32 n;
17ab0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 6e  ..  assert( pLen
17ac0 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c 61  !=0 );.  if( fla
17ad0 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
17ae0 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
17af0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
17b00 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
17b10 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46 69  Int ){.    /* Fi
17b20 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65 72  gure out whether
17b30 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34 2c   to use 1, 2, 4,
17b40 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20 2a   6 or 8 bytes. *
17b50 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41 58  /.#   define MAX
17b60 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29 30  _6BYTE ((((i64)0
17b70 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29 2d  x00008000)<<32)-
17b80 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20 70  1).    i64 i = p
17b90 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75 36  Mem->u.i;.    u6
17ba0 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c 30  4 u;.    if( i<0
17bb0 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e 69   ){.      u = ~i
17bc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
17bd0 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d 0a     u = i;.    }.
17be0 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20 29      if( u<=127 )
17bf0 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26 31  {.      if( (i&1
17c00 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72  )==i && file_for
17c10 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20 20  mat>=4 ){.      
17c20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20    *pLen = 0;.   
17c30 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28 75       return 8+(u
17c40 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c 73  32)u;.      }els
17c50 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  e{.        *pLen
17c60 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
17c70 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
17c80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c      }.    if( u<
17c90 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e 20  =32767 ){ *pLen 
17ca0 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20 7d  = 2; return 2; }
17cb0 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38 38  .    if( u<=8388
17cc0 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 33  607 ){ *pLen = 3
17cd0 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20 20  ; return 3; }.  
17ce0 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38 33    if( u<=2147483
17cf0 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 34  647 ){ *pLen = 4
17d00 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20 20  ; return 4; }.  
17d10 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59    if( u<=MAX_6BY
17d20 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b  TE ){ *pLen = 6;
17d30 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20 20   return 5; }.   
17d40 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20   *pLen = 8;.    
17d50 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
17d60 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
17d70 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20  al ){.    *pLen 
17d80 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
17d90 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  7;.  }.  assert(
17da0 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f   pMem->db->mallo
17db0 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67 73  cFailed || flags
17dc0 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c  &(MEM_Str|MEM_Bl
17dd0 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ob) );.  assert(
17de0 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20   pMem->n>=0 );. 
17df0 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d 3e   n = (u32)pMem->
17e00 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  n;.  if( flags &
17e10 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
17e20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a   n += pMem->u.nZ
17e30 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e  ero;.  }.  *pLen
17e40 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20 28   = n;.  return (
17e50 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28 66  (n*2) + 12 + ((f
17e60 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d 30  lags&MEM_Str)!=0
17e70 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ));.}../*.** The
17e80 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69 61   sizes for seria
17e90 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 68 61  l types less tha
17ea0 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63 20  n 128.*/.static 
17eb0 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65 33  const u8 sqlite3
17ec0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 5d  SmallTypeSizes[]
17ed0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
17ee0 20 30 20 20 20 31 20 20 20 32 20 20 20 33 20 20   0   1   2   3  
17ef0 20 34 20 20 20 35 20 20 20 36 20 20 20 37 20 20   4   5   6   7  
17f00 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a 20   8   9 */   ./* 
17f10 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c 20    0 */   0,  1, 
17f20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c 20   2,  3,  4,  6, 
17f30 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c 0a   8,  8,  0,  0,.
17f40 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20 20  /*  10 */   0,  
17f50 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20 20  0,  0,  0,  1,  
17f60 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20 20  1,  2,  2,  3,  
17f70 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20 34  3,./*  20 */   4
17f80 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20 36  ,  4,  5,  5,  6
17f90 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20 38  ,  6,  7,  7,  8
17fa0 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20  ,  8,./*  30 */ 
17fb0 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30 2c    9,  9, 10, 10,
17fc0 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32 2c   11, 11, 12, 12,
17fd0 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30 20   13, 13,./*  40 
17fe0 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c 20  */  14, 14, 15, 
17ff0 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c 20  15, 16, 16, 17, 
18000 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20 20  17, 18, 18,./*  
18010 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20 32  50 */  19, 19, 2
18020 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20 32  0, 20, 21, 21, 2
18030 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a 2f  2, 22, 23, 23,./
18040 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32 34  *  60 */  24, 24
18050 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32 36  , 25, 25, 26, 26
18060 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32 38  , 27, 27, 28, 28
18070 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39 2c  ,./*  70 */  29,
18080 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31 2c   29, 30, 30, 31,
18090 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33 2c   31, 32, 32, 33,
180a0 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20 20   33,./*  80 */  
180b0 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c 20  34, 34, 35, 35, 
180c0 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c 20  36, 36, 37, 37, 
180d0 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20 2a  38, 38,./*  90 *
180e0 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20 34  /  39, 39, 40, 4
180f0 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20 34  0, 41, 41, 42, 4
18100 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31 30  2, 43, 43,./* 10
18110 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34 35  0 */  44, 44, 45
18120 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34 37  , 45, 46, 46, 47
18130 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a  , 47, 48, 48,./*
18140 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39 2c   110 */  49, 49,
18150 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31 2c   50, 50, 51, 51,
18160 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33 2c   52, 52, 53, 53,
18170 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c 20  ./* 120 */  54, 
18180 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c 20  54, 55, 55, 56, 
18190 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f  56, 57, 57.};../
181a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
181b0 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64 61  length of the da
181c0 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ta corresponding
181d0 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64   to the supplied
181e0 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f   serial-type..*/
181f0 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65  .u32 sqlite3Vdbe
18200 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 33  SerialTypeLen(u3
18210 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a  2 serial_type){.
18220 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
18230 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72 65  e>=128 ){.    re
18240 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70  turn (serial_typ
18250 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73 65  e-12)/2;.  }else
18260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 65  {.    assert( se
18270 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20 20  rial_type<12 .  
18280 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71 6c            || sql
18290 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
182a0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3d  es[serial_type]=
182b0 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20  =(serial_type - 
182c0 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65 74  12)/2 );.    ret
182d0 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
182e0 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
182f0 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38  _type];.  }.}.u8
18300 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65 42   sqlite3VdbeOneB
18310 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  yteSerialTypeLen
18320 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65 29  (u8 serial_type)
18330 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65 72 69  {.  assert( seri
18340 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a 20  al_type<128 );. 
18350 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
18360 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18370 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a  rial_type];  .}.
18380 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72 65  ./*.** If we are
18390 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63 74   on an architect
183a0 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d 65  ure with mixed-e
183b0 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20 0a  ndian floating .
183c0 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20 41  ** points (ex: A
183d0 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20 74  RM7) then swap t
183e0 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65 73  he lower 4 bytes
183f0 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75 70   with the .** up
18400 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52 65  per 4 bytes.  Re
18410 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e  turn the result.
18420 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74 20  .**.** For most 
18430 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20 74  architectures, t
18440 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
18450 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20 20  **.** (later):  
18460 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20 74  It is reported t
18470 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d 69  o me that the mi
18480 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62 6c  xed-endian probl
18490 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69 73  em.** on ARM7 is
184a0 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20 47   an issue with G
184b0 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68 65  CC, not with the
184c0 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74 20   ARM7 chip.  It 
184d0 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65 61  seems.** that ea
184e0 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  rly versions of 
184f0 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20 74  GCC stored the t
18500 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36 34  wo words of a 64
18510 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e  -bit.** float in
18520 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65 72   the wrong order
18530 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72 6f  .  And that erro
18540 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70 61  r has been propa
18550 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73 69  gated.** ever si
18560 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65 20  nce.  The blame 
18570 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
18580 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68 6f  ly with GCC, tho
18590 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67 68  ugh..** GCC migh
185a0 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70 79  t have just copy
185b0 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20  ing the problem 
185c0 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f 6d  from a prior com
185d0 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20 61  piler..** I am a
185e0 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e 65  lso told that ne
185f0 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  wer versions of 
18600 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20  GCC that follow 
18610 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 41  a different.** A
18620 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65 20  BI get the byte 
18630 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a 0a  order right..**.
18640 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75 73  ** Developers us
18650 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61 6e  ing SQLite on an
18660 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f 6d   ARM7 should com
18670 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68 65  pile and run the
18680 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f  ir.** applicatio
18690 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  n using -DSQLITE
186a0 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61 73  _DEBUG=1 at leas
186b0 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44 45  t once.  With DE
186c0 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20  BUG.** enabled, 
186d0 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65 6c  some asserts bel
186e0 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20 74  ow will ensure t
186f0 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72 64  hat the byte ord
18700 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e  er of.** floatin
18710 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 69  g point values i
18720 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a  s correct..**.**
18730 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20 46   (2007-08-30)  F
18740 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68 61  rank van Vugt ha
18750 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20 70  s studied this p
18760 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a  roblem closely.*
18770 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20 68  * and has send h
18780 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20 74  is findings to t
18790 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c 6f  he SQLite develo
187a0 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20  pers.  Frank.** 
187b0 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d 65  writes that some
187c0 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20 6f   Linux kernels o
187d0 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ffer floating po
187e0 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a 20  int hardware.** 
187f0 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20 75  emulation that u
18800 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74 20  ses only 32-bit 
18810 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65 61  mantissas instea
18820 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a 20  d of a full .** 
18830 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75 69  48-bits as requi
18840 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45 20  red by the IEEE 
18850 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69 73  standard.  (This
18860 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46 49   is the.** CONFI
18870 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f 70  G_FPE_FASTFPE op
18880 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68 20  tion.)  On such 
18890 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69 6e  systems, floatin
188a0 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65 20  g point.** byte 
188b0 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65 73  swapping becomes
188c0 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74 65   very complicate
188d0 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72 6f  d.  To avoid pro
188e0 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e 65  blems,.** the ne
188f0 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77 61  cessary byte swa
18900 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65 64  pping is carried
18910 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34 2d   out using a 64-
18920 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 72  bit integer.** r
18930 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34 2d  ather than a 64-
18940 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61 6e  bit float.  Fran
18950 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68 61  k assures us tha
18960 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65 0a  t the code here.
18970 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69 6d  ** works for him
18980 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65 6c  .  We, the devel
18990 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20 77  opers, have no w
189a0 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65 6e  ay to independen
189b0 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74 68  tly.** verify th
189c0 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73 65  is, but Frank se
189d0 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61 74  ems to know what
189e0 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20 61   he is talking a
189f0 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74 72  bout.** so we tr
18a00 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64  ust him..*/.#ifd
18a10 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f  ef SQLITE_MIXED_
18a20 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f  ENDIAN_64BIT_FLO
18a30 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66 6c  AT.static u64 fl
18a40 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29 7b  oatSwap(u64 in){
18a50 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20 75  .  union {.    u
18a60 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69 5b  64 r;.    u32 i[
18a70 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33 32  2];.  } u;.  u32
18a80 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e 3b   t;..  u.r = in;
18a90 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20  .  t = u.i[0];. 
18aa0 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d   u.i[0] = u.i[1]
18ab0 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a  ;.  u.i[1] = t;.
18ac0 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a    return u.r;.}.
18ad0 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69 78  # define swapMix
18ae0 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29  edEndianFloat(X)
18af0 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70 28    X = floatSwap(
18b00 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
18b10 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
18b20 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69 66  nFloat(X).#endif
18b30 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
18b40 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61 74  e serialized dat
18b50 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20 76  a blob for the v
18b60 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70  alue stored in p
18b70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75 66  Mem into .** buf
18b80 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
18b90 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20  that the caller 
18ba0 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73 75  has allocated su
18bb0 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e 0a  fficient space..
18bc0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18bd0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
18be0 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75  itten..**.** nBu
18bf0 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74 20  f is the amount 
18c00 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69 6e  of space left in
18c10 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61 6c   buf[].  The cal
18c20 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62  ler is responsib
18c30 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63 61  le.** for alloca
18c40 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61 63  ting enough spac
18c50 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68 6f  e to buf[] to ho
18c60 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66 69  ld the entire fi
18c70 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a 2a  eld, exclusive.*
18c80 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e 75  * of the pMem->u
18c90 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f 72  .nZero bytes for
18ca0 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c 75   a MEM_Zero valu
18cb0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
18cc0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
18cd0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  tes actually wri
18ce0 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d 2e  tten into buf[].
18cf0 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
18d00 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
18d10 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69 6c  zero-filled tail
18d20 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e 20   is included in 
18d30 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
18d40 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f 73   only.** if thos
18d50 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65 72  e bytes were zer
18d60 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f  oed in buf[]..*/
18d70 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62   .u32 sqlite3Vdb
18d80 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a 62  eSerialPut(u8 *b
18d90 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75  uf, Mem *pMem, u
18da0 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
18db0 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f  .  u32 len;..  /
18dc0 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52 65  * Integer and Re
18dd0 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69  al */.  if( seri
18de0 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73 65  al_type<=7 && se
18df0 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a 20  rial_type>0 ){. 
18e00 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75 33     u64 v;.    u3
18e10 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65 72  2 i;.    if( ser
18e20 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
18e30 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
18e40 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28 70  eof(v)==sizeof(p
18e50 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20 20  Mem->u.r) );.   
18e60 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26 70     memcpy(&v, &p
18e70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f 66  Mem->u.r, sizeof
18e80 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61 70  (v));.      swap
18e90 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
18ea0 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  (v);.    }else{.
18eb0 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d 3e        v = pMem->
18ec0 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  u.i;.    }.    l
18ed0 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65 33  en = i = sqlite3
18ee0 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
18ef0 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 20  erial_type];.   
18f00 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a   assert( i>0 );.
18f10 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62 75      do{.      bu
18f20 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76 26  f[--i] = (u8)(v&
18f30 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20 3e  0xFF);.      v >
18f40 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c 65  >= 8;.    }while
18f50 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75 72  ( i );.    retur
18f60 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  n len;.  }..  /*
18f70 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20   String or blob 
18f80 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f  */.  if( serial_
18f90 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
18fa0 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 20  assert( pMem->n 
18fb0 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  + ((pMem->flags 
18fc0 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d  & MEM_Zero)?pMem
18fd0 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20 20  ->u.nZero:0).   
18fe0 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69 6e            == (in
18ff0 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  t)sqlite3VdbeSer
19000 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
19010 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20 6c  l_type) );.    l
19020 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  en = pMem->n;.  
19030 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d 65    if( len>0 ) me
19040 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
19050 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
19060 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
19070 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
19080 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
19090 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
190a0 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20   Input "x" is a 
190b0 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69  sequence of unsi
190c0 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20  gned characters 
190d0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61  that represent a
190e0 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  .** big-endian i
190f0 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20  nteger.  Return 
19100 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  the equivalent n
19110 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f  ative integer.*/
19120 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54  .#define ONE_BYT
19130 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38  E_INT(x)    ((i8
19140 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65  )(x)[0]).#define
19150 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29   TWO_BYTE_INT(x)
19160 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78      (256*(i8)((x
19170 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64  )[0])|(x)[1]).#d
19180 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45  efine THREE_BYTE
19190 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a  _INT(x)  (65536*
191a0 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
191b0 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29  )[1]<<8)|(x)[2])
191c0 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
191d0 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75  TE_UINT(x)  (((u
191e0 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
191f0 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
19200 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
19210 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
19220 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32  E_INT(x) (167772
19230 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  16*(i8)((x)[0])|
19240 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
19250 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
19260 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
19270 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
19280 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
19290 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
192a0 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
192b0 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
192c0 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
192d0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
192e0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
192f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
19300 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
19310 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61  nted as two sepa
19320 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f  rate routines fo
19330 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  r performance..*
19340 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20  * The few cases 
19350 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63  that require loc
19360 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  al variables are
19370 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
19380 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72   a separate.** r
19390 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69  outine so that i
193a0 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65  n most cases the
193b0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76   overhead of mov
193c0 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f  ing the stack po
193d0 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69  inter.** is avoi
193e0 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ded..*/ .static 
193f0 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  u32 SQLITE_NOINL
19400 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20  INE serialGet(. 
19410 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
19420 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
19430 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
19440 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
19450 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
19460 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
19470 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
19480 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
19490 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
194a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
194b0 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
194c0 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
194d0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  nto */.){.  u64 
194e0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
194f0 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79  NT(buf);.  u32 y
19500 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
19510 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20  T(buf+4);.  x = 
19520 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69  (x<<32) + y;.  i
19530 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
19540 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44  6 ){.    /* EVID
19550 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31  ENCE-OF: R-29851
19560 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20  -52272 Value is 
19570 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d  a big-endian 64-
19580 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d  bit.    ** twos-
19590 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
195a0 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d  er. */.    pMem-
195b0 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78  >u.i = *(i64*)&x
195c0 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
195d0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
195e0 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
195f0 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73  >u.i<0 );.  }els
19600 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  e{.    /* EVIDEN
19610 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34  CE-OF: R-57343-4
19620 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20  9114 Value is a 
19630 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20  big-endian IEEE 
19640 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a  754-2008 64-bit.
19650 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20      ** floating 
19660 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f  point number. */
19670 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
19680 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
19690 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
196a0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
196b0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
196c0 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
196d0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
196e0 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
196f0 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64  .    ** byte ord
19700 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
19710 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
19720 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
19730 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e   is.    ** defin
19740 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
19750 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
19760 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
19770 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64  mixed.    ** end
19780 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ian..    */.    
19790 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
197a0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
197b0 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
197c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
197d0 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
197e0 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
197f0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
19800 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
19810 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19820 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
19830 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
19840 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
19850 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
19860 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
19870 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
19880 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29  (pMem->u.r)==8 )
19890 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
198a0 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
198b0 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
198c0 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  >u.r, &x, sizeof
198d0 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  (x));.    pMem->
198e0 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
198f0 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  sNaN(pMem->u.r) 
19900 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
19910 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  _Real;.  }.  ret
19920 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c  urn 8;.}.u32 sql
19930 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
19940 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
19950 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
19960 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
19970 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
19980 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
19990 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
199a0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
199b0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
199c0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
199d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
199e0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
199f0 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
19a00 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
19a10 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
19a20 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
19a30 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
19a40 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
19a50 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
19a60 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
19a70 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
19a80 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
19a90 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20  /* Null */.     
19aa0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19ab0 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56   R-24078-09375 V
19ac0 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20  alue is a NULL. 
19ad0 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  */.      pMem->f
19ae0 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
19af0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19b00 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20    }.    case 1: 
19b10 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
19b20 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d  NCE-OF: R-44885-
19b30 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61  25196 Value is a
19b40 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d  n 8-bit twos-com
19b50 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a  plement.      **
19b60 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19b70 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f     pMem->u.i = O
19b80 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  NE_BYTE_INT(buf)
19b90 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19ba0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19bb0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19bc0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19bd0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
19be0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
19bf0 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e  { /* 2-byte sign
19c00 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19c10 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19c20 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32  OF: R-49794-3502
19c30 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  6 Value is a big
19c40 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20  -endian 16-bit. 
19c50 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19c60 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19c70 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19c80 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49  u.i = TWO_BYTE_I
19c90 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
19ca0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19cb0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
19cc0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
19cd0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
19ce0 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 2;.    }.    c
19cf0 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
19d00 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
19d10 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
19d20 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38  IDENCE-OF: R-378
19d30 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69  39-54301 Value i
19d40 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32  s a big-endian 2
19d50 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  4-bit.      ** t
19d60 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
19d70 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
19d80 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52   pMem->u.i = THR
19d90 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  EE_BYTE_INT(buf)
19da0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19db0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19dc0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19dd0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19de0 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20      return 3;.  
19df0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20    }.    case 4: 
19e00 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e  { /* 4-byte sign
19e10 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19e20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19e30 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37  OF: R-01849-2607
19e40 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  9 Value is a big
19e50 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20  -endian 32-bit. 
19e60 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19e70 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19e80 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19e90 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
19ea0 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65 66  INT(buf);.#ifdef
19eb0 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20 20   __HP_cc .      
19ec0 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20 61  /* Work around a
19ed0 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e 20   sign-extension 
19ee0 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63 6f  bug in the HP co
19ef0 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55 58  mpiler for HP/UX
19f00 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62 75   */.      if( bu
19f10 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65 6d  f[0]&0x80 ) pMem
19f20 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66 66  ->u.i |= 0xfffff
19f30 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a 23  fff80000000LL;.#
19f40 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65 6d  endif.      pMem
19f50 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
19f60 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
19f70 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
19f80 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 34  ;.      return 4
19f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
19fa0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
19fb0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
19fc0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
19fd0 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35 2d  NCE-OF: R-50385-
19fe0 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20 61  09674 Value is a
19ff0 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d 62   big-endian 48-b
1a000 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1a010 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1a020 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a030 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1a040 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29 20  YTE_UINT(buf+2) 
1a050 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29  + (((i64)1)<<32)
1a060 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75  *TWO_BYTE_INT(bu
1a070 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  f);.      pMem->
1a080 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
1a090 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1a0a0 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a   pMem->u.i<0 );.
1a0b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a        return 6;.
1a0c0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1a0d0 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  :   /* 8-byte si
1a0e0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1a0f0 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f 2a      case 7: { /*
1a100 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20 70   IEEE floating p
1a110 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  oint */.      /*
1a120 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61 6c   These use local
1a130 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20 64   variables, so d
1a140 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70 61  o them in a sepa
1a150 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20 20  rate routine.   
1a160 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20 68     ** to avoid h
1a170 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74 68  aving to move th
1a180 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72 20  e frame pointer 
1a190 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1a1a0 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  se */.      retu
1a1b0 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75 66  rn serialGet(buf
1a1c0 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d 65  ,serial_type,pMe
1a1d0 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  m);.    }.    ca
1a1e0 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74 65  se 8:    /* Inte
1a1f0 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61 73  ger 0 */.    cas
1a200 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65 67  e 9: {  /* Integ
1a210 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  er 1 */.      /*
1a220 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a230 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c 75  12976-22893 Valu
1a240 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
1a250 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20   0. */.      /* 
1a260 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31  EVIDENCE-OF: R-1
1a270 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75 65  8143-12121 Value
1a280 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 20   is the integer 
1a290 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  1. */.      pMem
1a2a0 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f 74  ->u.i = serial_t
1a2b0 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d 65  ype-8;.      pMe
1a2c0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a2d0 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  nt;.      return
1a2e0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   0;.    }.    de
1a2f0 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2f  fault: {.      /
1a300 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a310 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61 6c  -14606-31564 Val
1a320 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68 61  ue is a BLOB tha
1a330 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62 79  t is (N-12)/2 by
1a340 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  tes in.      ** 
1a350 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a 2a  length..      **
1a360 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a370 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c 75  28401-00140 Valu
1a380 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69 6e  e is a string in
1a390 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69   the text encodi
1a3a0 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ng and.      ** 
1a3b0 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20 69  (N-13)/2 bytes i
1a3c0 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20 20  n length. */.   
1a3d0 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
1a3e0 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b 20  u16 aFlag[] = { 
1a3f0 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68  MEM_Blob|MEM_Eph
1a400 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  em, MEM_Str|MEM_
1a410 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20 70  Ephem };.      p
1a420 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20 2a  Mem->z = (char *
1a430 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65 6d  )buf;.      pMem
1a440 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  ->n = (serial_ty
1a450 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20 20  pe-12)/2;.      
1a460 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61 46  pMem->flags = aF
1a470 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65 26  lag[serial_type&
1a480 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1];.      return
1a490 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a   pMem->n;.    }.
1a4a0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a4b0 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  }./*.** This rou
1a4c0 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
1a4d0 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63 69  allocate suffici
1a4e0 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61 6e  ent space for an
1a4f0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
1a500 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61 72  ** structure lar
1a510 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65 20  ge enough to be 
1a520 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74 65  used with sqlite
1a530 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63  3VdbeRecordUnpac
1a540 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66 69  k() if.** the fi
1a550 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
1a560 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65 79  a pointer to Key
1a570 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
1a580 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54  KeyInfo..**.** T
1a590 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74 68  he space is eith
1a5a0 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73 69  er allocated usi
1a5b0 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  ng sqlite3DbMall
1a5c0 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d 20  ocRaw() or from 
1a5d0 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75 6e  within.** the un
1a5e0 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20 70  aligned buffer p
1a5f0 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73 65  assed via the se
1a600 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20 61  cond and third a
1a610 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75 6d  rguments (presum
1a620 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73 70  ably.** stack sp
1a630 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f 72  ace). If the for
1a640 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72 65  mer, then *ppFre
1a650 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70 6f  e is set to a po
1a660 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75 6c  inter that shoul
1a670 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61 6c  d.** be eventual
1a680 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65 20  ly freed by the 
1a690 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
1a6a0 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f 72  ite3DbFree(). Or
1a6b0 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c 6c  , if the .** all
1a6c0 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66 72  ocation comes fr
1a6d0 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73 7a  om the pSpace/sz
1a6e0 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a 70  Space buffer, *p
1a6f0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1a700 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20 72  NULL.** before r
1a710 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1a720 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20  If an OOM error 
1a730 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73 20  occurs, NULL is 
1a740 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70  returned..*/.Unp
1a750 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71 6c  ackedRecord *sql
1a760 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e 70  ite3VdbeAllocUnp
1a770 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20 4b  ackedRecord(.  K
1a780 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1a790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1a7a0 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  * Description of
1a7b0 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a 20   the record */. 
1a7c0 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20 20   char *pSpace,  
1a7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a7e0 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73 70   /* Unaligned sp
1a7f0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f  ace available */
1a800 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c 20  .  int szSpace, 
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 53     /* Size of pS
1a830 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73 20  pace[] in bytes 
1a840 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46 72  */.  char **ppFr
1a850 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ee              
1a860 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61 6c       /* OUT: Cal
1a870 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65 20  ler should free 
1a880 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  this pointer */.
1a890 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  ){.  UnpackedRec
1a8a0 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20 20  ord *p;         
1a8b0 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
1a8c0 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75 72   record to retur
1a8d0 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66 3b  n */.  int nOff;
1a8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8f0 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d         /* Increm
1a900 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e 4f  ent pSpace by nO
1a910 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20 2a  ff to align it *
1a920 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20  /.  int nByte;  
1a930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a940 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1a950 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64 20   bytes required 
1a960 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20  for *p */..  /* 
1a970 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66 74  We want to shift
1a980 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53 70   the pointer pSp
1a990 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61 74  ace up such that
1a9a0 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61 6c   it is 8-byte al
1a9b0 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75 73  igned..  ** Thus
1a9c0 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61 6c  , we need to cal
1a9d0 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c 20  culate a value, 
1a9e0 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30 20  nOff, between 0 
1a9f0 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74 20  and 7, to shift 
1aa00 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49 66  .  ** it by.  If
1aa10 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65 61   pSpace is alrea
1aa20 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  dy 8-byte aligne
1aa30 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20 62  d, nOff should b
1aa40 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e  e zero..  */.  n
1aa50 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c 49  Off = (8 - (SQLI
1aa60 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 53  TE_PTR_TO_INT(pS
1aa70 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37 3b  pace) & 7)) & 7;
1aa80 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
1aa90 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1aaa0 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a 65  dRecord)) + size
1aab0 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e 66  of(Mem)*(pKeyInf
1aac0 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20 20  o->nField+1);.  
1aad0 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61 63  if( nByte>szSpac
1aae0 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70 20  e+nOff ){.    p 
1aaf0 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1ab00 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  d *)sqlite3DbMal
1ab10 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f 2d  locRaw(pKeyInfo-
1ab20 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  >db, nByte);.   
1ab30 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61 72   *ppFree = (char
1ab40 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21 70   *)p;.    if( !p
1ab50 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
1ab60 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28 55  else{.    p = (U
1ab70 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29 26  npackedRecord*)&
1ab80 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20  pSpace[nOff];.  
1ab90 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a 20    *ppFree = 0;. 
1aba0 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d 20   }..  p->aMem = 
1abb0 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29 70  (Mem*)&((char*)p
1abc0 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  )[ROUND8(sizeof(
1abd0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29 29  UnpackedRecord))
1abe0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  ];.  assert( pKe
1abf0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1ac00 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b 65  r!=0 );.  p->pKe
1ac10 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f  yInfo = pKeyInfo
1ac20 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1ac30 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1ac40 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   + 1;.  return p
1ac50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
1ac60 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20 65   the nKey-byte e
1ac70 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65 63  ncoding of a rec
1ac80 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20 70  ord in pKey[], p
1ac90 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a 20  opulate the .** 
1aca0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
1acb0 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61 74  tructure indicat
1acc0 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74 68  ed by the fourth
1acd0 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20 74   argument with t
1ace0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
1acf0 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72 65  f the decoded re
1ad00 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73  cord..*/ .void s
1ad10 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1ad20 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e 66  Unpack(.  KeyInf
1ad30 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
1ad40 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
1ad50 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72 64  about the record
1ad60 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e 74   format */.  int
1ad70 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20   nKey,          
1ad80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
1ad90 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72 64  he binary record
1ada0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1adb0 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20   *pKey,      /* 
1adc0 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  The binary recor
1add0 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  d */.  UnpackedR
1ade0 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f 2a  ecord *p      /*
1adf0 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20 73   Populate this s
1ae00 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65 20  tructure before 
1ae10 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b  returning. */.){
1ae20 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1ae30 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28  d char *aKey = (
1ae40 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1ae50 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69 6e  har *)pKey;.  in
1ae60 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78 3b  t d; .  u32 idx;
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1ae90 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20 72  t in aKey[] to r
1aea0 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 31  ead from */.  u1
1aeb0 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20  6 u;            
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aed0 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63   Unsigned loop c
1aee0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20  ounter */.  u32 
1aef0 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d  szHdr;.  Mem *pM
1af00 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20  em = p->aMem;.. 
1af10 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 3d   p->default_rc =
1af20 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45 49   0;.  assert( EI
1af30 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
1af40 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69 64  NT(pMem) );.  id
1af50 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1af60 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1af70 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20 3d  d = szHdr;.  u =
1af80 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   0;.  while( idx
1af90 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b 65  <szHdr && d<=nKe
1afa0 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65 72  y ){.    u32 ser
1afb0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 69  ial_type;..    i
1afc0 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  dx += getVarint3
1afd0 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73 65  2(&aKey[idx], se
1afe0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1aff0 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65 79  pMem->enc = pKey
1b000 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 70  Info->enc;.    p
1b010 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49 6e  Mem->db = pKeyIn
1b020 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20 70  fo->db;.    /* p
1b030 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 20  Mem->flags = 0; 
1b040 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  // sqlite3VdbeSe
1b050 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20 73  rialGet() will s
1b060 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20 2a  et this for us *
1b070 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61  /.    pMem->szMa
1b080 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 64 20  lloc = 0;.    d 
1b090 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1b0a0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b 64 5d  rialGet(&aKey[d]
1b0b0 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 70  , serial_type, p
1b0c0 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b  Mem);.    pMem++
1b0d0 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75 29 3e  ;.    if( (++u)>
1b0e0 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62 72 65  =p->nField ) bre
1b0f0 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  ak;.  }.  assert
1b100 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ( u<=pKeyInfo->n
1b110 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20 20 70  Field + 1 );.  p
1b120 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a  ->nField = u;.}.
1b130 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55  .#if SQLITE_DEBU
1b140 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  G./*.** This fun
1b150 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1b160 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61 62 6c  wo index or tabl
1b170 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20 69 6e  e record keys in
1b180 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a 2a 2a   the same way.**
1b190 20 61 73 20 74 68 65 20 73 71 6c 69 74 65 33 56   as the sqlite3V
1b1a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b1b0 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e 6c 69  () routine. Unli
1b1c0 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  ke VdbeRecordCom
1b1d0 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69 73 20  pare(),.** this 
1b1e0 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61  function deseria
1b1f0 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70 61 72  lizes and compar
1b200 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e 67 20  es values using 
1b210 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  the.** sqlite3Vd
1b220 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 61 6e  beSerialGet() an
1b230 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  d sqlite3MemComp
1b240 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e  are() functions.
1b250 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a 20 69   It is used.** i
1b260 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1b270 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20  ments to ensure 
1b280 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d 69 7a  that the optimiz
1b290 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20 73 71  ed code in.** sq
1b2a0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1b2b0 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72 6e 73  ompare() returns
1b2c0 20 72 65 73 75 6c 74 73 20 77 69 74 68 20 74 68   results with th
1b2d0 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74 69 76  ese two primitiv
1b2e0 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  es..**.** Return
1b2f0 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 73   true if the res
1b300 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 73 6f  ult of compariso
1b310 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  n is equivalent 
1b320 74 6f 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  to desiredResult
1b330 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73  ..** Return fals
1b340 65 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  e if there is a 
1b350 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f  disagreement..*/
1b360 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1b370 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62  RecordCompareDeb
1b380 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c  ug(.  int nKey1,
1b390 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1b3a0 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  y1, /* Left key 
1b3b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70 61 63  */.  const Unpac
1b3c0 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1b3d0 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20  2, /* Right key 
1b3e0 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72 65 64  */.  int desired
1b3f0 52 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 20  Result          
1b400 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20 61 6e     /* Correct an
1b410 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  swer */.){.  u32
1b420 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1b430 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1b440 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1b450 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1b460 75 33 32 20 69 64 78 31 3b 20 20 20 20 20 20 20  u32 idx1;       
1b470 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
1b480 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
1b490 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e 74 20   header element 
1b4a0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b  */.  u32 szHdr1;
1b4b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1b4c0 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 68 65  r of bytes in he
1b4d0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 20  ader */.  int i 
1b4e0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
1b4f0 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  0;.  const unsig
1b500 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1b510 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1b520 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1b530 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1b540 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  nfo;.  Mem mem1;
1b550 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ..  pKeyInfo = p
1b560 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1b570 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  .  if( pKeyInfo-
1b580 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  >db==0 ) return 
1b590 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20  1;.  mem1.enc = 
1b5a0 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1b5b0 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49   mem1.db = pKeyI
1b5c0 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65  nfo->db;.  /* me
1b5d0 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20 20 2f  m1.flags = 0;  /
1b5e0 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74 69 61  / Will be initia
1b5f0 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33  lized by sqlite3
1b600 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b610 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  */.  VVA_ONLY( m
1b620 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1b630 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1b640 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1b650 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20  tatements */..  
1b660 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d 61 79  /* Compilers may
1b670 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74 20 6d   complain that m
1b680 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74 65 6e  em1.u.i is poten
1b690 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69 61 6c  tially uninitial
1b6a0 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20 63 6f  ized..  ** We co
1b6b0 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69  uld initialize i
1b6c0 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65 72 65  t, as shown here
1b6d0 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74 68 6f  , to silence tho
1b6e0 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20  se complaints.. 
1b6f0 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63 74 2c   ** But in fact,
1b700 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c 20 6e   mem1.u.i will n
1b710 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20 62 65  ever actually be
1b720 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61 6c 69   used uninitiali
1b730 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67 20 0a  zed, and doing .
1b740 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63 65 73    ** the unneces
1b750 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a 61 74  sary initializat
1b760 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73 75 72  ion has a measur
1b770 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20 70 65  able negative pe
1b780 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a 20 69  rformance.  ** i
1b790 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74 68 69  mpact, since thi
1b7a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
1b7b0 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65 72 2e  ery high runner.
1b7c0 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63 68 6f    And so, we cho
1b7d0 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67 6e 6f  ose.  ** to igno
1b7e0 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  re the compiler 
1b7f0 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c 65 61  warnings and lea
1b800 76 65 20 74 68 69 73 20 76 61 72 69 61 62 6c 65  ve this variable
1b810 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1b820 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e    */.  /*  mem1.
1b830 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74  u.i = 0;  // not
1b840 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20 74 6f   needed, here to
1b850 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69 6c 65   silence compile
1b860 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a  r warning */.  .
1b870 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1b880 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1b890 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48 64 72  r1);.  if( szHdr
1b8a0 31 3e 39 38 33 30 37 20 29 20 72 65 74 75 72 6e  1>98307 ) return
1b8b0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
1b8c0 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a  .  d1 = szHdr1;.
1b8d0 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1b8e0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1b8f0 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50  nfo->nXField>=pP
1b900 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20  Key2->nField || 
1b910 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1b920 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1b930 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20  ->aSortOrder!=0 
1b940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1b950 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1b960 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1b970 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1b980 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1b990 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1b9a0 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a 20 52  type1;..    /* R
1b9b0 65 61 64 20 74 68 65 20 73 65 72 69 61 6c 20 74  ead the serial t
1b9c0 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e 65 78  ypes for the nex
1b9d0 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65 61 63  t element in eac
1b9e0 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20 69 64  h key. */.    id
1b9f0 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33  x1 += getVarint3
1ba00 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c 20 73  2( aKey1+idx1, s
1ba10 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b 0a 0a  erial_type1 );..
1ba20 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68      /* Verify th
1ba30 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
1ba40 67 68 20 6b 65 79 20 73 70 61 63 65 20 72 65 6d  gh key space rem
1ba50 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69 64 0a  aining to avoid.
1ba60 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65 72 20      ** a buffer 
1ba70 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65 20 22  overread.  The "
1ba80 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
1ba90 32 22 20 73 75 62 65 78 70 72 65 73 73 69 6f 6e  2" subexpression
1baa0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61 6c 77   will.    ** alw
1bab0 61 79 73 20 62 65 20 67 72 65 61 74 65 72 20 74  ays be greater t
1bac0 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1bad0 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 72 65  the amount of re
1bae0 71 75 69 72 65 64 20 6b 65 79 20 73 70 61 63 65  quired key space
1baf0 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74 68 61  ..    ** Use tha
1bb00 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20  t approximation 
1bb10 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d 6f 72  to avoid the mor
1bb20 65 20 65 78 70 65 6e 73 69 76 65 20 63 61 6c 6c  e expensive call
1bb30 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
1bb40 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1bb50 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63 6f 6d  Len() in the com
1bb60 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  mon case..    */
1bb70 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65 72 69  .    if( d1+seri
1bb80 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33 32 29  al_type1+2>(u32)
1bb90 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20 64 31  nKey1.     && d1
1bba0 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69  +sqlite3VdbeSeri
1bbb0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
1bbc0 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e 4b 65  _type1)>(u32)nKe
1bbd0 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  y1 .    ){.     
1bbe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1bbf0 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68     /* Extract th
1bc00 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 63  e values to be c
1bc10 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ompared..    */.
1bc20 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65      d1 += sqlite
1bc30 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1bc40 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1bc50 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31 29 3b  l_type1, &mem1);
1bc60 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
1bc70 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20 20 2a  comparison.    *
1bc80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
1bc90 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26 6d 65  e3MemCompare(&me
1bca0 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61 4d 65  m1, &pPKey2->aMe
1bcb0 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e  m[i], pKeyInfo->
1bcc0 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 69  aColl[i]);.    i
1bcd0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1bce0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1bcf0 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f  zMalloc==0 );  /
1bd00 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65  * See comment be
1bd10 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  low */.      if(
1bd20 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1bd30 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20  Order[i] ){.    
1bd40 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20 20 2f      rc = -rc;  /
1bd50 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72 65 73  * Invert the res
1bd60 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73 6f 72  ult for DESC sor
1bd70 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20 20 20  t order. */.    
1bd80 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 64    }.      goto d
1bd90 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3b 0a  ebugCompareEnd;.
1bda0 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20      }.    i++;. 
1bdb0 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 73 7a   }while( idx1<sz
1bdc0 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1bdd0 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20 20 2f  ->nField );..  /
1bde0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1bdf0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1be00 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1be10 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1be20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1be30 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1be40 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1be50 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1be60 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1be70 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1be80 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1be90 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1bea0 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  m1)..  */.  asse
1beb0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1bec0 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1bed0 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1bee0 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 6b  hat one of the k
1bef0 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66  eys ran out of f
1bf00 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61  ields and.  ** a
1bf10 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70  ll the fields up
1bf20 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77   to that point w
1bf30 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72  ere equal. Retur
1bf40 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63  n the default_rc
1bf50 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f  .  ** value.  */
1bf60 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32 2d 3e  .  rc = pPKey2->
1bf70 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64 65 62  default_rc;..deb
1bf80 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a 20 20  ugCompareEnd:.  
1bf90 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1bfa0 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20 29 20  t==0 && rc==0 ) 
1bfb0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1bfc0 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c 30 20  desiredResult<0 
1bfd0 26 26 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  && rc<0 ) return
1bfe0 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1bff0 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72 63 3e  dResult>0 && rc>
1c000 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c010 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29  if( CORRUPT_DB )
1c020 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
1c030 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d   pKeyInfo->db->m
1c040 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
1c050 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
1c060 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69   0;.}.#endif..#i
1c070 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
1c080 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e  *.** Count the n
1c090 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 20  umber of fields 
1c0a0 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29  (a.k.a. columns)
1c0b0 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64 20 67   in the record g
1c0c0 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65 79 2c  iven by.** pKey,
1c0d0 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72 69 66  nKey.  The verif
1c0e0 79 20 74 68 61 74 20 74 68 69 73 20 63 6f 75 6e  y that this coun
1c0f0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 6f  t is less than o
1c100 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 0a 2a  r equal to the.*
1c110 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20 62 79  * limit given by
1c120 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1c130 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  d + pKeyInfo->nX
1c140 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  Field..**.** If 
1c150 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
1c160 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69 65 64  is not satisfied
1c170 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
1c180 74 68 65 20 68 69 67 68 2d 73 70 65 65 64 0a 2a  the high-speed.*
1c190 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  * vdbeRecordComp
1c1a0 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 64 62  areInt() and vdb
1c1b0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  eRecordCompareSt
1c1c0 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65 73 20  ring() routines 
1c1d0 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b  will.** not work
1c1e0 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 66 20   correctly.  If 
1c1f0 74 68 69 73 20 61 73 73 65 72 74 28 29 20 65 76  this assert() ev
1c200 65 72 20 66 69 72 65 73 2c 20 69 74 20 70 72 6f  er fires, it pro
1c210 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a 20 74  bably means.** t
1c220 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66 6f 2e  hat the KeyInfo.
1c230 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49 6e 66  nField or KeyInf
1c240 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75 65 73  o.nXField values
1c250 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64 0a 2a   were computed.*
1c260 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  * incorrectly..*
1c270 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
1c280 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75  beAssertFieldCou
1c290 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 0a  ntWithinLimits(.
1c2a0 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f 6e 73    int nKey, cons
1c2b0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1c2c0 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20 74 6f  /* The record to
1c2d0 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20 63 6f   verify */ .  co
1c2e0 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  nst KeyInfo *pKe
1c2f0 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a 20 43  yInfo       /* C
1c300 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69 74 68  ompare size with
1c310 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20 2a 2f   this KeyInfo */
1c320 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65 6c 64  .){.  int nField
1c330 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a 48 64   = 0;.  u32 szHd
1c340 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a 20 20  r;.  u32 idx;.  
1c350 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20 20 63  u32 notUsed;.  c
1c360 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1c370 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1c380 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  t unsigned char*
1c390 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20 43 4f  )pKey;..  if( CO
1c3a0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1c3b0 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74 56 61  n;.  idx = getVa
1c3c0 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73 7a 48  rint32(aKey, szH
1c3d0 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  dr);.  assert( n
1c3e0 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
1c3f0 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33 32 29  rt( szHdr<=(u32)
1c400 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c 65 28  nKey );.  while(
1c410 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a 20 20   idx<szHdr ){.  
1c420 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
1c430 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c 20 6e  nt32(aKey+idx, n
1c440 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e 46 69  otUsed);.    nFi
1c450 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61 73 73  eld++;.  }.  ass
1c460 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d 20 70  ert( nField <= p
1c470 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1c480 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1c490 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64  d );.}.#else.# d
1c4a0 65 66 69 6e 65 20 76 64 62 65 41 73 73 65 72 74  efine vdbeAssert
1c4b0 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e  FieldCountWithin
1c4c0 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a 23 65  Limits(A,B,C).#e
1c4d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68  ndif../*.** Both
1c4e0 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65   *pMem1 and *pMe
1c4f0 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e  m2 contain strin
1c500 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72  g values. Compar
1c510 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73  e the two values
1c520 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f  .** using the co
1c530 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1c540 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c   pColl. As usual
1c550 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74  , return a negat
1c560 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  ive , zero.** or
1c570 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20   positive value 
1c580 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73  if *pMem1 is les
1c590 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1c5a0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
1c5b0 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73   .** *pMem2, res
1c5c0 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c  pectively. Simil
1c5d0 61 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20  ar in spirit to 
1c5e0 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d  "rc = (*pMem1) -
1c5f0 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a   (*pMem2);"..*/.
1c600 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
1c610 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1c620 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1c630 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d  em1,.  const Mem
1c640 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74   *pMem2,.  const
1c650 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c   CollSeq *pColl,
1c660 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20  .  u8 *prcErr   
1c670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c680 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20     /* If an OOM 
1c690 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53  occurs, set to S
1c6a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29  QLITE_NOMEM */.)
1c6b0 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65  {.  if( pMem1->e
1c6c0 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29  nc==pColl->enc )
1c6d0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72  {.    /* The str
1c6e0 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79  ings are already
1c6f0 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20   in the correct 
1c700 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20  encoding.  Call 
1c710 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70  the.     ** comp
1c720 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  arison function 
1c730 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20  directly */.    
1c740 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43  return pColl->xC
1c750 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c  mp(pColl->pUser,
1c760 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e  pMem1->n,pMem1->
1c770 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32  z,pMem2->n,pMem2
1c780 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ->z);.  }else{. 
1c790 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63     int rc;.    c
1c7a0 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a  onst void *v1, *
1c7b0 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20  v2;.    int n1, 
1c7c0 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a  n2;.    Mem c1;.
1c7d0 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20      Mem c2;.    
1c7e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e  sqlite3VdbeMemIn
1c7f0 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64  it(&c1, pMem1->d
1c800 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20  b, MEM_Null);.  
1c810 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c820 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d  Init(&c2, pMem1-
1c830 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1c840 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c850 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1c860 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70  1, pMem1, MEM_Ep
1c870 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  hem);.    sqlite
1c880 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43  3VdbeMemShallowC
1c890 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20  opy(&c2, pMem2, 
1c8a0 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20  MEM_Ephem);.    
1c8b0 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v1 = sqlite3Valu
1c8c0 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1c8d0 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c  alue*)&c1, pColl
1c8e0 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d  ->enc);.    n1 =
1c8f0 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e   v1==0 ? 0 : c1.
1c900 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69  n;.    v2 = sqli
1c910 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1c920 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32  lite3_value*)&c2
1c930 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1c940 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20     n2 = v2==0 ? 
1c950 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63  0 : c2.n;.    rc
1c960 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70   = pColl->xCmp(p
1c970 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c  Coll->pUser, n1,
1c980 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20   v1, n2, v2);.  
1c990 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20    if( (v1==0 || 
1c9a0 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72  v2==0) && prcErr
1c9b0 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c   ) *prcErr = SQL
1c9c0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
1c9d0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c9e0 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29 3b 0a  emRelease(&c1);.
1c9f0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ca00 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29 3b 0a  emRelease(&c2);.
1ca10 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ca20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
1ca30 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e 20 20  are two blobs.  
1ca40 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76 65 2c  Return negative,
1ca50 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69   zero, or positi
1ca60 76 65 20 69 66 20 74 68 65 20 66 69 72 73 74 0a  ve if the first.
1ca70 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  ** is less than,
1ca80 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1ca90 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73  eater than the s
1caa0 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74 69 76  econd, respectiv
1cab0 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65 20 62  ely..** If one b
1cac0 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69 78 20  lob is a prefix 
1cad0 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20 74 68  of the other, th
1cae0 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72 20 69  en the shorter i
1caf0 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a 2a 2f  s the lessor..*/
1cb00 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e  .static SQLITE_N
1cb10 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71 6c 69  OINLINE int sqli
1cb20 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65 28 63  te3BlobCompare(c
1cb30 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c 20 63  onst Mem *pB1, c
1cb40 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29 7b 0a  onst Mem *pB2){.
1cb50 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63 6d 70    int c = memcmp
1cb60 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e 7a 2c  (pB1->z, pB2->z,
1cb70 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e 20 3f   pB1->n>pB2->n ?
1cb80 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d 3e 6e   pB2->n : pB1->n
1cb90 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72 65 74  );.  if( c ) ret
1cba0 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72 6e 20  urn c;.  return 
1cbb0 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e 6e 3b  pB1->n - pB2->n;
1cbc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 63  .}../*.** Do a c
1cbd0 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77 65 65  omparison betwee
1cbe0 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67 6e 65  n a 64-bit signe
1cbf0 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20 61 20  d integer and a 
1cc00 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67 2d  64-bit floating-
1cc10 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65 72 2e  point.** number.
1cc20 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1cc30 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1cc40 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1cc50 74 20 28 69 36 34 29 20 69 73 20 6c 65 73 73 20  t (i64) is less 
1cc60 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c 20 74  than,.** equal t
1cc70 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1cc80 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 28 64  an the second (d
1cc90 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  ouble)..*/.stati
1cca0 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 74  c int sqlite3Int
1ccb0 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69 36 34  FloatCompare(i64
1ccc0 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b 0a 20   i, double r){. 
1ccd0 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f 4e 47   if( sizeof(LONG
1cce0 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38 20 29  DOUBLE_TYPE)>8 )
1ccf0 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42 4c 45  {.    LONGDOUBLE
1cd00 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e 47 44  _TYPE x = (LONGD
1cd10 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a 20 20  OUBLE_TYPE)i;.  
1cd20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65 74 75    if( x<r ) retu
1cd30 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 78  rn -1;.    if( x
1cd40 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  >r ) return +1;.
1cd50 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1cd60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34 20 79  }else{.    i64 y
1cd70 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73 3b 0a  ;.    double s;.
1cd80 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32 33 33      if( r<-92233
1cd90 37 32 30 33 36 38 35 34 37 37 35 38 30 38 2e 30  72036854775808.0
1cda0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1cdb0 20 20 69 66 28 20 72 3e 39 32 32 33 33 37 32 30    if( r>92233720
1cdc0 33 36 38 35 34 37 37 35 38 30 37 2e 30 20 29 20  36854775807.0 ) 
1cdd0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 79  return -1;.    y
1cde0 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20 20 69   = (i64)r;.    i
1cdf0 66 28 20 69 3c 79 20 29 20 72 65 74 75 72 6e 20  f( i<y ) return 
1ce00 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e 79 20  -1;.    if( i>y 
1ce10 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79 3d 3d  ){.      if( y==
1ce20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34 20 26  SMALLEST_INT64 &
1ce30 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75 72 6e  & r>0.0 ) return
1ce40 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   -1;.      retur
1ce50 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n +1;.    }.    
1ce60 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b 0a 20  s = (double)i;. 
1ce70 20 20 20 69 66 28 20 73 3c 72 20 29 20 72 65 74     if( s<r ) ret
1ce80 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1ce90 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  s>r ) return +1;
1cea0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1ceb0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70   }.}../*.** Comp
1cec0 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 63  are the values c
1ced0 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65 20  ontained by the 
1cee0 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73  two memory cells
1cef0 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20 6e  , returning.** n
1cf00 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f 72  egative, zero or
1cf10 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d 65   positive if pMe
1cf20 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
1cf30 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72   equal to, or gr
1cf40 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70 4d  eater.** than pM
1cf50 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72 64  em2. Sorting ord
1cf60 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69 72  er is NULL's fir
1cf70 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  st, followed by 
1cf80 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65 72  numbers (integer
1cf90 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29 20  s.** and reals) 
1cfa0 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61 6c  sorted numerical
1cfb0 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ly, followed by 
1cfc0 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79 20  text ordered by 
1cfd0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  the collating.**
1cfe0 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20   sequence pColl 
1cff0 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f 62  and finally blob
1d000 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d 65  's ordered by me
1d010 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 77  mcmp()..**.** Tw
1d020 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61 72  o NULL values ar
1d030 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71 75  e considered equ
1d040 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  al by this funct
1d050 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
1d060 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63 6f  te3MemCompare(co
1d070 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 20  nst Mem *pMem1, 
1d080 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
1d090 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20  , const CollSeq 
1d0a0 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20 66  *pColl){.  int f
1d0b0 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f 6d  1, f2;.  int com
1d0c0 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20 20  bined_flags;..  
1d0d0 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61 67  f1 = pMem1->flag
1d0e0 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32 2d  s;.  f2 = pMem2-
1d0f0 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69 6e  >flags;.  combin
1d100 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66 32  ed_flags = f1|f2
1d110 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f 6d  ;.  assert( (com
1d120 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d 45  bined_flags & ME
1d130 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b 0a  M_RowSet)==0 );.
1d140 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76 61   .  /* If one va
1d150 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74 20  lue is NULL, it 
1d160 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68 65  is less than the
1d170 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68 20   other. If both 
1d180 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65 20  values.  ** are 
1d190 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e 0a  NULL, return 0..
1d1a0 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69    */.  if( combi
1d1b0 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e 75  ned_flags&MEM_Nu
1d1c0 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ll ){.    return
1d1d0 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20 2d   (f2&MEM_Null) -
1d1e0 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a   (f1&MEM_Null);.
1d1f0 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c 65 61    }..  /* At lea
1d200 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 77  st one of the tw
1d210 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20 6e 75  o values is a nu
1d220 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66 28 20  mber.  */.  if( 
1d230 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28  combined_flags&(
1d240 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c  MEM_Int|MEM_Real
1d250 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31  ) ){.    if( (f1
1d260 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e 74 29   & f2 & MEM_Int)
1d270 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1d280 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20 70 4d   pMem1->u.i < pM
1d290 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72  em2->u.i ) retur
1d2a0 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20  n -1;.      if( 
1d2b0 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70 4d 65  pMem1->u.i > pMe
1d2c0 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75 72 6e  m2->u.i ) return
1d2d0 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1d2e0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 0;.    }.    i
1d2f0 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45  f( (f1 & f2 & ME
1d300 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1d310 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1d320 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 72 20  .r < pMem2->u.r 
1d330 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d340 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1d350 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72 20 29  r > pMem2->u.r )
1d360 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d370 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1d380 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1d390 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20  M_Int)!=0 ){.   
1d3a0 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 52     if( (f2&MEM_R
1d3b0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1d3c0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1d3d0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1d3e0 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70 4d 65  (pMem1->u.i, pMe
1d3f0 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  m2->u.r);.      
1d400 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1d410 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d420 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1d430 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f1&MEM_Real)!=0
1d440 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1d450 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  2&MEM_Int)!=0 ){
1d460 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d470 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
1d480 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d 3e 75  Compare(pMem2->u
1d490 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72 29 3b  .i, pMem1->u.r);
1d4a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1d4b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1d4c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d4d0 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20     return +1;.  
1d4e0 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  }..  /* If one v
1d4f0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
1d500 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72 20 69   and the other i
1d510 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20 73 74  s a blob, the st
1d520 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a 20 20  ring is less..  
1d530 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 73  ** If both are s
1d540 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72 65 20  trings, compare 
1d550 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1d560 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20  ing functions.. 
1d570 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1d580 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72  ed_flags&MEM_Str
1d590 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66 31 20   ){.    if( (f1 
1d5a0 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b  & MEM_Str)==0 ){
1d5b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
1d5c0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d5d0 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f2 & MEM_Str)==0
1d5e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1d5f0 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   -1;.    }..    
1d600 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1d610 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63 20 7c  nc==pMem2->enc |
1d620 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d 61 6c  | pMem1->db->mal
1d630 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1d640 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e   assert( pMem1->
1d650 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
1d660 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20   || .           
1d670 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1d680 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70  ITE_UTF16LE || p
1d690 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54  Mem1->enc==SQLIT
1d6a0 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20  E_UTF16BE );..  
1d6b0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69    /* The collati
1d6c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74  on sequence must
1d6d0 20 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74   be defined at t
1d6e0 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20  his point, even 
1d6f0 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73  if.    ** the us
1d700 65 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63  er deletes the c
1d710 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1d720 65 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65  e after the vdbe
1d730 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20   program is.    
1d740 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69  ** compiled (thi
1d750 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73  s was not always
1d760 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20   the case)..    
1d770 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  */.    assert( !
1d780 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e  pColl || pColl->
1d790 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28  xCmp );..    if(
1d7a0 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20   pColl ){.      
1d7b0 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61  return vdbeCompa
1d7c0 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d  reMemString(pMem
1d7d0 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c  1, pMem2, pColl,
1d7e0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f   0);.    }.    /
1d7f0 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  * If a NULL poin
1d800 74 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61  ter was passed a
1d810 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75  s the collate fu
1d820 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72  nction, fall thr
1d830 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74  ough.    ** to t
1d840 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64  he blob case and
1d850 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20   use memcmp().  
1d860 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f  */.  }. .  /* Bo
1d870 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62  th values must b
1d880 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72  e blobs.  Compar
1d890 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29  e using memcmp()
1d8a0 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73  .  */.  return s
1d8b0 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1d8c0 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b  e(pMem1, pMem2);
1d8d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .}.../*.** The f
1d8e0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
1d8f0 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
1d900 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61  ction is a seria
1d910 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63  l-type that.** c
1d920 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e  orresponds to an
1d930 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76   integer - all v
1d940 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20  alues between 1 
1d950 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20  and 9 inclusive 
1d960 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68  .** except 7. Th
1d970 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20  e second points 
1d980 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
1d990 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65  aining an intege
1d9a0 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61  r value.** seria
1d9b0 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20  lized according 
1d9c0 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20  to serial_type. 
1d9d0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
1d9e0 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e  serializes.** an
1d9f0 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61  d returns the va
1da00 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lue..*/.static i
1da10 36 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63  64 vdbeRecordDec
1da20 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61  odeInt(u32 seria
1da30 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38  l_type, const u8
1da40 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79   *aKey){.  u32 y
1da50 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52  ;.  assert( CORR
1da60 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61  UPT_DB || (seria
1da70 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72  l_type>=1 && ser
1da80 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73  ial_type<=9 && s
1da90 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29  erial_type!=7) )
1daa0 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  ;.  switch( seri
1dab0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
1dac0 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20  ase 0:.    case 
1dad0 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  1:.      testcas
1dae0 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1daf0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1db00 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  ONE_BYTE_INT(aKe
1db10 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a  y);.    case 2:.
1db20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1db30 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1db40 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f        return TWO
1db50 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b  _BYTE_INT(aKey);
1db60 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20  .    case 3:.   
1db70 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1db80 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1db90 20 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f     return THREE_
1dba0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1dbb0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20      case 4: {.  
1dbc0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1dbd0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1dbe0 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54      y = FOUR_BYT
1dbf0 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  E_UINT(aKey);.  
1dc00 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1dc10 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d  *(int*)&y;.    }
1dc20 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20  .    case 5: {. 
1dc30 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1dc40 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1dc50 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52       return FOUR
1dc60 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b  _BYTE_UINT(aKey+
1dc70 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
1dc80 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
1dc90 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20  (aKey);.    }.  
1dca0 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20    case 6: {.    
1dcb0 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42    u64 x = FOUR_B
1dcc0 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1dcd0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1dce0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1dcf0 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1dd00 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1dd10 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1dd20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28    return (i64)*(
1dd30 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20  i64*)&x;.    }. 
1dd40 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65   }..  return (se
1dd50 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a  rial_type - 8);.
1dd60 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
1dd70 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20  nction compares 
1dd80 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f  the two table ro
1dd90 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f  ws or index reco
1dda0 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  rds.** specified
1ddb0 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79   by {nKey1, pKey
1ddc0 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20  1} and pPKey2.  
1ddd0 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  It returns a neg
1dde0 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f  ative, zero.** o
1ddf0 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67  r positive integ
1de00 65 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65  er if key1 is le
1de10 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1de20 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72  o or .** greater
1de30 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65   than key2.  The
1de40 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20   {nKey1, pKey1} 
1de50 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c  key must be a bl
1de60 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79  ob.** created by
1de70 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1de80 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65  rd opcode of the
1de90 20 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65   VDBE.  The pPKe
1dea0 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62  y2.** key must b
1deb0 65 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73  e a parsed key s
1dec0 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20  uch as obtained 
1ded0 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
1dee0 64 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a  dbeParseRecord..
1def0 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e  **.** If argumen
1df00 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a  t bSkip is non-z
1df10 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d  ero, it is assum
1df20 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c  ed that the call
1df30 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a  er has already.*
1df40 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  * determined tha
1df50 74 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  t the first fiel
1df60 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61  ds of the keys a
1df70 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20  re equal..**.** 
1df80 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f  Key1 and Key2 do
1df90 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e   not have to con
1dfa0 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75  tain the same nu
1dfb0 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20  mber of fields. 
1dfc0 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64  If all .** field
1dfd0 73 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e  s that appear in
1dfe0 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65   both keys are e
1dff0 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79  qual, then pPKey
1e000 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73  2->default_rc is
1e010 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a   .** returned..*
1e020 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65  *.** If database
1e030 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1e040 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70  iscovered, set p
1e050 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74  PKey2->errCode t
1e060 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52  o .** SQLITE_COR
1e070 52 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20  RUPT and return 
1e080 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  0. If an OOM err
1e090 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1e0a0 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65  d, .** pPKey2->e
1e0b0 72 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f  rrCode is set to
1e0c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e   SQLITE_NOMEM an
1e0d0 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  d, if it is not 
1e0e0 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c  NULL, the.** mal
1e0f0 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20  loc-failed flag 
1e100 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  set on database 
1e110 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e  handle (pPKey2->
1e120 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a  pKeyInfo->db)..*
1e130 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1e140 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1e150 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b  thSkip(.  int nK
1e160 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1e170 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1e180 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1e190 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1e1a0 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2,         /* Ri
1e1b0 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74  ght key */.  int
1e1c0 20 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20   bSkip          
1e1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e1e0 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68  If true, skip th
1e1f0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f  e first field */
1e200 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e220 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e230 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
1e240 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74  ext data element
1e250 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
1e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e270 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
1e280 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20  f next field to 
1e290 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32  compare */.  u32
1e2a0 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20   szHdr1;        
1e2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e2c0 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68  Size of record h
1e2d0 65 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a  eader in bytes *
1e2e0 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20  /.  u32 idx1;   
1e2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e300 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66      /* Offset of
1e310 20 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68   first type in h
1e320 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  eader */.  int r
1e330 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
1e340 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
1e350 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20  turn value */.  
1e360 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65  Mem *pRhs = pPKe
1e370 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20  y2->aMem;       
1e380 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66  /* Next field of
1e390 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61   pPKey2 to compa
1e3a0 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20  re */.  KeyInfo 
1e3b0 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65  *pKeyInfo = pPKe
1e3c0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  y2->pKeyInfo;.  
1e3d0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1e3e0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1e3f0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1e400 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d  r *)pKey1;.  Mem
1e410 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20   mem1;..  /* If 
1e420 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74  bSkip is true, t
1e430 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68  hen the caller h
1e440 61 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72  as already deter
1e450 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66  mined that the f
1e460 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c  irst.  ** two el
1e470 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65  ements in the ke
1e480 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69  ys are equal. Fi
1e490 78 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74  x the various st
1e4a0 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ack variables so
1e4b0 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20  .  ** that this 
1e4c0 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63  routine begins c
1e4d0 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20  omparing at the 
1e4e0 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f  second field. */
1e4f0 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a  .  if( bSkip ){.
1e500 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20      u32 s1;.    
1e510 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61  idx1 = 1 + getVa
1e520 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d  rint32(&aKey1[1]
1e530 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72  , s1);.    szHdr
1e540 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20  1 = aKey1[0];.  
1e550 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20    d1 = szHdr1 + 
1e560 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1e570 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20  lTypeLen(s1);.  
1e580 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68    i = 1;.    pRh
1e590 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  s++;.  }else{.  
1e5a0 20 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69    idx1 = getVari
1e5b0 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64  nt32(aKey1, szHd
1e5c0 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  r1);.    d1 = sz
1e5d0 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31  Hdr1;.    if( d1
1e5e0 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  >(unsigned)nKey1
1e5f0 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79   ){ .      pPKey
1e600 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1e610 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1e620 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75  BKPT;.      retu
1e630 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70  rn 0;  /* Corrup
1e640 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
1e650 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20    i = 0;.  }..  
1e660 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1e670 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1e680 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1e690 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1e6a0 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74  ents */.  assert
1e6b0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1e6c0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79  fo->nField+pPKey
1e6d0 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  2->pKeyInfo->nXF
1e6e0 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46  ield>=pPKey2->nF
1e6f0 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20  ield .       || 
1e700 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1e710 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1e720 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
1e730 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73  rder!=0 );.  ass
1e740 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1e750 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20  yInfo->nField>0 
1e760 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  );.  assert( idx
1e770 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52  1<=szHdr1 || COR
1e780 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b  RUPT_DB );.  do{
1e790 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1e7a0 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48  type;..    /* RH
1e7b0 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  S is an integer 
1e7c0 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d  */.    if( pRhs-
1e7d0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
1e7e0 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c   ){.      serial
1e7f0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1e800 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63  x1];.      testc
1e810 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1e820 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1e830 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
1e840 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  0 ){.        rc 
1e850 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1e860 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70  e if( serial_typ
1e870 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1e880 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1e890 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1e8a0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
1e8b0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1e8c0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1e8d0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1e8e0 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1e8f0 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33 49 6e   rc = -sqlite3In
1e900 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 52  tFloatCompare(pR
1e910 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e 75 2e  hs->u.i, mem1.u.
1e920 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1e930 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c 68 73  .        i64 lhs
1e940 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44 65 63   = vdbeRecordDec
1e950 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f 74 79  odeInt(serial_ty
1e960 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d 29 3b  pe, &aKey1[d1]);
1e970 0a 20 20 20 20 20 20 20 20 69 36 34 20 72 68 73  .        i64 rhs
1e980 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a 20 20   = pRhs->u.i;.  
1e990 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68        if( lhs<rh
1e9a0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1e9b0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  c = -1;.        
1e9c0 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68  }else if( lhs>rh
1e9d0 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  s ){.          r
1e9e0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20  c = +1;.        
1e9f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ea00 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 72  .    /* RHS is r
1ea10 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  eal */.    else 
1ea20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1ea30 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20  & MEM_Real ){.  
1ea40 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1ea50 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1ea60 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1ea70 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1ea80 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
1ea90 70 65 73 20 31 32 20 6f 72 20 67 72 65 61 74 65  pes 12 or greate
1eaa0 72 20 61 72 65 20 73 74 72 69 6e 67 73 20 61 6e  r are strings an
1eab0 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74 65 72  d blobs (greater
1eac0 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20 2a 2a   than.        **
1ead0 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70 65 73   numbers). Types
1eae0 20 31 30 20 61 6e 64 20 31 31 20 61 72 65 20 63   10 and 11 are c
1eaf0 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65 72 76  urrently "reserv
1eb00 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 0a 20  ed for future . 
1eb10 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22 2c 20         ** use", 
1eb20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 72 65  so it doesn't re
1eb30 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68 61 74  ally matter what
1eb40 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1eb50 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20 20 20  comparing.      
1eb60 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e 75 6d    ** them to num
1eb70 62 65 72 69 63 20 76 61 6c 75 65 73 20 61 72 65  beric values are
1eb80 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  .  */.        rc
1eb90 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1eba0 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1ebb0 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1ebc0 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1ebd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1ebe0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1ebf0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1ec00 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65  serial_type, &me
1ec10 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  m1);.        if(
1ec20 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
1ec30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1ec40 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73 2d 3e   mem1.u.r<pRhs->
1ec50 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  u.r ){.         
1ec60 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1ec70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ec80 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d 3e 75  mem1.u.r>pRhs->u
1ec90 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  .r ){.          
1eca0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1ecb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ecc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1ecd0 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 74 46  rc = sqlite3IntF
1ece0 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65 6d 31  loatCompare(mem1
1ecf0 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e 72 29  .u.i, pRhs->u.r)
1ed00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1ed10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1ed20 2a 20 52 48 53 20 69 73 20 61 20 73 74 72 69 6e  * RHS is a strin
1ed30 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69 66  g */.    else if
1ed40 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1ed50 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20  MEM_Str ){.     
1ed60 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b   getVarint32(&aK
1ed70 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61  ey1[idx1], seria
1ed80 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74  l_type);.      t
1ed90 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1eda0 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1edb0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1edc0 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  e<12 ){.        
1edd0 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d  rc = -1;.      }
1ede0 65 6c 73 65 20 69 66 28 20 21 28 73 65 72 69 61  else if( !(seria
1edf0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1ee00 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b  {.        rc = +
1ee10 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1ee20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e 20 3d          mem1.n =
1ee30 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1ee40 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20  12) / 2;.       
1ee50 20 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d   testcase( (d1+m
1ee60 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67 6e 65  em1.n)==(unsigne
1ee70 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1ee80 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1ee90 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73  +mem1.n+1)==(uns
1eea0 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1eeb0 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b 6d         if( (d1+m
1eec0 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69 67 6e  em1.n) > (unsign
1eed0 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1eee0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1eef0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1ef00 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ef10 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ef20 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ef30 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1ef40 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1ef50 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d  se if( pKeyInfo-
1ef60 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20  >aColl[i] ){.   
1ef70 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e 63 20         mem1.enc 
1ef80 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1ef90 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1efa0 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1efb0 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  b;.          mem
1efc0 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  1.flags = MEM_St
1efd0 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  r;.          mem
1efe0 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26 61 4b  1.z = (char*)&aK
1eff0 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20 20 20  ey1[d1];.       
1f000 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 70     rc = vdbeComp
1f010 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20  areMemString(.  
1f020 20 20 20 20 20 20 20 20 20 20 20 20 26 6d 65 6d              &mem
1f030 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49 6e 66  1, pRhs, pKeyInf
1f040 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50  o->aColl[i], &pP
1f050 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a 20 20  Key2->errCode.  
1f060 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1f070 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f080 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d      int nCmp = M
1f090 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68 73 2d  IN(mem1.n, pRhs-
1f0a0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1f0b0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1f0c0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1f0d0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1f0e0 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1f0f0 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68 73 2d  = mem1.n - pRhs-
1f100 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d 0a 20  >n; .        }. 
1f110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f120 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 62 6c    /* RHS is a bl
1f130 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20 69  ob */.    else i
1f140 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26  f( pRhs->flags &
1f150 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20   MEM_Blob ){.   
1f160 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1f170 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1f180 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1f190 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f1a0 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f1b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f1c0 79 70 65 3c 31 32 20 7c 7c 20 28 73 65 72 69 61  ype<12 || (seria
1f1d0 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29 20 29  l_type & 0x01) )
1f1e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f1f0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  1;.      }else{.
1f200 20 20 20 20 20 20 20 20 69 6e 74 20 6e 53 74 72          int nStr
1f210 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1f220 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1f230 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f240 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65  +nStr)==(unsigne
1f250 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1f260 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f270 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67  +nStr+1)==(unsig
1f280 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f290 20 20 20 20 20 69 66 28 20 28 64 31 2b 6e 53 74       if( (d1+nSt
1f2a0 72 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  r) > (unsigned)n
1f2b0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1f2c0 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1f2d0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1f2e0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1f2f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1f300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f310 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1f320 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f330 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
1f340 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72 2c 20 70  mp = MIN(nStr, p
1f350 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1f360 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1f370 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1f380 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1f390 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1f3a0 20 72 63 20 3d 20 6e 53 74 72 20 2d 20 70 52 68   rc = nStr - pRh
1f3b0 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  s->n;.        }.
1f3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1f3d0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 6e 75 6c     /* RHS is nul
1f3e0 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65 7b 0a 20  l */.    else{. 
1f3f0 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65       serial_type
1f400 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a   = aKey1[idx1];.
1f410 20 20 20 20 20 20 72 63 20 3d 20 28 73 65 72 69        rc = (seri
1f420 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a 20 20 20  al_type!=0);.   
1f430 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d   }..    if( rc!=
1f440 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1f450 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1f460 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20  der[i] ){.      
1f470 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20 20 20 20    rc = -rc;.    
1f480 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
1f490 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1f4a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1f4b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1f4c0 63 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  c) );.      asse
1f4d0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1f4e0 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1f4f0 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1f500 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1f510 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 2b 2b  ;.    }..    i++
1f520 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20  ;.    pRhs++;.  
1f530 20 20 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56    d1 += sqlite3V
1f540 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
1f550 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1f560 20 20 20 69 64 78 31 20 2b 3d 20 73 71 6c 69 74     idx1 += sqlit
1f570 65 33 56 61 72 69 6e 74 4c 65 6e 28 73 65 72 69  e3VarintLen(seri
1f580 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d 77 68 69  al_type);.  }whi
1f590 6c 65 28 20 69 64 78 31 3c 28 75 6e 73 69 67 6e  le( idx1<(unsign
1f5a0 65 64 29 73 7a 48 64 72 31 20 26 26 20 69 3c 70  ed)szHdr1 && i<p
1f5b0 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 26 26  PKey2->nField &&
1f5c0 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65 64 29 6e   d1<=(unsigned)n
1f5d0 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  Key1 );..  /* No
1f5e0 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1f5f0 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1f600 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1f610 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1f620 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1f630 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1f640 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1f650 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1f660 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1f670 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1f680 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1f690 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1f6a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1f6b0 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1f6c0 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1f6d0 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1f6e0 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68  ne or both of th
1f6f0 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f  e keys ran out o
1f700 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a  f fields and.  *
1f710 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73  * all the fields
1f720 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e   up to that poin
1f730 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65  t were equal. Re
1f740 74 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74  turn the default
1f750 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  _rc.  ** value. 
1f760 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 43 4f   */.  assert( CO
1f770 52 52 55 50 54 5f 44 42 20 0a 20 20 20 20 20 20  RRUPT_DB .      
1f780 20 7c 7c 20 76 64 62 65 52 65 63 6f 72 64 43 6f   || vdbeRecordCo
1f790 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
1f7a0 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
1f7b0 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1f7c0 5f 72 63 29 20 0a 20 20 20 20 20 20 20 7c 7c 20  _rc) .       || 
1f7d0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
1f7e0 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
1f7f0 20 20 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e    pPKey2->eqSeen
1f800 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 1;.  return p
1f810 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1f820 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
1f830 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f840 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  e(.  int nKey1, 
1f850 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1f860 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79  1,   /* Left key
1f870 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1f880 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
1f890 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
1f8a0 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  ey */.){.  retur
1f8b0 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
1f8c0 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1f8d0 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1f8e0 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a 7d 0a 0a   pPKey2, 0);.}..
1f8f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
1f900 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
1f910 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
1f920 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f930 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
1f940 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
1f950 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1f960 32 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  2 is an integer,
1f970 20 61 6e 64 20 28 62 29 20 74 68 65 20 0a 2a 2a   and (b) the .**
1f980 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
1f990 76 61 72 69 6e 74 20 61 74 20 74 68 65 20 73 74  varint at the st
1f9a0 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1f9b0 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1f9c0 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65 20 28 69  ingle.** byte (i
1f9d0 2e 65 2e 20 69 73 20 6c 65 73 73 20 74 68 61 6e  .e. is less than
1f9e0 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   128)..**.** To 
1f9f0 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e 73 20 61  avoid concerns a
1fa00 62 6f 75 74 20 62 75 66 66 65 72 20 6f 76 65 72  bout buffer over
1fa10 72 65 61 64 73 2c 20 74 68 69 73 20 72 6f 75 74  reads, this rout
1fa20 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ine is only used
1fa30 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61 73 20 77  .** on schemas w
1fa40 68 65 72 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  here the maximum
1fa50 20 76 61 6c 69 64 20 68 65 61 64 65 72 20 73 69   valid header si
1fa60 7a 65 20 69 73 20 36 33 20 62 79 74 65 73 20 6f  ze is 63 bytes o
1fa70 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69  r less..*/.stati
1fa80 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1fa90 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20 20 69 6e  CompareInt(.  in
1faa0 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1fab0 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1fac0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1fad0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1fae0 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1faf0 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1fb00 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 20 3d  const u8 *aKey =
1fb10 20 26 28 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   &((const u8*)pK
1fb20 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20 75 38 2a  ey1)[*(const u8*
1fb30 29 70 4b 65 79 31 20 26 20 30 78 33 46 5d 3b 0a  )pKey1 & 0x3F];.
1fb40 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79 70    int serial_typ
1fb50 65 20 3d 20 28 28 63 6f 6e 73 74 20 75 38 2a 29  e = ((const u8*)
1fb60 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20 69 6e 74  pKey1)[1];.  int
1fb70 20 72 65 73 3b 0a 20 20 75 33 32 20 79 3b 0a 20   res;.  u32 y;. 
1fb80 20 75 36 34 20 78 3b 0a 20 20 69 36 34 20 76 20   u64 x;.  i64 v 
1fb90 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  = pPKey2->aMem[0
1fba0 5d 2e 75 2e 69 3b 0a 20 20 69 36 34 20 6c 68 73  ].u.i;.  i64 lhs
1fbb0 3b 0a 0a 20 20 76 64 62 65 41 73 73 65 72 74 46  ;..  vdbeAssertF
1fbc0 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
1fbd0 69 6d 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65  imits(nKey1, pKe
1fbe0 79 31 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  y1, pPKey2->pKey
1fbf0 49 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  Info);.  assert(
1fc00 20 28 2a 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d   (*(u8*)pKey1)<=
1fc10 30 78 33 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f  0x3F || CORRUPT_
1fc20 44 42 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  DB );.  switch( 
1fc30 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1fc40 20 20 20 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20     case 1: { /* 
1fc50 31 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  1-byte signed in
1fc60 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1fc70 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  hs = ONE_BYTE_IN
1fc80 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74  T(aKey);.      t
1fc90 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1fca0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fcb0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
1fcc0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
1fcd0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1fce0 20 20 20 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42       lhs = TWO_B
1fcf0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1fd00 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1fd10 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1fd20 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1fd30 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79  ase 3: { /* 3-by
1fd40 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1fd50 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1fd60 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1fd70 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1fd80 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1fd90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fda0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
1fdb0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
1fdc0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1fdd0 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1fde0 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1fdf0 20 20 20 6c 68 73 20 3d 20 28 69 36 34 29 2a 28     lhs = (i64)*(
1fe00 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 20 20 74  int*)&y;.      t
1fe10 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29  estcase( lhs<0 )
1fe20 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1fe30 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1fe40 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67   { /* 6-byte sig
1fe50 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1fe60 20 20 20 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f       lhs = FOUR_
1fe70 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1fe80 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1fe90 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1fea0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1feb0 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1fec0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1fed0 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1fee0 20 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65   /* 8-byte signe
1fef0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1ff00 20 20 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45     x = FOUR_BYTE
1ff10 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1ff20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c     x = (x<<32) |
1ff30 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1ff40 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c  aKey+4);.      l
1ff50 68 73 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  hs = *(i64*)&x;.
1ff60 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ff70 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1ff80 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1ff90 63 61 73 65 20 38 3a 20 0a 20 20 20 20 20 20 6c  case 8: .      l
1ffa0 68 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  hs = 0;.      br
1ffb0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 39 3a  eak;.    case 9:
1ffc0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a  .      lhs = 1;.
1ffd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
1ffe0 20 20 2f 2a 20 54 68 69 73 20 63 61 73 65 20 63    /* This case c
1fff0 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76 65 64 20  ould be removed 
20000 77 69 74 68 6f 75 74 20 63 68 61 6e 67 69 6e 67  without changing
20010 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
20020 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74  running.    ** t
20030 68 69 73 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64  his code. Includ
20040 69 6e 67 20 69 74 20 63 61 75 73 65 73 20 67 63  ing it causes gc
20050 63 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  c to generate a 
20060 66 61 73 74 65 72 20 73 77 69 74 63 68 20 0a 20  faster switch . 
20070 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
20080 28 73 69 6e 63 65 20 74 68 65 20 72 61 6e 67 65  (since the range
20090 20 6f 66 20 73 77 69 74 63 68 20 74 61 72 67 65   of switch targe
200a0 74 73 20 6e 6f 77 20 73 74 61 72 74 73 20 61 74  ts now starts at
200b0 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a   zero and.    **
200c0 20 69 73 20 63 6f 6e 74 69 67 75 6f 75 73 29 20   is contiguous) 
200d0 62 75 74 20 64 6f 65 73 20 6e 6f 74 20 63 61 75  but does not cau
200e0 73 65 20 61 6e 79 20 64 75 70 6c 69 63 61 74 65  se any duplicate
200f0 20 63 6f 64 65 20 74 6f 20 62 65 20 67 65 6e 65   code to be gene
20100 72 61 74 65 64 0a 20 20 20 20 2a 2a 20 28 61 73  rated.    ** (as
20110 20 67 63 63 20 69 73 20 63 6c 65 76 65 72 20 65   gcc is clever e
20120 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65  nough to combine
20130 20 74 68 65 20 74 77 6f 20 6c 69 6b 65 20 63 61   the two like ca
20140 73 65 73 29 2e 20 4f 74 68 65 72 20 0a 20 20 20  ses). Other .   
20150 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69   ** compilers mi
20160 67 68 74 20 62 65 20 73 69 6d 69 6c 61 72 2e 20  ght be similar. 
20170 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 30 3a   */ .    case 0:
20180 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 72   case 7:.      r
20190 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
201a0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
201b0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
201c0 65 79 32 29 3b 0a 0a 20 20 20 20 64 65 66 61 75  ey2);..    defau
201d0 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  lt:.      return
201e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
201f0 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c  rdCompare(nKey1,
20200 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 29 3b   pKey1, pPKey2);
20210 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76 3e 6c 68  .  }..  if( v>lh
20220 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
20230 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
20240 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
20250 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
20260 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
20270 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
20280 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
20290 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
202a0 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
202b0 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
202c0 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
202d0 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
202e0 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  /.    res = sqli
202f0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20300 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
20310 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20320 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
20330 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
20340 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
20350 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
20360 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
20370 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
20380 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
20390 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
203a0 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
203b0 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
203c0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
203d0 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e  rc;.    pPKey2->
203e0 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a  eqSeen = 1;.  }.
203f0 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
20400 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
20410 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
20420 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a  pPKey2, res) );.
20430 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
20440 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20450 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
20460 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
20470 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20480 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
20490 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
204a0 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
204b0 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74  2 is a string, t
204c0 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73  hat (b) the firs
204d0 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20  t field.** uses 
204e0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
204f0 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e  quence BINARY an
20500 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73  d (c) that the s
20510 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20520 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20  rint .** at the 
20530 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
20540 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
20550 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f   single byte..*/
20560 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
20570 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
20580 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ing(.  int nKey1
20590 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
205a0 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
205b0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
205c0 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
205d0 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
205e0 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
205f0 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
20600 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
20610 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
20620 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
20630 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d  sert( pPKey2->aM
20640 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[0].flags & ME
20650 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41  M_Str );.  vdbeA
20660 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
20670 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
20680 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20690 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67  ->pKeyInfo);.  g
206a0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
206b0 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
206c0 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
206d0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
206e0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
206f0 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
20700 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
20710 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
20720 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
20730 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
20740 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
20750 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
20760 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
20770 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
20780 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
20790 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
207a0 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
207b0 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
207c0 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
207d0 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
207e0 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
207f0 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
20800 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
20810 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
20820 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20830 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
20840 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
20850 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
20860 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
20870 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
20880 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
20890 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
208a0 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
208b0 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
208c0 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
208d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
208e0 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
208f0 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
20900 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
20910 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
20920 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
20930 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
20940 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20950 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
20960 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20970 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
20980 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20990 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
209a0 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
209b0 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
209c0 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  eqSeen = 1;.    
209d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
209e0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
209f0 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
20a00 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
20a10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
20a20 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
20a30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
20a40 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
20a50 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
20a60 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
20a70 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
20a80 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
20a90 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
20aa0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20ab0 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
20ac0 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
20ad0 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
20ae0 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
20af0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
20b00 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
20b10 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
20b20 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
20b30 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20b40 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
20b50 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
20b60 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
20b70 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
20b80 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
20b90 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
20ba0 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
20bb0 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
20bc0 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
20bd0 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
20be0 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
20bf0 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
20c00 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
20c10 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
20c20 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
20c30 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
20c40 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
20c50 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
20c60 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
20c70 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
20c80 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
20c90 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
20ca0 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
20cb0 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
20cc0 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
20cd0 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
20ce0 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
20cf0 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
20d00 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
20d10 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
20d20 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
20d30 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
20d40 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
20d50 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
20d60 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
20d70 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
20d80 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
20d90 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
20da0 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
20db0 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
20dc0 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
20dd0 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
20de0 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
20df0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
20e00 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
20e10 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
20e20 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
20e30 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
20e40 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
20e50 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
20e60 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
20e70 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
20e80 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
20e90 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
20ea0 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
20eb0 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
20ec0 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
20ed0 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
20ee0 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
20ef0 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
20f00 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
20f10 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
20f20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
20f30 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
20f40 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
20f50 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
20f60 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
20f70 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
20f80 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
20f90 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
20fa0 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
20fb0 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
20fc0 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
20fd0 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
20fe0 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
20ff0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21000 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
21010 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
21020 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
21030 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
21040 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
21050 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21060 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
21070 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
21080 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
21090 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
210a0 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
210b0 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
210c0 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
210d0 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
210e0 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
210f0 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
21100 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
21110 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
21120 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
21130 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
21140 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21150 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
21160 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
21170 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
21180 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21190 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
211a0 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
211b0 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
211c0 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
211d0 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
211e0 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
211f0 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
21200 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
21210 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
21220 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
21230 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
21240 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
21250 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
21260 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
21270 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
21280 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
21290 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
212a0 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
212b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
212c0 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
212d0 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
212e0 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
212f0 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
21300 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
21310 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
21320 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
21330 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
21340 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
21350 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
21360 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
21370 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
21380 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21390 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
213a0 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
213b0 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
213c0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
213d0 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
213e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
213f0 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
21400 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
21410 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21420 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
21430 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
21440 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
21450 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
21460 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
21470 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
21480 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
21490 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
214a0 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
214b0 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
214c0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
214d0 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
214e0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
214f0 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
21500 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
21510 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
21520 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21530 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
21540 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
21550 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
21560 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
21570 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
21580 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
21590 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
215a0 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c     /* pCur is al
215b0 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65  ways valid so Ke
215c0 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69  ySize cannot fai
215d0 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28  l */.  assert( (
215e0 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54  nCellKey & SQLIT
215f0 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34  E_MAX_U32)==(u64
21600 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20  )nCellKey );..  
21610 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20 63  /* Read in the c
21620 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20  omplete content 
21630 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
21640 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  ry */.  sqlite3V
21650 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
21660 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
21670 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
21680 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
21690 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
216a0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
216b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
216c0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69  .  }..  /* The i
216d0 6e 64 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20  ndex entry must 
216e0 62 65 67 69 6e 20 77 69 74 68 20 61 20 68 65 61  begin with a hea
216f0 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76  der size */.  (v
21700 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32 28  oid)getVarint32(
21710 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29  (u8*)m.z, szHdr)
21720 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a  ;.  testcase( sz
21730 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74  Hdr==3 );.  test
21740 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e  case( szHdr==m.n
21750 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
21760 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69  ly(szHdr<3 || (i
21770 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b  nt)szHdr>m.n) ){
21780 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
21790 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
217a0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61    }..  /* The la
217b0 73 74 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  st field of the 
217c0 69 6e 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20  index should be 
217d0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65  an integer - the
217e0 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72   ROWID..  ** Ver
217f0 69 66 79 20 74 68 61 74 20 74 68 65 20 6c 61 73  ify that the las
21800 74 20 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69  t entry really i
21810 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f  s an integer. */
21820 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
21830 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73  nt32((u8*)&m.z[s
21840 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77  zHdr-1], typeRow
21850 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id);.  testcase(
21860 20 74 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b   typeRowid==1 );
21870 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21880 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74  eRowid==2 );.  t
21890 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
218a0 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63  id==3 );.  testc
218b0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
218c0 34 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  4 );.  testcase(
218d0 20 74 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b   typeRowid==5 );
218e0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
218f0 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74  eRowid==6 );.  t
21900 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21910 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63  id==8 );.  testc
21920 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21930 39 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b  9 );.  if( unlik
21940 65 6c 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20  ely(typeRowid<1 
21950 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c  || typeRowid>9 |
21960 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20  | typeRowid==7) 
21970 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f  ){.    goto idx_
21980 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e  rowid_corruption
21990 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64  ;.  }.  lenRowid
219a0 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
219b0 79 70 65 53 69 7a 65 73 5b 74 79 70 65 52 6f 77  ypeSizes[typeRow
219c0 69 64 5d 3b 0a 20 20 74 65 73 74 63 61 73 65 28  id];.  testcase(
219d0 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72   (u32)m.n==szHdr
219e0 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20 69  +lenRowid );.  i
219f0 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33 32  f( unlikely((u32
21a00 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f  )m.n<szHdr+lenRo
21a10 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  wid) ){.    goto
21a20 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
21a30 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
21a40 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65 67   Fetch the integ
21a50 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  er off the end o
21a60 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63 6f  f the index reco
21a70 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56  rd */.  sqlite3V
21a80 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75 38  dbeSerialGet((u8
21a90 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f  *)&m.z[m.n-lenRo
21aa0 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64 2c  wid], typeRowid,
21ab0 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20 3d   &v);.  *rowid =
21ac0 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74 65   v.u.i;.  sqlite
21ad0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
21ae0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
21af0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a  LITE_OK;..  /* J
21b00 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74 61  ump here if data
21b10 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
21b20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74 65  is detected afte
21b30 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20 2a  r m has been.  *
21b40 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46 72  * allocated.  Fr
21b50 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74 20  ee the m object 
21b60 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
21b70 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69 64  E_CORRUPT. */.id
21b80 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21b90 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28 20  on:.  testcase( 
21ba0 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b  m.szMalloc!=0 );
21bb0 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
21bc0 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
21bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
21be0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f  RRUPT_BKPT;.}../
21bf0 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
21c00 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64 65   key of the inde
21c10 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  x entry that cur
21c20 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74 69  sor pC is pointi
21c30 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a 2a  ng to against.**
21c40 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67 20   the key string 
21c50 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 57  in pUnpacked.  W
21c60 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73 20  rite into *pRes 
21c70 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61 74  a number.** that
21c80 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a 65   is negative, ze
21c90 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20  ro, or positive 
21ca0 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74 68  if pC is less th
21cb0 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a  an, equal to,.**
21cc0 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e   or greater than
21cd0 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65 74   pUnpacked.  Ret
21ce0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
21cf0 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   success..**.** 
21d00 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69 74  pUnpacked is eit
21d10 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74 68  her created with
21d20 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20 69  out a rowid or i
21d30 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20 74  s truncated so t
21d40 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73 20  hat it.** omits 
21d50 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  the rowid at the
21d60 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69 64   end.  The rowid
21d70 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
21d80 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a 2a  he index entry.*
21d90 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73 20  * is ignored as 
21da0 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74 68  well.  Hence, th
21db0 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79 20  is routine only 
21dc0 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72 65  compares the pre
21dd0 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68 65  fixes .** of the
21de0 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20 74   keys prior to t
21df0 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c 20  he final rowid, 
21e00 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20 6b  not the entire k
21e10 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
21e20 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d 70  e3VdbeIdxKeyComp
21e30 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
21e40 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
21e50 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
21e60 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
21e70 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a  /.  VdbeCursor *
21e80 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pC,             
21e90 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
21ea0 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61 67  or to compare ag
21eb0 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61 63  ainst */.  Unpac
21ec0 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70 61  kedRecord *pUnpa
21ed0 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20 55  cked,       /* U
21ee0 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20  npacked version 
21ef0 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  of key */.  int 
21f00 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20 20  *res            
21f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21f20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61 72  Write the compar
21f30 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72 65  ison result here
21f40 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43 65   */.){.  i64 nCe
21f50 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74  llKey = 0;.  int
21f60 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72 20   rc;.  BtCursor 
21f70 2a 70 43 75 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a  *pCur;.  Mem m;.
21f80 0a 20 20 61 73 73 65 72 74 28 20 70 43 2d 3e 65  .  assert( pC->e
21f90 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
21fa0 5f 42 54 52 45 45 20 29 3b 0a 20 20 70 43 75 72  _BTREE );.  pCur
21fb0 20 3d 20 70 43 2d 3e 75 63 2e 70 43 75 72 73 6f   = pC->uc.pCurso
21fc0 72 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  r;.  assert( sql
21fd0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
21fe0 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
21ff0 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
22000 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
22010 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
22020 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
22030 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22040 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73 20  ;    /* pCur is 
22050 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f 20  always valid so 
22060 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66  KeySize cannot f
22070 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c  ail */.  /* nCel
22080 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73  lKey will always
22090 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
220a0 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65 63  d 0xffffffff bec
220b0 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a  ause of the way.
220c0 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50    ** that btreeP
220d0 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e  arseCellPtr() an
220e0 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72 69  d sqlite3GetVari
220f0 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65  nt32() are imple
22100 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20  mented */.  if( 
22110 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e  nCellKey<=0 || n
22120 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66  CellKey>0x7fffff
22130 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d  ff ){.    *res =
22140 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
22150 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
22160 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  PT;.  }.  sqlite
22170 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c  3VdbeMemInit(&m,
22180 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20   db, 0);.  rc = 
22190 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72  sqlite3VdbeMemFr
221a0 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c  omBtree(pCur, 0,
221b0 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20   (u32)nCellKey, 
221c0 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63  1, &m);.  if( rc
221d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
221e0 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20  c;.  }.  *res = 
221f0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
22200 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e  dCompare(m.n, m.
22210 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  z, pUnpacked);. 
22220 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
22230 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
22240 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22250 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
22260 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 76  utine sets the v
22270 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75 72  alue to be retur
22280 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65 6e  ned by subsequen
22290 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71  t calls to.** sq
222a0 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20  lite3_changes() 
222b0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
222c0 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f  handle 'db'. .*/
222d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
222e0 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69  eSetChanges(sqli
222f0 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68  te3 *db, int nCh
22300 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28  ange){.  assert(
22310 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
22320 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
22330 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20  ;.  db->nChange 
22340 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d  = nChange;.  db-
22350 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d  >nTotalChange +=
22360 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a   nChange;.}../*.
22370 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e  ** Set a flag in
22380 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70 64   the vdbe to upd
22390 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20 63  ate the change c
223a0 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69  ounter when it i
223b0 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f  s finalised.** o
223c0 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64  r reset..*/.void
223d0 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e   sqlite3VdbeCoun
223e0 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76  tChanges(Vdbe *v
223f0 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e  ){.  v->changeCn
22400 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  tOn = 1;.}../*.*
22410 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65  * Mark every pre
22420 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
22430 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22440 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
22450 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69  ction.** as expi
22460 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78  red..**.** An ex
22470 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pired statement 
22480 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d  means that recom
22490 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
224a0 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20  statement is.** 
224b0 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74  recommend.  Stat
224c0 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77 68  ements expire wh
224d0 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e  en things happen
224e0 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72   that make their
224f0 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73  .** programs obs
22500 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67  olete.  Removing
22510 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75   user-defined fu
22520 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61  nctions or colla
22530 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
22540 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61  s, or changing a
22550 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20  n authorization 
22560 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65  function are the
22570 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69   types of.** thi
22580 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72  ngs that make pr
22590 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
225a0 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76  s obsolete..*/.v
225b0 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69 72  oid sqlite3Expir
225c0 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
225d0 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
225e0 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66  {.  Vdbe *p;.  f
225f0 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  or(p = db->pVdbe
22600 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
22610 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64  {.    p->expired
22620 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 1;.  }.}../*.
22630 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61  ** Return the da
22640 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
22650 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 2e  d with the Vdbe.
22660 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c  .*/.sqlite3 *sql
22670 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65 20  ite3VdbeDb(Vdbe 
22680 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d  *v){.  return v-
22690 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  >db;.}../*.** Re
226a0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
226b0 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c  o an sqlite3_val
226c0 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ue structure con
226d0 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75  taining the valu
226e0 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d  e bound.** param
226f0 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20  eter iVar of VM 
22700 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74 68  v. Except, if th
22710 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51  e value is an SQ
22720 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a  L NULL, return .
22730 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e  ** 0 instead. Un
22740 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c  less it is NULL,
22750 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20   apply affinity 
22760 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20  aff (one of the 
22770 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20  SQLITE_AFF_*.** 
22780 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68  constants) to th
22790 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72  e value before r
227a0 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a  eturning it..**.
227b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
227c0 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72  value must be fr
227d0 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  eed by the calle
227e0 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  r using sqlite3V
227f0 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73  alueFree()..*/.s
22800 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71  qlite3_value *sq
22810 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e  lite3VdbeGetBoun
22820 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20  dValue(Vdbe *v, 
22830 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66 66  int iVar, u8 aff
22840 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
22850 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29  r>0 );.  if( v )
22860 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20  {.    Mem *pMem 
22870 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d  = &v->aVar[iVar-
22880 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28  1];.    if( 0==(
22890 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
228a0 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20  M_Null) ){.     
228b0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
228c0 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61  pRet = sqlite3Va
228d0 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20  lueNew(v->db);. 
228e0 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29 7b       if( pRet ){
228f0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22900 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d  VdbeMemCopy((Mem
22910 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a   *)pRet, pMem);.
22920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
22930 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74  alueApplyAffinit
22940 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c  y(pRet, aff, SQL
22950 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20  ITE_UTF8);.     
22960 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
22970 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pRet;.    }.  }.
22980 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
22990 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53  *.** Configure S
229a0 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61 72  QL variable iVar
229b0 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67   so that binding
229c0 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20   a new value to 
229d0 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f  it signals.** to
229e0 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d   sqlite3_reoptim
229f0 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70 72  ize() that re-pr
22a00 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61 74  eparing the stat
22a10 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74  ement may result
22a20 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20  .** in a better 
22a30 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76  query plan..*/.v
22a40 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
22a50 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a  etVarmask(Vdbe *
22a60 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20  v, int iVar){.  
22a70 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20 29  assert( iVar>0 )
22a80 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32 20  ;.  if( iVar>32 
22a90 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73  ){.    v->expmas
22aa0 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a  k = 0xffffffff;.
22ab0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e    }else{.    v->
22ac0 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32  expmask |= ((u32
22ad0 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b  )1 << (iVar-1));
22ae0 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  .  }.}..#ifndef 
22af0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
22b00 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54  UALTABLE./*.** T
22b10 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65  ransfer error me
22b20 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20  ssage text from 
22b30 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e  an sqlite3_vtab.
22b40 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
22b50 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
22b60 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
22b70 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20  sqlite3_malloc) 
22b80 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72  into a Vdbe.zErr
22b90 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65 64  Msg (text stored
22ba0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  .** in memory ob
22bb0 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
22bc0 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f  te3DbMalloc)..*/
22bd0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61  .void sqlite3Vta
22be0 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64  bImportErrmsg(Vd
22bf0 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76  be *p, sqlite3_v
22c00 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69  tab *pVtab){.  i
22c10 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73  f( pVtab->zErrMs
22c20 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
22c30 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
22c40 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
22c50 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
22c60 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
22c70 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
22c80 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72  p(db, pVtab->zEr
22c90 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
22ca0 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a  e3_free(pVtab->z
22cb0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74  ErrMsg);.    pVt
22cc0 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ab->zErrMsg = 0;
22cd0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
22ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
22cf0 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a           TUALTABLE */.