/ Hex Artifact Content
Login

Artifact f2e6b4fae037db04323be8de7bcd266375746471:


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: 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  );.}..#ifdef SQL
0f20: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69  ITE_DEBUG./* Thi
0f30: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73  s routine is jus
0f40: 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  t a convenient p
0f50: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
0f60: 65 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69  eakpoint that wi
0f70: 6c 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72  ll.** fire after
0f80: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20   each opcode is 
0f90: 69 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73  inserted and dis
0fa0: 70 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20  played using.** 
0fb0: 22 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64  "PRAGMA vdbe_add
0fc0: 6f 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a  optrace=on"..*/.
0fd0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
0fe0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
0ff0: 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
1000: 63 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e  c int n = 0;.  n
1010: 2b 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ++;.}.#endif../*
1020: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e  .** Add a new in
1030: 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65  struction to the
1040: 20 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63   list of instruc
1050: 74 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e  tions current in
1060: 20 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52   the.** VDBE.  R
1070: 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
1080: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73  s of the new ins
1090: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  truction..**.** 
10a0: 50 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a  Parameters:.**.*
10b0: 2a 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20  *    p          
10c0: 20 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20       Pointer to 
10d0: 74 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20  the VDBE.**.**  
10e0: 20 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20    op            
10f0: 20 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72    The opcode for
1100: 20 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f   this instructio
1110: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70  n.**.**    p1, p
1120: 32 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61  2, p3      Opera
1130: 6e 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68  nds.**.** Use th
1140: 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  e sqlite3VdbeRes
1150: 6f 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63  olveLabel() func
1160: 74 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61  tion to fix an a
1170: 64 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68  ddress and.** th
1180: 65 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  e sqlite3VdbeCha
1190: 6e 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e  ngeP4() function
11a0: 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76   to change the v
11b0: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a  alue of the P4.*
11c0: 2a 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74  * operand..*/.st
11d0: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
11e0: 4c 49 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33  LINE int growOp3
11f0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1200: 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32  , int p1, int p2
1210: 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73  , int p3){.  ass
1220: 65 72 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e  ert( p->pParse->
1230: 6e 4f 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70  nOpAlloc<=p->nOp
1240: 20 29 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70   );.  if( growOp
1250: 41 72 72 61 79 28 70 2c 20 31 29 20 29 20 72 65  Array(p, 1) ) re
1260: 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74  turn 1;.  assert
1270: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1280: 41 6c 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a  Alloc>p->nOp );.
1290: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12a0: 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70  VdbeAddOp3(p, op
12b0: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d  , p1, p2, p3);.}
12c0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12d0: 41 64 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20  AddOp3(Vdbe *p, 
12e0: 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20  int op, int p1, 
12f0: 69 6e 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b  int p2, int p3){
1300: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
1310: 4f 70 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20  Op *pOp;..  i = 
1320: 70 2d 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74  p->nOp;.  assert
1330: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
1340: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
1350: 20 61 73 73 65 72 74 28 20 6f 70 3e 30 20 26 26   assert( op>0 &&
1360: 20 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66   op<0xff );.  if
1370: 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  ( p->pParse->nOp
1380: 41 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20  Alloc<=i ){.    
1390: 72 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70  return growOp3(p
13a0: 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33  , op, p1, p2, p3
13b0: 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b  );.  }.  p->nOp+
13c0: 2b 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  +;.  pOp = &p->a
13d0: 4f 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70  Op[i];.  pOp->op
13e0: 63 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20  code = (u8)op;. 
13f0: 20 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20   pOp->p5 = 0;.  
1400: 70 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20  pOp->p1 = p1;.  
1410: 70 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  pOp->p2 = p2;.  
1420: 70 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20  pOp->p3 = p3;.  
1430: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
1440: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50   pOp->p4type = P
1450: 34 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65  4_NOTUSED;.#ifde
1460: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1470: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
1480: 0a 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  .  pOp->zComment
1490: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
14a0: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
14b0: 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c  .  if( p->db->fl
14c0: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
14d0: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
14e0: 20 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20     int jj, kk;. 
14f0: 20 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65     Parse *pParse
1500: 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = p->pParse;.  
1510: 20 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a    for(jj=kk=0; j
1520: 6a 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  j<SQLITE_N_COLCA
1530: 43 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  CHE; jj++){.    
1540: 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
1550: 68 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e  he *x = pParse->
1560: 61 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a  aColCache + jj;.
1570: 20 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65        if( x->iLe
1580: 76 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63  vel>pParse->iCac
1590: 68 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52  heLevel || x->iR
15a0: 65 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  eg==0 ) continue
15b0: 3b 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22  ;.      printf("
15c0: 20 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c   r[%d]={%d:%d}",
15d0: 20 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61   x->iReg, x->iTa
15e0: 62 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29  ble, x->iColumn)
15f0: 3b 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20  ;.      kk++;.  
1600: 20 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29    }.    if( kk )
1610: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20   printf("\n");. 
1620: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
1630: 69 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e  intOp(0, i, &p->
1640: 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73  aOp[i]);.    tes
1650: 74 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69  t_addop_breakpoi
1660: 6e 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  nt();.  }.#endif
1670: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
1680: 46 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c  FILE.  pOp->cycl
1690: 65 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63  es = 0;.  pOp->c
16a0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
16b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
16c0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70  E_COVERAGE.  pOp
16d0: 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a  ->iSrcLine = 0;.
16e0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
16f0: 69 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  i;.}.int sqlite3
1700: 56 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20  VdbeAddOp0(Vdbe 
1710: 2a 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72  *p, int op){.  r
1720: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1730: 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30  eAddOp3(p, op, 0
1740: 2c 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  , 0, 0);.}.int s
1750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31  qlite3VdbeAddOp1
1760: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70  (Vdbe *p, int op
1770: 2c 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74  , int p1){.  ret
1780: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1790: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
17a0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
17b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
17c0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
17d0: 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29   int p1, int p2)
17e0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
17f0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1800: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a  op, p1, p2, 0);.
1810: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  }../* Generate c
1820: 6f 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e  ode for an uncon
1830: 64 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f  ditional jump to
1840: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65   instruction iDe
1850: 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  st.*/.int sqlite
1860: 33 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a  3VdbeGoto(Vdbe *
1870: 70 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20  p, int iDest){. 
1880: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1890: 64 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f  dbeAddOp3(p, OP_
18a0: 47 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20  Goto, 0, iDest, 
18b0: 30 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61  0);.}../* Genera
18c0: 74 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65  te code to cause
18d0: 20 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72   the string zStr
18e0: 20 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e   to be loaded in
18f0: 74 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69  to.** register i
1900: 44 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Dest.*/.int sqli
1910: 74 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e  te3VdbeLoadStrin
1920: 67 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69  g(Vdbe *p, int i
1930: 44 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  Dest, const char
1940: 20 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72   *zStr){.  retur
1950: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
1960: 4f 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67  Op4(p, OP_String
1970: 38 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20  8, 0, iDest, 0, 
1980: 7a 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  zStr, 0);.}../*.
1990: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
19a0: 20 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65   that initialize
19b0: 73 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73  s multiple regis
19c0: 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f  ters to string o
19d0: 72 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e  r integer.** con
19e0: 73 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67  stants.  The reg
19f0: 69 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74  isters begin wit
1a00: 68 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72  h iDest and incr
1a10: 65 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65  ease consecutive
1a20: 6c 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73  ly..** One regis
1a30: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1a40: 65 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72  ed for each char
1a50: 61 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73  acgter in zTypes
1a60: 5b 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a  [].  For each.**
1a70: 20 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69   "s" character i
1a80: 6e 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20  n zTypes[], the 
1a90: 72 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74  register is a st
1aa0: 72 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75  ring if the argu
1ab0: 6d 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e  ment is.** not N
1ac0: 55 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20  ULL, or OP_Null 
1ad0: 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
1ae0: 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20  a null pointer. 
1af0: 20 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68   For each "i" ch
1b00: 61 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54  aracter.** in zT
1b10: 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69  ypes[], the regi
1b20: 73 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69  ster is initiali
1b30: 7a 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  zed to an intege
1b40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
1b50: 65 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28  e3VdbeMultiLoad(
1b60: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65  Vdbe *p, int iDe
1b70: 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  st, const char *
1b80: 7a 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20  zTypes, ...){.  
1b90: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e  va_list ap;.  in
1ba0: 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  t i;.  char c;. 
1bb0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54   va_start(ap, zT
1bc0: 79 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30  ypes);.  for(i=0
1bd0: 3b 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d  ; (c = zTypes[i]
1be0: 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  )!=0; i++){.    
1bf0: 69 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20  if( c=='s' ){.  
1c00: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1c10: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63  z = va_arg(ap, c
1c20: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
1c30: 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71     int addr = sq
1c40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1c50: 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75 6c  p, z==0 ? OP_Nul
1c60: 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  l : OP_String8, 
1c70: 30 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20  0, iDest++);.   
1c80: 20 20 20 69 66 28 20 7a 20 29 20 73 71 6c 69 74     if( z ) sqlit
1c90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
1ca0: 2c 20 61 64 64 72 2c 20 7a 2c 20 30 29 3b 0a 20  , addr, z, 0);. 
1cb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1cc0: 61 73 73 65 72 74 28 20 63 3d 3d 27 69 27 20 29  assert( c=='i' )
1cd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1ce0: 64 62 65 41 64 64 4f 70 32 28 70 2c 20 4f 50 5f  dbeAddOp2(p, OP_
1cf0: 49 6e 74 65 67 65 72 2c 20 76 61 5f 61 72 67 28  Integer, va_arg(
1d00: 61 70 2c 20 69 6e 74 29 2c 20 69 44 65 73 74 2b  ap, int), iDest+
1d10: 2b 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  +);.    }.  }.  
1d20: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f  va_end(ap);.}../
1d30: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1d40: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1d50: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73   the p4 value as
1d60: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69   a pointer..*/.i
1d70: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1d80: 64 4f 70 34 28 0a 20 20 56 64 62 65 20 2a 70 2c  dOp4(.  Vdbe *p,
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
1da0: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
1db0: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
1dc0: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
1dd0: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
1de0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e00: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
1e10: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1e30: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
1e40: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
1e50: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
1e60: 72 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rand */.  const 
1e70: 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a  char *zP4,    /*
1e80: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
1e90: 2a 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20  */.  int p4type 
1ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f           /* P4 o
1eb0: 70 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29  perand type */.)
1ec0: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
1ed0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
1ee0: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
1ef0: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
1f00: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
1f10: 64 72 2c 20 7a 50 34 2c 20 70 34 74 79 70 65 29  dr, zP4, p4type)
1f20: 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  ;.  return addr;
1f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
1f40: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69 6e 63   opcode that inc
1f50: 6c 75 64 65 73 20 74 68 65 20 70 34 20 76 61 6c  ludes the p4 val
1f60: 75 65 20 77 69 74 68 20 61 20 50 34 5f 49 4e 54  ue with a P4_INT
1f70: 36 34 20 6f 72 0a 2a 2a 20 50 34 5f 52 45 41 4c  64 or.** P4_REAL
1f80: 20 74 79 70 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   type..*/.int sq
1f90: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 44  lite3VdbeAddOp4D
1fa0: 75 70 38 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  up8(.  Vdbe *p, 
1fb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
1fc0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
1fd0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
1fe0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
1ff0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2000: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2010: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2020: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2030: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2040: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2050: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2060: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
2070: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
2080: 61 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 75  and */.  const u
2090: 38 20 2a 7a 50 34 2c 20 20 20 20 20 20 2f 2a 20  8 *zP4,      /* 
20a0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a  The P4 operand *
20b0: 2f 0a 20 20 69 6e 74 20 70 34 74 79 70 65 20 20  /.  int p4type  
20c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70          /* P4 op
20d0: 65 72 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b  erand type */.){
20e0: 0a 20 20 63 68 61 72 20 2a 70 34 63 6f 70 79 20  .  char *p4copy 
20f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
2100: 63 52 61 77 28 73 71 6c 69 74 65 33 56 64 62 65  cRaw(sqlite3Vdbe
2110: 44 62 28 70 29 2c 20 38 29 3b 0a 20 20 69 66 28  Db(p), 8);.  if(
2120: 20 70 34 63 6f 70 79 20 29 20 6d 65 6d 63 70 79   p4copy ) memcpy
2130: 28 70 34 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29  (p4copy, zP4, 8)
2140: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
2150: 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20  e3VdbeAddOp4(p, 
2160: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 2c 20  op, p1, p2, p3, 
2170: 70 34 63 6f 70 79 2c 20 70 34 74 79 70 65 29 3b  p4copy, p4type);
2180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e  .}../*.** Add an
2190: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 20   OP_ParseSchema 
21a0: 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f  opcode.  This ro
21b0: 75 74 69 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20  utine is broken 
21c0: 6f 75 74 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  out from.** sqli
21d0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 29 20  te3VdbeAddOp4() 
21e0: 73 69 6e 63 65 20 69 74 20 6e 65 65 64 73 20 74  since it needs t
21f0: 6f 20 61 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20  o also needs to 
2200: 6d 61 72 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a  mark all btrees.
2210: 2a 2a 20 61 73 20 68 61 76 69 6e 67 20 62 65 65  ** as having bee
2220: 6e 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  n used..**.** Th
2230: 65 20 7a 57 68 65 72 65 20 73 74 72 69 6e 67 20  e zWhere string 
2240: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2250: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
2260: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
2270: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
2280: 69 6c 6c 20 74 61 6b 65 20 6f 77 6e 65 72 73 68  ill take ownersh
2290: 69 70 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61  ip of the alloca
22a0: 74 65 64 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76  ted memory..*/.v
22b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 41  oid sqlite3VdbeA
22c0: 64 64 50 61 72 73 65 53 63 68 65 6d 61 4f 70 28  ddParseSchemaOp(
22d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 62  Vdbe *p, int iDb
22e0: 2c 20 63 68 61 72 20 2a 7a 57 68 65 72 65 29 7b  , char *zWhere){
22f0: 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69  .  int j;.  sqli
2300: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 2c  te3VdbeAddOp4(p,
2310: 20 4f 50 5f 50 61 72 73 65 53 63 68 65 6d 61 2c   OP_ParseSchema,
2320: 20 69 44 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65   iDb, 0, 0, zWhe
2330: 72 65 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b  re, P4_DYNAMIC);
2340: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d  .  for(j=0; j<p-
2350: 3e 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73  >db->nDb; j++) s
2360: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
2370: 72 65 65 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a  ree(p, j);.}../*
2380: 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64  .** Add an opcod
2390: 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20  e that includes 
23a0: 74 68 65 20 70 34 20 76 61 6c 75 65 20 61 73 20  the p4 value as 
23b0: 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69  an integer..*/.i
23c0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
23d0: 64 4f 70 34 49 6e 74 28 0a 20 20 56 64 62 65 20  dOp4Int(.  Vdbe 
23e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  *p,            /
23f0: 2a 20 41 64 64 20 74 68 65 20 6f 70 63 6f 64 65  * Add the opcode
2400: 20 74 6f 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   to this VM */. 
2410: 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
2420: 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20       /* The new 
2430: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
2440: 70 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p1,             
2450: 2f 2a 20 54 68 65 20 50 31 20 6f 70 65 72 61 6e  /* The P1 operan
2460: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20  d */.  int p2,  
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2480: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P2 operand */.
2490: 20 20 69 6e 74 20 70 33 2c 20 20 20 20 20 20 20    int p3,       
24a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 33 20        /* The P3 
24b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
24c0: 20 70 34 20 20 20 20 20 20 20 20 20 20 20 20 20   p4             
24d0: 20 2f 2a 20 54 68 65 20 50 34 20 6f 70 65 72 61   /* The P4 opera
24e0: 6e 64 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72  nd as an integer
24f0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64   */.){.  int add
2500: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
2510: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
2520: 20 70 32 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69   p2, p3);.  sqli
2530: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
2540: 70 2c 20 61 64 64 72 2c 20 53 51 4c 49 54 45 5f  p, addr, SQLITE_
2550: 49 4e 54 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20  INT_TO_PTR(p4), 
2560: 50 34 5f 49 4e 54 33 32 29 3b 0a 20 20 72 65 74  P4_INT32);.  ret
2570: 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a  urn addr;.}../*.
2580: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
2590: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 66  symbolic label f
25a0: 6f 72 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  or an instructio
25b0: 6e 20 74 68 61 74 20 68 61 73 20 79 65 74 20 74  n that has yet t
25c0: 6f 20 62 65 0a 2a 2a 20 63 6f 64 65 64 2e 20 20  o be.** coded.  
25d0: 54 68 65 20 73 79 6d 62 6f 6c 69 63 20 6c 61 62  The symbolic lab
25e0: 65 6c 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73  el is really jus
25f0: 74 20 61 20 6e 65 67 61 74 69 76 65 20 6e 75 6d  t a negative num
2600: 62 65 72 2e 20 20 54 68 65 0a 2a 2a 20 6c 61 62  ber.  The.** lab
2610: 65 6c 20 63 61 6e 20 62 65 20 75 73 65 64 20 61  el can be used a
2620: 73 20 74 68 65 20 50 32 20 76 61 6c 75 65 20 6f  s the P2 value o
2630: 66 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 2e 20  f an operation. 
2640: 20 4c 61 74 65 72 2c 20 77 68 65 6e 0a 2a 2a 20   Later, when.** 
2650: 74 68 65 20 6c 61 62 65 6c 20 69 73 20 72 65 73  the label is res
2660: 6f 6c 76 65 64 20 74 6f 20 61 20 73 70 65 63 69  olved to a speci
2670: 66 69 63 20 61 64 64 72 65 73 73 2c 20 74 68 65  fic address, the
2680: 20 56 44 42 45 20 77 69 6c 6c 20 73 63 61 6e 0a   VDBE will scan.
2690: 2a 2a 20 74 68 72 6f 75 67 68 20 69 74 73 20 6f  ** through its o
26a0: 70 65 72 61 74 69 6f 6e 20 6c 69 73 74 20 61 6e  peration list an
26b0: 64 20 63 68 61 6e 67 65 20 61 6c 6c 20 76 61 6c  d change all val
26c0: 75 65 73 20 6f 66 20 50 32 20 77 68 69 63 68 20  ues of P2 which 
26d0: 6d 61 74 63 68 0a 2a 2a 20 74 68 65 20 6c 61 62  match.** the lab
26e0: 65 6c 20 69 6e 74 6f 20 74 68 65 20 72 65 73 6f  el into the reso
26f0: 6c 76 65 64 20 61 64 64 72 65 73 73 2e 0a 2a 2a  lved address..**
2700: 0a 2a 2a 20 54 68 65 20 56 44 42 45 20 6b 6e 6f  .** The VDBE kno
2710: 77 73 20 74 68 61 74 20 61 20 50 32 20 76 61 6c  ws that a P2 val
2720: 75 65 20 69 73 20 61 20 6c 61 62 65 6c 20 62 65  ue is a label be
2730: 63 61 75 73 65 20 6c 61 62 65 6c 73 20 61 72 65  cause labels are
2740: 0a 2a 2a 20 61 6c 77 61 79 73 20 6e 65 67 61 74  .** always negat
2750: 69 76 65 20 61 6e 64 20 50 32 20 76 61 6c 75 65  ive and P2 value
2760: 73 20 61 72 65 20 73 75 70 70 6f 73 65 20 74 6f  s are suppose to
2770: 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65   be non-negative
2780: 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6e 65  ..** Hence, a ne
2790: 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65 20  gative P2 value 
27a0: 69 73 20 61 20 6c 61 62 65 6c 20 74 68 61 74 20  is a label that 
27b0: 68 61 73 20 79 65 74 20 74 6f 20 62 65 20 72 65  has yet to be re
27c0: 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65  solved..**.** Ze
27d0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
27e0: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
27f0: 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
2800: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
2810: 56 64 62 65 20 2a 76 29 7b 0a 20 20 50 61 72 73  Vdbe *v){.  Pars
2820: 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65  e *p = v->pParse
2830: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 2d 3e 6e  ;.  int i = p->n
2840: 4c 61 62 65 6c 2b 2b 3b 0a 20 20 61 73 73 65 72  Label++;.  asser
2850: 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( v->magic==VDB
2860: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
2870: 20 20 69 66 28 20 28 69 20 26 20 28 69 2d 31 29    if( (i & (i-1)
2880: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 61  )==0 ){.    p->a
2890: 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 44  Label = sqlite3D
28a0: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 70  bReallocOrFree(p
28b0: 2d 3e 64 62 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c  ->db, p->aLabel,
28c0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 20 20 20 20 28 69 2a 32 2b 31 29           (i*2+1)
28f0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 4c 61 62 65  *sizeof(p->aLabe
2900: 6c 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66  l[0]));.  }.  if
2910: 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20  ( p->aLabel ){. 
2920: 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20     p->aLabel[i] 
2930: 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = -1;.  }.  retu
2940: 72 6e 20 41 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f  rn ADDR(i);.}../
2950: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6c 61 62  *.** Resolve lab
2960: 65 6c 20 22 78 22 20 74 6f 20 62 65 20 74 68 65  el "x" to be the
2970: 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20   address of the 
2980: 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  next instruction
2990: 20 74 6f 0a 2a 2a 20 62 65 20 69 6e 73 65 72 74   to.** be insert
29a0: 65 64 2e 20 20 54 68 65 20 70 61 72 61 6d 65 74  ed.  The paramet
29b0: 65 72 20 22 78 22 20 6d 75 73 74 20 68 61 76 65  er "x" must have
29c0: 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 20 66   been obtained f
29d0: 72 6f 6d 0a 2a 2a 20 61 20 70 72 69 6f 72 20 63  rom.** a prior c
29e0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
29f0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a  beMakeLabel()..*
2a00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
2a10: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 56  beResolveLabel(V
2a20: 64 62 65 20 2a 76 2c 20 69 6e 74 20 78 29 7b 0a  dbe *v, int x){.
2a30: 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e    Parse *p = v->
2a40: 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 6a 20  pParse;.  int j 
2a50: 3d 20 41 44 44 52 28 78 29 3b 0a 20 20 61 73 73  = ADDR(x);.  ass
2a60: 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d 3d 56  ert( v->magic==V
2a70: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
2a80: 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c 70 2d  ;.  assert( j<p-
2a90: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 61 73 73  >nLabel );.  ass
2aa0: 65 72 74 28 20 6a 3e 3d 30 20 29 3b 0a 20 20 69  ert( j>=0 );.  i
2ab0: 66 28 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  f( p->aLabel ){.
2ac0: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2ad0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2ae0: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2af0: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
2b00: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
2b10: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
2b20: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
2b30: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
2b40: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
2b50: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2b60: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2b70: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2b80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2b90: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2ba0: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2bb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2bc0: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2bd0: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2be0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2bf0: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2c00: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
2c10: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
2c20: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
2c30: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
2c40: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
2c50: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2c60: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2c70: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2c80: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2c90: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2ca0: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2cb0: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2cc0: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2cd0: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2ce0: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
2d10: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
2d20: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
2d30: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
2d40: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
2d50: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2d60: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2d70: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2d80: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2d90: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2da0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2db0: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2dc0: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2dd0: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2de0: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2df0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
2e00: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
2e10: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
2e20: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
2e30: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
2e40: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
2e50: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2e60: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2e70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e80: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2e90: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2ea0: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2eb0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2ec0: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2ed0: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2ee0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f00: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
2f10: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
2f20: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
2f30: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
2f40: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
2f50: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2f60: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2f70: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2f80: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2f90: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2fa0: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2fb0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2fc0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2fd0: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2fe0: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2ff0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3000: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
3010: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
3020: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
3030: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
3040: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
3050: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
3060: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
3070: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
3080: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
3090: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
30a0: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
30b0: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
30c0: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
30d0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
30e0: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
30f0: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
3100: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
3110: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
3120: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
3130: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
3140: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
3150: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
3160: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
3170: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
3180: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
3190: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
31a0: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
31b0: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
31c0: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
31d0: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
31e0: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
31f0: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
3200: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
3210: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
3220: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
3230: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
3240: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
3250: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
3260: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
3270: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
3280: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
3290: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
32a0: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
32b0: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
32c0: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
32d0: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
32e0: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
32f0: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
3300: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
3310: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
3320: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
3330: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
3340: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
3350: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
3360: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
3370: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
3380: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
3390: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
33a0: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
33b0: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
33c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
33d0: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
33e0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
33f0: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
3400: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
3410: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
3420: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
3430: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
3440: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
3450: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
3460: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
3470: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
3480: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
3490: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
34a0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74  **   *  OP_Creat
34b0: 65 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e  eTable and OP_In
34c0: 69 74 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72  itCoroutine (for
34d0: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 53   CREATE TABLE AS
34e0: 20 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a   SELECT ...).**.
34f0: 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68  ** Then check th
3500: 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  at the value of 
3510: 50 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69  Parse.mayAbort i
3520: 73 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20  s true if an.** 
3530: 41 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72  ABORT may be thr
3540: 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  own, or false ot
3550: 68 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20  herwise. Return 
3560: 74 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a  true if it does.
3570: 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c  ** match, or fal
3580: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68  se otherwise. Th
3590: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  is function is i
35a0: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
35b0: 65 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66  ed as.** part of
35c0: 20 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65   an assert state
35d0: 6d 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70  ment in the comp
35e0: 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f  iler. Similar to
35f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74  :.**.**   assert
3600: 28 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  ( sqlite3VdbeAss
3610: 65 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72  ertMayAbort(pPar
3620: 73 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73  se->pVdbe, pPars
3630: 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a  e->mayAbort) );.
3640: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
3650: 62 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74  beAssertMayAbort
3660: 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61  (Vdbe *v, int ma
3670: 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68  yAbort){.  int h
3680: 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69  asAbort = 0;.  i
3690: 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20  nt hasFkCounter 
36a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72  = 0;.  int hasCr
36b0: 65 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20  eateTable = 0;. 
36c0: 20 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f   int hasInitCoro
36d0: 75 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20  utine = 0;.  Op 
36e0: 2a 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74  *pOp;.  VdbeOpIt
36f0: 65 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73  er sIter;.  mems
3700: 65 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69  et(&sIter, 0, si
3710: 7a 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20  zeof(sIter));.  
3720: 73 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20  sIter.v = v;..  
3730: 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70  while( (pOp = op
3740: 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29  IterNext(&sIter)
3750: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  )!=0 ){.    int 
3760: 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70  opcode = pOp->op
3770: 63 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70  code;.    if( op
3780: 63 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79  code==OP_Destroy
3790: 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56   || opcode==OP_V
37a0: 55 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65  Update || opcode
37b0: 3d 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20  ==OP_VRename .  
37c0: 20 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d     || ((opcode==
37d0: 4f 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64  OP_Halt || opcod
37e0: 65 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  e==OP_HaltIfNull
37f0: 29 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f  ) .      && ((pO
3800: 70 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c  p->p1&0xff)==SQL
3810: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26  ITE_CONSTRAINT &
3820: 26 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62  & pOp->p2==OE_Ab
3830: 6f 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  ort)).    ){.   
3840: 20 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b     hasAbort = 1;
3850: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3860: 20 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f    }.    if( opco
3870: 64 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62  de==OP_CreateTab
3880: 6c 65 20 29 20 68 61 73 43 72 65 61 74 65 54 61  le ) hasCreateTa
3890: 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  ble = 1;.    if(
38a0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74   opcode==OP_Init
38b0: 43 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49  Coroutine ) hasI
38c0: 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31  nitCoroutine = 1
38d0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
38e0: 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45  _OMIT_FOREIGN_KE
38f0: 59 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  Y.    if( opcode
3900: 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26  ==OP_FkCounter &
3910: 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20  & pOp->p1==0 && 
3920: 70 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20  pOp->p2==1 ){.  
3930: 20 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72      hasFkCounter
3940: 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
3950: 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  if.  }.  sqlite3
3960: 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49  DbFree(v->db, sI
3970: 74 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f  ter.apSub);..  /
3980: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
3990: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
39a0: 6f 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c  ort. Or if a mal
39b0: 6c 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75  loc failure occu
39c0: 72 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61  rred..  ** If ma
39d0: 6c 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65  lloc failed, the
39e0: 6e 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f  n the while() lo
39f0: 6f 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74  op above may not
3a00: 20 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20   have iterated. 
3a10: 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20   ** through all 
3a20: 6f 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41  opcodes and hasA
3a30: 62 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20  bort may be set 
3a40: 69 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74  incorrectly. Ret
3a50: 75 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f  urn.  ** true fo
3a60: 72 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70  r this case to p
3a70: 72 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72  revent the asser
3a80: 74 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65  t() in the calle
3a90: 72 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72  rs frame.  ** fr
3aa0: 6f 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a  om failing.  */.
3ab0: 20 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62    return ( v->db
3ac0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
3ad0: 7c 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41  | hasAbort==mayA
3ae0: 62 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75  bort || hasFkCou
3af0: 6e 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  nter.           
3b00: 20 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65     || (hasCreate
3b10: 54 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74  Table && hasInit
3b20: 43 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a  Coroutine) );.}.
3b30: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3b40: 5f 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c  _DEBUG - the sql
3b50: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
3b60: 72 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  rt() function */
3b70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
3b80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
3b90: 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73  fter all opcodes
3ba0: 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72   have been inser
3bb0: 74 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a  ted.  It loops.*
3bc0: 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68  * through all th
3bd0: 65 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69  e opcodes and fi
3be0: 78 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61  xes up some deta
3bf0: 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46  ils..**.** (1) F
3c00: 6f 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73  or each jump ins
3c10: 74 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20  truction with a 
3c20: 6e 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75  negative P2 valu
3c30: 65 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20  e (a label).**  
3c40: 20 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50     resolve the P
3c50: 32 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63  2 value to an ac
3c60: 74 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a  tual address..**
3c70: 0a 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20  .** (2) Compute 
3c80: 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  the maximum numb
3c90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3ca0: 75 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20  used by any SQL 
3cb0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  function.**     
3cc0: 61 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76  and store that v
3cd0: 61 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e  alue in *pMaxFun
3ce0: 63 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29  cArgs..**.** (3)
3cf0: 20 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65   Update the Vdbe
3d00: 2e 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64  .readOnly and Vd
3d10: 62 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61  be.bIsReader fla
3d20: 67 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79  gs to accurately
3d30: 0a 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65  .**     indicate
3d40: 20 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72   what the prepar
3d50: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74  ed statement act
3d60: 75 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a  ually does..**.*
3d70: 2a 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65  * (4) Initialize
3d80: 20 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65   the p4.xAdvance
3d90: 20 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f   pointer on opco
3da0: 64 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e  des that use it.
3db0: 0a 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61  .**.** (5) Recla
3dc0: 69 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c  im the memory al
3dd0: 6c 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72  located for stor
3de0: 69 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73  ing labels..*/.s
3df0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
3e00: 76 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20  veP2Values(Vdbe 
3e10: 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e  *p, int *pMaxFun
3e20: 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 69 3b  cArgs){.  int i;
3e30: 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67 73 20  .  int nMaxArgs 
3e40: 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 3b  = *pMaxFuncArgs;
3e50: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61  .  Op *pOp;.  Pa
3e60: 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70 2d  rse *pParse = p-
3e70: 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a  >pParse;.  int *
3e80: 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73 65 2d  aLabel = pParse-
3e90: 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65  >aLabel;.  p->re
3ea0: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d  adOnly = 1;.  p-
3eb0: 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30 3b 0a  >bIsReader = 0;.
3ec0: 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61 4f 70    for(pOp=p->aOp
3ed0: 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e  , i=p->nOp-1; i>
3ee0: 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b  =0; i--, pOp++){
3ef0: 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65 20 3d  .    u8 opcode =
3f00: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20   pOp->opcode;.. 
3f10: 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73     /* NOTE: Be s
3f20: 75 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b  ure to update mk
3f30: 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68 65 6e  opcodeh.awk when
3f40: 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76   adding or remov
3f50: 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73 65 73  ing.    ** cases
3f60: 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74 63   from this switc
3f70: 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68  h! */.    switch
3f80: 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20 20  ( opcode ){.    
3f90: 20 20 63 61 73 65 20 4f 50 5f 54 72 61 6e 73 61    case OP_Transa
3fa0: 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20  ction: {.       
3fb0: 20 69 66 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20   if( pOp->p2!=0 
3fc0: 29 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  ) p->readOnly = 
3fd0: 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 61  0;.        /* fa
3fe0: 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20  ll thru */.     
3ff0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
4000: 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20  _AutoCommit:.   
4010: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4020: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
4030: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31  p->bIsReader = 1
4040: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4050: 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  .      }.#ifndef
4060: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
4070: 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 43  .      case OP_C
4080: 68 65 63 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69  heckpoint:.#endi
4090: 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  f.      case OP_
40a0: 56 61 63 75 75 6d 3a 0a 20 20 20 20 20 20 63 61  Vacuum:.      ca
40b0: 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  se OP_JournalMod
40c0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e: {.        p->
40d0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
40e0: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
40f0: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4100: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
4110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
4120: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
4130: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 55        case OP_VU
4140: 70 64 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  pdate: {.       
4150: 20 69 66 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61   if( pOp->p2>nMa
4160: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
4170: 20 3d 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = pOp->p2;.    
4180: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4190: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
41a0: 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20  _VFilter: {.    
41b0: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
41c0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f     assert( p->nO
41d0: 70 20 2d 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20  p - i >= 3 );.  
41e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4f        assert( pO
41f0: 70 5b 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50  p[-1].opcode==OP
4200: 5f 49 6e 74 65 67 65 72 20 29 3b 0a 20 20 20 20  _Integer );.    
4210: 20 20 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e      n = pOp[-1].
4220: 70 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p1;.        if( 
4230: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
4240: 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20  xArgs = n;.     
4250: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4260: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
4270: 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20  ase OP_Next:.   
4280: 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 49     case OP_NextI
4290: 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 63 61 73  fOpen:.      cas
42a0: 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a  e OP_SorterNext:
42b0: 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e   {.        pOp->
42c0: 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71  p4.xAdvance = sq
42d0: 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 3b 0a  lite3BtreeNext;.
42e0: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74          pOp->p4t
42f0: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
4300: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4320: 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20  ase OP_Prev:.   
4330: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49     case OP_PrevI
4340: 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20  fOpen: {.       
4350: 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63   pOp->p4.xAdvanc
4360: 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
4370: 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20 20  Previous;.      
4380: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4390: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
43a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
43b0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f   }.    }..    pO
43c0: 70 2d 3e 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c  p->opflags = sql
43d0: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
43e0: 74 79 5b 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20  ty[opcode];.    
43f0: 69 66 28 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67  if( (pOp->opflag
4400: 73 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21  s & OPFLG_JUMP)!
4410: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20  =0 && pOp->p2<0 
4420: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4430: 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70   ADDR(pOp->p2)<p
4440: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
4450: 0a 20 20 20 20 20 20 70 4f 70 2d 3e 70 32 20 3d  .      pOp->p2 =
4460: 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70 4f 70   aLabel[ADDR(pOp
4470: 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 7d 0a 20 20  ->p2)];.    }.  
4480: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
4490: 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65 2d  e(p->db, pParse-
44a0: 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61 72  >aLabel);.  pPar
44b0: 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b 0a  se->aLabel = 0;.
44c0: 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c    pParse->nLabel
44d0: 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75 6e   = 0;.  *pMaxFun
44e0: 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67 73  cArgs = nMaxArgs
44f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 62  ;.  assert( p->b
4500: 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20 44  IsReader!=0 || D
4510: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
4520: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a  btreeMask) );.}.
4530: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4540: 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68 65  e address of the
4550: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
4560: 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65 64  n to be inserted
4570: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4580: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
4590: 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  Vdbe *p){.  asse
45a0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
45b0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
45c0: 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f 70  .  return p->nOp
45d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
45e0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
45f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
4600: 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f 64  e array of opcod
4610: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
4620: 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 70  th.** the Vdbe p
4630: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
4640: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20  st argument. It 
4650: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20 72  is the callers r
4660: 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a  esponsibility.**
4670: 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72 20   to arrange for 
4680: 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72 72  the returned arr
4690: 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75 61  ay to be eventua
46a0: 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67 20  lly freed using 
46b0: 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65 65  the .** vdbeFree
46c0: 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74 69  OpArray() functi
46d0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65  on..**.** Before
46e0: 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f   returning, *pnO
46f0: 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  p is set to the 
4700: 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  number of entrie
4710: 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 65  s in the returne
4720: 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f  d.** array. Also
4730: 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20 73  , *pnMaxArg is s
4740: 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65 72  et to the larger
4750: 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74 20   of its current 
4760: 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68  value and .** th
4770: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
4780: 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65 2e  ies in the Vdbe.
4790: 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72 65  apArg[] array re
47a0: 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75 74  quired to execut
47b0: 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e  e the .** return
47c0: 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56  ed program..*/.V
47d0: 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64  dbeOp *sqlite3Vd
47e0: 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56 64  beTakeOpArray(Vd
47f0: 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70  be *p, int *pnOp
4800: 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29  , int *pnMaxArg)
4810: 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70 20  {.  VdbeOp *aOp 
4820: 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65  = p->aOp;.  asse
4830: 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e 64  rt( aOp && !p->d
4840: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
4850: 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  );..  /* Check t
4860: 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65 55  hat sqlite3VdbeU
4870: 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20 6e  sesBtree() was n
4880: 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69  ot called on thi
4890: 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74  s VM */.  assert
48a0: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
48b0: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b  p->btreeMask) );
48c0: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
48d0: 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67 29  ues(p, pnMaxArg)
48e0: 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e  ;.  *pnOp = p->n
48f0: 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30  Op;.  p->aOp = 0
4900: 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a  ;.  return aOp;.
4910: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77  }../*.** Add a w
4920: 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70 65  hole list of ope
4930: 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f  rations to the o
4940: 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20  peration stack. 
4950: 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 61   Return the.** a
4960: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66 69  ddress of the fi
4970: 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61 64  rst operation ad
4980: 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ded..*/.int sqli
4990: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
49a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 4f  (Vdbe *p, int nO
49b0: 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  p, VdbeOpList co
49c0: 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69 4c  nst *aOp, int iL
49d0: 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61 64  ineno){.  int ad
49e0: 64 72 2c 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  dr, i;.  VdbeOp 
49f0: 2a 70 4f 75 74 3b 0a 20 20 61 73 73 65 72 74 28  *pOut;.  assert(
4a00: 20 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65   nOp>0 );.  asse
4a10: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
4a20: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
4a30: 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20  .  if( p->nOp + 
4a40: 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d  nOp > p->pParse-
4a50: 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f  >nOpAlloc && gro
4a60: 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70 29  wOpArray(p, nOp)
4a70: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
4a80: 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20 70  ;.  }.  addr = p
4a90: 2d 3e 6e 4f 70 3b 0a 20 20 70 4f 75 74 20 3d 20  ->nOp;.  pOut = 
4aa0: 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20  &p->aOp[addr];. 
4ab0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
4ac0: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
4ad0: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
4ae0: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
4af0: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
4b00: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
4b10: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
4b20: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
4b30: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
4b40: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61      pOut->p3 = a
4b50: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74  Op->p3;.    pOut
4b60: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
4b70: 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d  TUSED;.    pOut-
4b80: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
4b90: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
4ba0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
4bb0: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
4bc0: 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  TS.    pOut->zCo
4bd0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
4be0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4bf0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
4c00: 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65    pOut->iSrcLine
4c10: 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65   = iLineno+i;.#e
4c20: 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c  lse.    (void)iL
4c30: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
4c40: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
4c50: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  G.    if( p->db-
4c60: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
4c70: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
4c80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
4c90: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
4ca0: 61 64 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b  addr, &p->aOp[i+
4cb0: 61 64 64 72 5d 29 3b 0a 20 20 20 20 7d 0a 23 65  addr]);.    }.#e
4cc0: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f  ndif.  }.  p->nO
4cd0: 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74 75  p += nOp;.  retu
4ce0: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69 66 20  rn addr;.}..#if 
4cf0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
4d00: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
4d10: 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64  TATUS)./*.** Add
4d20: 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65   an entry to the
4d30: 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e 74 65   array of counte
4d40: 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20 73 71  rs managed by sq
4d50: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
4d60: 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64  tatus()..*/.void
4d70: 20 73 71 6c 69 74 65 33 56 64 62 65 53 63 61 6e   sqlite3VdbeScan
4d80: 53 74 61 74 75 73 28 0a 20 20 56 64 62 65 20 2a  Status(.  Vdbe *
4d90: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
4da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 4d 20            /* VM 
4db0: 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61 74 75  to add scanstatu
4dc0: 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  s() to */.  int 
4dd0: 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20 20 20  addrExplain,    
4de0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4df0: 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45 78 70  ddress of OP_Exp
4e00: 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f 0a 20  lain (or 0) */. 
4e10: 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c 20 20   int addrLoop,  
4e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e30: 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6c   /* Address of l
4e40: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 20 0a  oop counter */ .
4e50: 20 20 69 6e 74 20 61 64 64 72 56 69 73 69 74 2c    int addrVisit,
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
4e80: 72 6f 77 73 20 76 69 73 69 74 65 64 20 63 6f 75  rows visited cou
4e90: 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45 73 74  nter */.  LogEst
4ea0: 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20 20 20   nEst,          
4eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 73 74            /* Est
4ec0: 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20 6f 66  imated number of
4ed0: 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a 2f 0a   output rows */.
4ee0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
4ef0: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
4f00: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62    /* Name of tab
4f10: 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65 69 6e  le or index bein
4f20: 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a  g scanned */.){.
4f30: 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70    int nByte = (p
4f40: 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73 69 7a  ->nScan+1) * siz
4f50: 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73 29 3b  eof(ScanStatus);
4f60: 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 61  .  ScanStatus *a
4f70: 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20 28 53  New;.  aNew = (S
4f80: 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c 69 74  canStatus*)sqlit
4f90: 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64  e3DbRealloc(p->d
4fa0: 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e 42 79  b, p->aScan, nBy
4fb0: 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65 77 20  te);.  if( aNew 
4fc0: 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61 74 75  ){.    ScanStatu
4fd0: 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65 77 5b  s *pNew = &aNew[
4fe0: 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20  p->nScan++];.   
4ff0: 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70 6c 61   pNew->addrExpla
5000: 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61 69 6e  in = addrExplain
5010: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72  ;.    pNew->addr
5020: 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f 70 3b  Loop = addrLoop;
5030: 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 56  .    pNew->addrV
5040: 69 73 69 74 20 3d 20 61 64 64 72 56 69 73 69 74  isit = addrVisit
5050: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45 73 74  ;.    pNew->nEst
5060: 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70 4e 65   = nEst;.    pNe
5070: 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  w->zName = sqlit
5080: 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e 64 62  e3DbStrDup(p->db
5090: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 2d  , zName);.    p-
50a0: 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b 0a 20  >aScan = aNew;. 
50b0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   }.}.#endif.../*
50c0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
50d0: 61 6c 75 65 20 6f 66 20 74 68 65 20 6f 70 63 6f  alue of the opco
50e0: 64 65 2c 20 6f 72 20 50 31 2c 20 50 32 2c 20 50  de, or P1, P2, P
50f0: 33 2c 20 6f 72 20 50 35 20 6f 70 65 72 61 6e 64  3, or P5 operand
5100: 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70 65 63 69  s.** for a speci
5110: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
5120: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5130: 56 64 62 65 43 68 61 6e 67 65 4f 70 63 6f 64 65  VdbeChangeOpcode
5140: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5150: 64 72 2c 20 75 38 20 69 4e 65 77 4f 70 63 6f 64  dr, u8 iNewOpcod
5160: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
5170: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
5180: 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77 4f 70 63  opcode = iNewOpc
5190: 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  ode;.}.void sqli
51a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 31 28  te3VdbeChangeP1(
51b0: 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64  Vdbe *p, u32 add
51c0: 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73  r, int val){.  s
51d0: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
51e0: 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d 20 76 61  p,addr)->p1 = va
51f0: 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  l;.}.void sqlite
5200: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56 64  3VdbeChangeP2(Vd
5210: 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c  be *p, u32 addr,
5220: 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c   int val){.  sql
5230: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
5240: 61 64 64 72 29 2d 3e 70 32 20 3d 20 76 61 6c 3b  addr)->p2 = val;
5250: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5260: 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62 65  dbeChangeP3(Vdbe
5270: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
5280: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
5290: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
52a0: 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d  dr)->p3 = val;.}
52b0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
52c0: 65 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a  eChangeP5(Vdbe *
52d0: 70 2c 20 75 38 20 70 35 29 7b 0a 20 20 73 71 6c  p, u8 p5){.  sql
52e0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c  ite3VdbeGetOp(p,
52f0: 2d 31 29 2d 3e 70 35 20 3d 20 70 35 3b 0a 7d 0a  -1)->p5 = p5;.}.
5300: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5310: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
5320: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
5330: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
5340: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
5350: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
5360: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
5370: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
5380: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
5390: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
53a0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 70 2d 3e 70  nt addr){.  p->p
53b0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20  Parse->iFixedOp 
53c0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
53d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
53e0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
53f0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
5400: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5410: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5420: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5430: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5440: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5450: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5460: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
5470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5480: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
5490: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
54a0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
54b0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
54c0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
54d0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
54e0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
54f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5500: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5510: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5520: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5530: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5540: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5550: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5560: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
5570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5580: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
5590: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
55a0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
55b0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
55c0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
55d0: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
55e0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
55f0: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5600: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5610: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5620: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5630: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5640: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5650: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5660: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
5670: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
5680: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
5690: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
56a0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
56b0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
56c0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
56d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
56e0: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
56f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5700: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5710: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5720: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5730: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5740: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5750: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5760: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5770: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
5780: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
5790: 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61  R_HINTS.      ca
57a0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
57b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
57c0: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
57d0: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  r*)p4);.        
57e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
57f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
5800: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
5810: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5820: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5830: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
5840: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5850: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5860: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
5870: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5880: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5890: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
58a0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
58b0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
58c0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
58d0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
58e0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
58f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
5900: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
5910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
5920: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5930: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
5940: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5950: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5960: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
5970: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5980: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
5990: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
59a0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
59b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
59c0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
59d0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
59e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
59f0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5a00: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
5a10: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
5a20: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5a30: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5a40: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5a50: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5a60: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
5a70: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
5a80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5a90: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
5aa0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
5ab0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
5ac0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5ad0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5ae0: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
5af0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5b00: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5b10: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
5b20: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
5b30: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
5b40: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5b50: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5b60: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
5b70: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
5b80: 34 74 79 70 65 20 29 20 66 72 65 65 50 34 28 64  4type ) freeP4(d
5b90: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
5ba0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
5bb0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5bc0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
5bd0: 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  S.      sqlite3D
5be0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
5bf0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
5c00: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
5c10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5c20: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
5c30: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
5c40: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
5c50: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
5c60: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
5c70: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
5c80: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
5c90: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
5ca0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
5cb0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
5cc0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
5cd0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
5ce0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5cf0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
5d00: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
5d10: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
5d20: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
5d30: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
5d40: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
5d50: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
5d60: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
5d70: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
5d80: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
5d90: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73  P_Noop.*/.void s
5da0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5db0: 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20  ToNoop(Vdbe *p, 
5dc0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 69 66 28  int addr){.  if(
5dd0: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a   addr<p->nOp ){.
5de0: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 20      VdbeOp *pOp 
5df0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
5e00: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
5e10: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72   = p->db;.    fr
5e20: 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34  eeP4(db, pOp->p4
5e30: 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29  type, pOp->p4.p)
5e40: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 4f 70  ;.    memset(pOp
5e50: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b  , 0, sizeof(pOp[
5e60: 30 5d 29 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f  0]));.    pOp->o
5e70: 70 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b  pcode = OP_Noop;
5e80: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
5e90: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
5ea0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
5eb0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
5ec0: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
5ed0: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
5ee0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
5ef0: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
5f00: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
5f10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5f20: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
5f30: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
5f40: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e   op){.  if( (p->
5f50: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73  nOp-1)>(p->pPars
5f60: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20  e->iFixedOp) && 
5f70: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
5f80: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
5f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
5fa0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
5fb0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74  >nOp-1);.    ret
5fc0: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5fd0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5fe0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
5ff0: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
6000: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
6010: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
6020: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
6030: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6040: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
6050: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
6060: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
6070: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
6080: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6090: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
60a0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
60b0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
60c0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
60d0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
60e0: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
60f0: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
6100: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
6110: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
6120: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
6130: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
6140: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
6150: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
6160: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
6170: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
6180: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
6190: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
61a0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
61b0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
61c0: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
61d0: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
61e0: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
61f0: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
6200: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
6210: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
6220: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
6230: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
6240: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
6250: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
6260: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
6270: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
6280: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
6290: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
62a0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
62b0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
62c0: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
62d0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
62e0: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
62f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6300: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6310: 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c  vdbeChangeP4Full
6320: 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f  (.  Vdbe *p,.  O
6330: 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20  p *pOp,.  const 
6340: 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74  char *zP4,.  int
6350: 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d   n.){.  if( pOp-
6360: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66  >p4type ){.    f
6370: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70  reeP4(p->db, pOp
6380: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6390: 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  4.p);.    pOp->p
63a0: 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  4type = 0;.    p
63b0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
63c0: 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  }.  if( n<0 ){. 
63d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
63e0: 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28  angeP4(p, (int)(
63f0: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a  pOp - p->aOp), z
6400: 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  P4, n);.  }else{
6410: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
6420: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6430: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
6440: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
6450: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
6460: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
6470: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6480: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76  DYNAMIC;.  }.}.v
6490: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
64a0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
64b0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
64c0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
64d0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
64e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
64f0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
6500: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
6510: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
6520: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
6530: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
6540: 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp!=0 || db->
6550: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6560: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
6570: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
6580: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66  ( n!=P4_VTAB ) f
6590: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
65a0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
65b0: 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  4);.    return;.
65c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
65d0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
65e0: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
65f0: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6600: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
6610: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6620: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
6630: 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20  dr];.  if( n>=0 
6640: 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  || pOp->p4type )
6650: 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65  {.    vdbeChange
6660: 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a  P4Full(p, pOp, z
6670: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75  P4, n);.    retu
6680: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d  rn;.  }.  if( n=
6690: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
66a0: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
66b0: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
66c0: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
66d0: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
66e0: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
66f0: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
6700: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
6710: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
6720: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
6730: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
6740: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6750: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
6760: 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20  f( zP4!=0 ){.   
6770: 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a   assert( n<0 );.
6780: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
6790: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
67a0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
67b0: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
67c0: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42    if( n==P4_VTAB
67d0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f   ) sqlite3VtabLo
67e0: 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29  ck((VTable*)zP4)
67f0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
6800: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
6810: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
6820: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
6830: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
6840: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
6850: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
6860: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
6870: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
6880: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
6890: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
68a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
68b0: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
68c0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
68d0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
68e0: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
68f0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
6900: 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
6910: 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20  se, pIdx),.     
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a   P4_KEYINFO);.}.
6940: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6950: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
6960: 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61  MMENTS./*.** Cha
6970: 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  nge the comment 
6980: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
6990: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
69a0: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
69b0: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
69c0: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
69d0: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
69e0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
69f0: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
6a00: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
6a10: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
6a20: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
6a30: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
6a40: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
6a50: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
6a60: 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28  id vdbeVComment(
6a70: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
6a80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
6a90: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73  _list ap){.  ass
6aa0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
6ab0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
6ac0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
6ad0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
6ae0: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
6af0: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
6b00: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
6b10: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
6b20: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29  assert( p->aOp )
6b30: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
6b40: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  ree(p->db, p->aO
6b50: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
6b60: 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  ment);.    p->aO
6b70: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
6b80: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d  ment = sqlite3VM
6b90: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
6ba0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a  ormat, ap);.  }.
6bb0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
6bc0: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
6bd0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
6be0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
6bf0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
6c00: 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74  ( p ){.    va_st
6c10: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
6c20: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
6c30: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
6c40: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
6c50: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
6c60: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
6c70: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
6c80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
6c90: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
6ca0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
6cb0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
6cc0: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e  beAddOp0(p, OP_N
6cd0: 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61  oop);.    va_sta
6ce0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
6cf0: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
6d00: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
6d10: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
6d20: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
6d30: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23   /* NDEBUG */..#
6d40: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
6d50: 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a  E_COVERAGE./*.**
6d60: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69   Set the value i
6d70: 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66  f the iSrcLine f
6d80: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65  ield for the pre
6d90: 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e  viously coded in
6da0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
6db0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
6dc0: 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65  tLineNumber(Vdbe
6dd0: 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b   *v, int iLine){
6de0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
6df0: 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c  tOp(v,-1)->iSrcL
6e00: 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23  ine = iLine;.}.#
6e10: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
6e20: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f  VDBE_COVERAGE */
6e30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
6e40: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
6e50: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
6e60: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
6e70: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
6e80: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
6e90: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
6ea0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
6eb0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
6ec0: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
6ed0: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
6ee0: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
6ef0: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
6f00: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
6f10: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
6f20: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
6f30: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
6f40: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
6f50: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
6f60: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
6f70: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
6f80: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
6f90: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
6fa0: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
6fb0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
6fc0: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
6fd0: 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d  .** after an OOM
6fe0: 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68   fault without h
6ff0: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
7000: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
7010: 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69  urn from .** thi
7020: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
7030: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42  alid pointer.  B
7040: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ut because the d
7050: 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30  ummy.opcode is 0
7060: 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20  ,.** dummy will 
7070: 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e  never be written
7080: 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65   to.  This is ve
7090: 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69  rified by code i
70a0: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  nspection and.**
70b0: 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   by running with
70c0: 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64   Valgrind..*/.Vd
70d0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
70e0: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
70f0: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
7100: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
7110: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
7120: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
7130: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
7140: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
7150: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
7160: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
7170: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
7180: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
7190: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
71a0: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
71b0: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
71c0: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
71d0: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
71e0: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
71f0: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
7200: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
7210: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
7220: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
7230: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
7240: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
7250: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7260: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
7270: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7280: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
7290: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
72a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
72b0: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
72c0: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  ];.  }.}..#if de
72d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
72e0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
72f0: 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ENTS)./*.** Retu
7300: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  rn an integer va
7310: 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  lue for one of t
7320: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
7330: 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a   the opcode pOp.
7340: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
7350: 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f   character c..*/
7360: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
7370: 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63  slateP(char c, c
7380: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20  onst Op *pOp){. 
7390: 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65   if( c=='1' ) re
73a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  turn pOp->p1;.  
73b0: 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74  if( c=='2' ) ret
73c0: 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  urn pOp->p2;.  i
73d0: 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75  f( c=='3' ) retu
73e0: 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  rn pOp->p3;.  if
73f0: 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72  ( c=='4' ) retur
7400: 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72  n pOp->p4.i;.  r
7410: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d  eturn pOp->p5;.}
7420: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7430: 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  a string for the
7440: 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64   "comment" field
7450: 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64   of a VDBE opcod
7460: 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e listing..**.**
7470: 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66   The Synopsis: f
7480: 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73  ield in comments
7490: 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73   in the vdbe.c s
74a0: 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20  ource file gets 
74b0: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
74c0: 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20  an extra string 
74d0: 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64  that is appended
74e0: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f   to the sqlite3O
74f0: 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e  pcodeName().  In
7500: 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20   the.** absence 
7510: 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74  of other comment
7520: 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73  s, this synopsis
7530: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d   becomes the com
7540: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f  ment on the opco
7550: 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e  de..** Some tran
7560: 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a  slation occurs:.
7570: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22  **.**       "PX"
7580: 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22        ->  "r[X]"
7590: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
75a0: 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  "   ->  "r[X..X+
75b0: 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22  Y-1]"  or "r[x]"
75c0: 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a   if y is 0 or 1.
75d0: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b  **       "PX@PY+
75e0: 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59  1" ->  "r[X..X+Y
75f0: 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20  ]"    or "r[x]" 
7600: 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20  if y is 0.**    
7610: 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20     "PY..PY"  -> 
7620: 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20   "r[X..Y]"      
7630: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d  or "r[x]" if y<=
7640: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  x.*/.static int 
7650: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a  displayComment(.
7660: 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c    const Op *pOp,
7670: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
7680: 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74  de to be comment
7690: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
76a0: 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72  ar *zP4,   /* Pr
76b0: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
76c0: 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a  d value for P4 *
76d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  /.  char *zTemp,
76e0: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
76f0: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20  result here */. 
7700: 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20   int nTemp      
7710: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61      /* Space ava
7720: 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b  ilable in zTemp[
7730: 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ] */.){.  const 
7740: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20  char *zOpName;. 
7750: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
7760: 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f  nopsis;.  int nO
7770: 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c  pName;.  int ii,
7780: 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d   jj;.  zOpName =
7790: 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61   sqlite3OpcodeNa
77a0: 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b  me(pOp->opcode);
77b0: 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c  .  nOpName = sql
77c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70  ite3Strlen30(zOp
77d0: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70  Name);.  if( zOp
77e0: 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20  Name[nOpName+1] 
77f0: 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43  ){.    int seenC
7800: 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72  om = 0;.    char
7810: 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69   c;.    zSynopsi
7820: 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e  s = zOpName += n
7830: 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20  OpName + 1;.    
7840: 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c  for(ii=jj=0; jj<
7850: 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20  nTemp-1 && (c = 
7860: 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d  zSynopsis[ii])!=
7870: 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  0; ii++){.      
7880: 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20  if( c=='P' ){.  
7890: 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70        c = zSynop
78a0: 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20  sis[++ii];.     
78b0: 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b     if( c=='4' ){
78c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
78d0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
78e0: 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20  p-jj, zTemp+jj, 
78f0: 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20  "%s", zP4);.    
7900: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
7910: 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='X' ){.        
7920: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7930: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7940: 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70  mp+jj, "%s", pOp
7950: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
7960: 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d         seenCom =
7970: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
7980: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
7990: 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50   v1 = translateP
79a0: 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20  (c, pOp);.      
79b0: 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20      int v2;.    
79c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
79d0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
79e0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c   zTemp+jj, "%d",
79f0: 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   v1);.          
7a00: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e  if( strncmp(zSyn
7a10: 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22  opsis+ii+1, "@P"
7a20: 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 2)==0 ){.     
7a30: 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a         ii += 3;.
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b              jj +
7a50: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
7a60: 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20  0(zTemp+jj);.   
7a70: 20 20 20 20 20 20 20 20 20 76 32 20 3d 20 74 72           v2 = tr
7a80: 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73  anslateP(zSynops
7a90: 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20  is[ii], pOp);.  
7aa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
7ab0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
7ac0: 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20  ii+1,"+1",2)==0 
7ad0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
7ae0: 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20   ii += 2;.      
7af0: 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20          v2++;.  
7b00: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7b10: 20 20 20 20 20 20 20 20 69 66 28 20 76 32 3e 31          if( v2>1
7b20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65  tf(nTemp-jj, zTe
7b50: 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76  mp+jj, "..%d", v
7b60: 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20  1+v2-1);.       
7b70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
7b80: 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63   }else if( strnc
7b90: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
7ba0: 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30  1, "..P3", 4)==0
7bb0: 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29   && pOp->p3==0 )
7bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 69  {.            ii
7bd0: 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20   += 4;.         
7be0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
7bf0: 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74       jj += sqlit
7c00: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7c10: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  +jj);.      }els
7c20: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70  e{.        zTemp
7c30: 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20  [jj++] = c;.    
7c40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
7c50: 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a  ( !seenCom && jj
7c60: 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d  <nTemp-5 && pOp-
7c70: 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20  >zComment ){.   
7c80: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7c90: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
7ca0: 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20  emp+jj, "; %s", 
7cb0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7cc0: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
7cd0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
7ce0: 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p+jj);.    }.   
7cf0: 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20   if( jj<nTemp ) 
7d00: 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20  zTemp[jj] = 0;. 
7d10: 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e   }else if( pOp->
7d20: 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20  zComment ){.    
7d30: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7d40: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7d50: 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65  %s", pOp->zComme
7d60: 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71  nt);.    jj = sq
7d70: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7d80: 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  emp);.  }else{. 
7d90: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
7da0: 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d  .    jj = 0;.  }
7db0: 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a  .  return jj;.}.
7dc0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
7dd0: 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56  _DEBUG */..#if V
7de0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
7df0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
7e00: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
7e10: 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e  INTS)./*.** Tran
7e20: 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70 45 78  slate the P4.pEx
7e30: 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  pr value for an 
7e40: 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70  OP_CursorHint op
7e50: 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a  code into text.*
7e60: 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20 64 69  * that can be di
7e70: 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50  splayed in the P
7e80: 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c  4 column of EXPL
7e90: 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73  AIN output..*/.s
7ea0: 74 61 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61  tatic int displa
7eb0: 79 50 34 45 78 70 72 28 69 6e 74 20 6e 54 65 6d  yP4Expr(int nTem
7ec0: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
7ed0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
7ee0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
7ef0: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  = 0;.  int n;.  
7f00: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
7f10: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
7f20: 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73  _STRING:.      s
7f30: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7f40: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7f50: 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  Q", pExpr->u.zTo
7f60: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ken);.      brea
7f70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
7f80: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71  NTEGER:.      sq
7f90: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7fa0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64  Temp, zTemp, "%d
7fb0: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
7fc0: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
7fd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
7fe0: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
7ff0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8000: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
8010: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8020: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
8030: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
8040: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8050: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 72 5b 25  emp, zTemp, "r[%
8060: 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  d]", pExpr->iTab
8070: 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
8080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8090: 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20   TK_COLUMN: {.  
80a0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69      if( pExpr->i
80b0: 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20  Column<0 ){.    
80c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
80d0: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
80e0: 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20  p, "rowid");.   
80f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8100: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8110: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8120: 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78   "c%d", (int)pEx
8130: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20  pr->iColumn);.  
8140: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8150: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8160: 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f  e TK_LT:      zO
8170: 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62  p = "LT";      b
8180: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8190: 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_LE:      zOp =
81a0: 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61   "LE";      brea
81b0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
81c0: 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  T:      zOp = "G
81d0: 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  T";      break;.
81e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
81f0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b       zOp = "GE";
8200: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8210: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
8220: 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20    zOp = "NE";   
8230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8240: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
8250: 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20  Op = "EQ";      
8260: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8270: 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20  TK_IS:      zOp 
8280: 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72 65  = "IS";      bre
8290: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
82a0: 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22  ISNOT:   zOp = "
82b0: 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b  ISNOT";   break;
82c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
82d0: 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44  :     zOp = "AND
82e0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
82f0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
8300: 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20     zOp = "OR";  
8310: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8320: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20  ase TK_PLUS:    
8330: 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20  zOp = "ADD";    
8340: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8350: 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70   TK_STAR:    zOp
8360: 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72   = "MUL";     br
8370: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8380: 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20  _MINUS:   zOp = 
8390: 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b  "SUB";     break
83a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
83b0: 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45  M:     zOp = "RE
83c0: 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  M";     break;. 
83d0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e     case TK_BITAN
83e0: 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e  D:  zOp = "BITAN
83f0: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8400: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20  case TK_BITOR:  
8410: 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20   zOp = "BITOR"; 
8420: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8430: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f  e TK_SLASH:   zO
8440: 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62  p = "DIV";     b
8450: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8460: 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_LSHIFT:  zOp =
8470: 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61   "LSHIFT";  brea
8480: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8490: 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52  SHIFT:  zOp = "R
84a0: 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a  SHIFT";  break;.
84b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
84c0: 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43  AT:  zOp = "CONC
84d0: 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AT";  break;.   
84e0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
84f0: 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b    zOp = "MINUS";
8500: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8510: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a  se TK_UPLUS:   z
8520: 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20  Op = "PLUS";    
8530: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8540: 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20  TK_BITNOT:  zOp 
8550: 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65  = "BITNOT";  bre
8560: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8570: 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  NOT:     zOp = "
8580: 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  NOT";     break;
8590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
85a0: 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e  ULL:  zOp = "ISN
85b0: 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  ULL";  break;.  
85c0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
85d0: 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c  L: zOp = "NOTNUL
85e0: 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  L"; break;..    
85f0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73  default:.      s
8600: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8610: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
8620: 73 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20  s", "expr");.   
8630: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
8640: 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20   if( zOp ){.    
8650: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8660: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8670: 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20  %s(", zOp);.    
8680: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
8690: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
86a0: 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50 34 45 78  n += displayP4Ex
86b0: 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d  pr(nTemp-n, zTem
86c0: 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  p+n, pExpr->pLef
86d0: 74 29 3b 0a 20 20 20 20 69 66 28 20 6e 3c 6e 54  t);.    if( n<nT
86e0: 65 6d 70 2d 31 20 26 26 20 70 45 78 70 72 2d 3e  emp-1 && pExpr->
86f0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
8700: 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27 2c 27  zTemp[n++] = ','
8710: 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 64 69 73  ;.      n += dis
8720: 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70  playP4Expr(nTemp
8730: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78  -n, zTemp+n, pEx
8740: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
8750: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73   }.    sqlite3_s
8760: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6e 2c  nprintf(nTemp-n,
8770: 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22 29 3b 0a   zTemp+n, ")");.
8780: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
8790: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
87a0: 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  mp);.}.#endif /*
87b0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
87c0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
87d0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
87e0: 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66  _HINTS) */...#if
87f0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
8800: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61  ./*.** Compute a
8810: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
8820: 63 72 69 62 65 73 20 74 68 65 20 50 34 20 70 61  cribes the P4 pa
8830: 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f  rameter for an o
8840: 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54  pcode..** Use zT
8850: 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75  emp for any requ
8860: 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62  ired temporary b
8870: 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a  uffer space..*/.
8880: 73 74 61 74 69 63 20 63 68 61 72 20 2a 64 69 73  static char *dis
8890: 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20  playP4(Op *pOp, 
88a0: 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74  char *zTemp, int
88b0: 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20   nTemp){.  char 
88c0: 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20  *zP4 = zTemp;.  
88d0: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
88e0: 30 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70  0 );.  switch( p
88f0: 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20  Op->p4type ){.  
8900: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
8910: 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  O: {.      int i
8920: 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  , j;.      KeyIn
8930: 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
8940: 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b  Op->p4.pKeyInfo;
8950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8960: 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
8970: 64 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  der!=0 );.      
8980: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8990: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
89a0: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
89b0: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
89c0: 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
89d0: 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20  n30(zTemp);.    
89e0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65    for(j=0; j<pKe
89f0: 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a  yInfo->nField; j
8a00: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c  ++){.        Col
8a10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b  lSeq *pColl = pK
8a20: 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d  eyInfo->aColl[j]
8a30: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
8a40: 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43  char *zColl = pC
8a50: 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61  oll ? pColl->zNa
8a60: 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20  me : "nil";.    
8a70: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
8a80: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c  te3Strlen30(zCol
8a90: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
8aa0: 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a  n==6 && memcmp(z
8ab0: 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29  Coll,"BINARY",6)
8ac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8ad0: 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20   zColl = "B";.  
8ae0: 20 20 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20          n = 1;. 
8af0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8b00: 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 37   if( i+n>nTemp-7
8b10: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
8b20: 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22  mcpy(&zTemp[i],"
8b30: 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20  ,...",4);.      
8b40: 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20      i += 4;.    
8b50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8b60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
8b70: 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b  Temp[i++] = ',';
8b80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4b 65  .        if( pKe
8b90: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
8ba0: 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[j] ){.        
8bb0: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
8bc0: 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -';.        }.  
8bd0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54        memcpy(&zT
8be0: 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e  emp[i], zColl, n
8bf0: 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b  +1);.        i +
8c00: 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
8c10: 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20     zTemp[i++] = 
8c20: 27 29 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70  ')';.      zTemp
8c30: 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  [i] = 0;.      a
8c40: 73 73 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29  ssert( i<nTemp )
8c50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8c60: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
8c70: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8c80: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
8c90: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
8ca0: 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e   displayP4Expr(n
8cb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 70 4f 70  Temp, zTemp, pOp
8cc0: 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20  ->p4.pExpr);.   
8cd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8ce0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
8cf0: 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20  P4_COLLSEQ: {.  
8d00: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
8d10: 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f  ll = pOp->p4.pCo
8d20: 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ll;.      sqlite
8d30: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8d40: 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73  , zTemp, "(%.20s
8d50: 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  )", pColl->zName
8d60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8d70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
8d80: 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20  4_FUNCDEF: {.   
8d90: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
8da0: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63   = pOp->p4.pFunc
8db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8dc0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8dd0: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
8de0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
8df0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
8e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
8e10: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
8e20: 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f 46 55  G.    case P4_FU
8e30: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46  NCCTX: {.      F
8e40: 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70  uncDef *pDef = p
8e50: 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75  Op->p4.pCtx->pFu
8e60: 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  nc;.      sqlite
8e70: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8e80: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29  , zTemp, "%s(%d)
8e90: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
8ea0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
8eb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8ec0: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
8ed0: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
8ee0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8ef0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8f00: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
8f10: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
8f20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8f30: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
8f40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
8f50: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8f60: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
8f70: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
8f80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8f90: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
8fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8fb0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
8fc0: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
8fd0: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
8fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8ff0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
9000: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
9010: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
9020: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
9030: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9040: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
9050: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
9060: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
9070: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
9080: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
9090: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
90a0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
90b0: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
90c0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
90d0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
90e0: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
90f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
9100: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
9110: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
9120: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
9130: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
9140: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
9150: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9160: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9170: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
9180: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
9190: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
91a0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
91b0: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
91c0: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
91d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
91e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
91f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9200: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
9210: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
9220: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
9230: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
9240: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
9250: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
9260: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
9270: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
9280: 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20  ", pVtab);.     
9290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
92a0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
92b0: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
92c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
92d0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
92e0: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
92f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9300: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
9310: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
9320: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9330: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9340: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
9350: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9360: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
9370: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
9380: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
9390: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
93a0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
93b0: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
93c0: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
93d0: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
93e0: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
93f0: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
9400: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
9410: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
9420: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
9430: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20  n zP4;.}.#endif 
9440: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
9450: 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  P4 */../*.** Dec
9460: 6c 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65  lare to the Vdbe
9470: 20 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20   that the BTree 
9480: 6f 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44  object at db->aD
9490: 62 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a  b[i] is used..**
94a0: 0a 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64  .** The prepared
94b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64   statements need
94c0: 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61   to know in adva
94d0: 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65  nce the complete
94e0: 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63   set of.** attac
94f0: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68  hed databases th
9500: 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20  at will be use. 
9510: 20 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65   A mask of these
9520: 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73   databases.** is
9530: 20 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70   maintained in p
9540: 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68  ->btreeMask.  Th
9550: 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61  e p->lockMask va
9560: 6c 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65  lue is the subse
9570: 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65  t of.** p->btree
9580: 4d 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  Mask of database
9590: 73 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75  s that will requ
95a0: 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76  ire a lock..*/.v
95b0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55  oid sqlite3VdbeU
95c0: 73 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70  sesBtree(Vdbe *p
95d0: 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65  , int i){.  asse
95e0: 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d  rt( i>=0 && i<p-
95f0: 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69  >db->nDb && i<(i
9600: 6e 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73  nt)sizeof(yDbMas
9610: 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74  k)*8 );.  assert
9620: 28 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28  ( i<(int)sizeof(
9630: 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20  p->btreeMask)*8 
9640: 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70  );.  DbMaskSet(p
9650: 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b  ->btreeMask, i);
9660: 0a 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73  .  if( i!=1 && s
9670: 71 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61  qlite3BtreeShara
9680: 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69  ble(p->db->aDb[i
9690: 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62  ].pBt) ){.    Db
96a0: 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d  MaskSet(p->lockM
96b0: 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a  ask, i);.  }.}..
96c0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
96d0: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
96e0: 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20  CACHE)./*.** If 
96f0: 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c  SQLite is compil
9700: 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68  ed to support sh
9710: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20  ared-cache mode 
9720: 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64  and to be thread
9730: 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  safe,.** this ro
9740: 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68  utine obtains th
9750: 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74  e mutex associat
9760: 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53  ed with each BtS
9770: 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a  hared structure.
9780: 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61  ** that may be a
9790: 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56  ccessed by the V
97a0: 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61  M passed as an a
97b0: 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e  rgument. In doin
97c0: 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20  g so it also.** 
97d0: 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65  sets the BtShare
97e0: 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65  d.db member of e
97f0: 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61  ach of the BtSha
9800: 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20  red structures, 
9810: 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74  ensuring.** that
9820: 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73   the correct bus
9830: 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61  y-handler callba
9840: 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66  ck is invoked if
9850: 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a   required..**.**
9860: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f   If SQLite is no
9870: 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74  t threadsafe but
9880: 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68   does support sh
9890: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
98a0: 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33   then.** sqlite3
98b0: 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20  BtreeEnter() is 
98c0: 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74  invoked to set t
98d0: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76  he BtShared.db v
98e0: 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61  ariables.** of a
98f0: 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73  ll of BtShared s
9900: 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73  tructures access
9910: 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74  ible via the dat
9920: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a  abase handle .**
9930: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
9940: 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49   the VM..**.** I
9950: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
9960: 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64  threadsafe and d
9970: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
9980: 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64  shared-cache mod
9990: 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  e, this.** funct
99a0: 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
99b0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72  **.** The p->btr
99c0: 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20  eeMask field is 
99d0: 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c  a bitmask of all
99e0: 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65   btrees that the
99f0: 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74   prepared .** st
9a00: 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65  atement p will e
9a10: 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20  ver use.  Let N 
9a20: 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  be the number of
9a30: 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65   bits in p->btre
9a40: 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70  eMask.** corresp
9a50: 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73  onding to btrees
9a60: 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64   that use shared
9a70: 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68   cache.  Then th
9a80: 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20  e runtime of.** 
9a90: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
9aa0: 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69  N*N.  But as N i
9ab0: 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68  s rarely more th
9ac0: 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c  an 1, this shoul
9ad0: 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72  d not.** be a pr
9ae0: 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  oblem..*/.void s
9af0: 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
9b00: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
9b10: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
9b20: 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69  ;.  Db *aDb;.  i
9b30: 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62  nt nDb;.  if( Db
9b40: 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c  MaskAllZero(p->l
9b50: 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72  ockMask) ) retur
9b60: 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f  n;  /* The commo
9b70: 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d  n case */.  db =
9b80: 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20   p->db;.  aDb = 
9b90: 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d  db->aDb;.  nDb =
9ba0: 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28   db->nDb;.  for(
9bb0: 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29  i=0; i<nDb; i++)
9bc0: 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26  {.    if( i!=1 &
9bd0: 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e  & DbMaskTest(p->
9be0: 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41  lockMask,i) && A
9bf0: 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74  LWAYS(aDb[i].pBt
9c00: 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71  !=0) ){.      sq
9c10: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
9c20: 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[i].pBt);.   
9c30: 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a   }.  }.}.#endif.
9c40: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
9c50: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
9c60: 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54  _CACHE) && SQLIT
9c70: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f  E_THREADSAFE>0./
9c80: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20  *.** Unlock all 
9c90: 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72  of the btrees pr
9ca0: 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20  eviously locked 
9cb0: 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c  by a call to sql
9cc0: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e  ite3VdbeEnter().
9cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
9ce0: 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20  E_NOINLINE void 
9cf0: 76 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a  vdbeLeave(Vdbe *
9d00: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
9d10: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
9d20: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
9d30: 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  ;.  db = p->db;.
9d40: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
9d50: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
9d60: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
9d70: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
9d80: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
9d90: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
9da0: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
9db0: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
9dc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
9dd0: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
9de0: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
9df0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
9e00: 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b  eLeave(Vdbe *p){
9e10: 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c  .  if( DbMaskAll
9e20: 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Zero(p->lockMask
9e30: 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20  ) ) return;  /* 
9e40: 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  The common case 
9e50: 2a 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70  */.  vdbeLeave(p
9e60: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  );.}.#endif..#if
9e70: 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52   defined(VDBE_PR
9e80: 4f 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65  OFILE) || define
9e90: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a  d(SQLITE_DEBUG).
9ea0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69  /*.** Print a si
9eb0: 6e 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68  ngle opcode.  Th
9ec0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
9ed0: 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67  ed for debugging
9ee0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73   only..*/.void s
9ef0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
9f00: 70 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e  p(FILE *pOut, in
9f10: 74 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a  t pc, Op *pOp){.
9f20: 20 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63    char *zP4;.  c
9f30: 68 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20  har zPtr[50];.  
9f40: 63 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a  char zCom[100];.
9f50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63    static const c
9f60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20  har *zFormat1 = 
9f70: 22 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25  "%4d %-13s %4d %
9f80: 34 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32  4d %4d %-13s %.2
9f90: 58 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70  X %s\n";.  if( p
9fa0: 4f 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20  Out==0 ) pOut = 
9fb0: 73 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20  stdout;.  zP4 = 
9fc0: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a  displayP4(pOp, z
9fd0: 50 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72  Ptr, sizeof(zPtr
9fe0: 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
9ff0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
a000: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70  _COMMENTS.  disp
a010: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
a020: 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f  zP4, zCom, sizeo
a030: 66 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a  f(zCom));.#else.
a040: 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23    zCom[0] = 0;.#
a050: 65 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20  endif.  /* NB:  
a060: 54 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  The sqlite3Opcod
a070: 65 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e  eName() function
a080: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
a090: 62 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a  by code created.
a0a0: 20 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70    ** by the mkop
a0b0: 63 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b  codeh.awk and mk
a0c0: 6f 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69  opcodec.awk scri
a0d0: 70 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63  pts which extrac
a0e0: 74 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72  t the.  ** infor
a0f0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20  mation from the 
a100: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65  vdbe.c source te
a110: 78 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28  xt */.  fprintf(
a120: 70 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20  pOut, zFormat1, 
a130: 70 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74  pc, .      sqlit
a140: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
a150: 2d 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e  ->opcode), pOp->
a160: 70 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70  p1, pOp->p2, pOp
a170: 2d 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e  ->p3, zP4, pOp->
a180: 70 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20  p5,.      zCom. 
a190: 20 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75   );.  fflush(pOu
a1a0: 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
a1b0: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61  .** Release an a
a1c0: 72 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c  rray of N Mem el
a1d0: 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  ements.*/.static
a1e0: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d   void releaseMem
a1f0: 41 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e  Array(Mem *p, in
a200: 74 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26  t N){.  if( p &&
a210: 20 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   N ){.    Mem *p
a220: 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20  End = &p[N];.   
a230: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
a240: 2d 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c  ->db;.    u8 mal
a250: 6c 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d  loc_failed = db-
a260: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20  >mallocFailed;. 
a270: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
a280: 65 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20  esFreed ){.     
a290: 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28   do{.        if(
a2a0: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
a2b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
a2c0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
a2d0: 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70      }while( (++p
a2e0: 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20  )<pEnd );.      
a2f0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20  return;.    }.  
a300: 20 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65    do{.      asse
a310: 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e  rt( (&p[1])==pEn
a320: 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b  d || p[0].db==p[
a330: 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61  1].db );.      a
a340: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64  ssert( sqlite3Vd
a350: 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69  beCheckMemInvari
a360: 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20  ants(p) );..    
a370: 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20    /* This block 
a380: 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c  is really an inl
a390: 69 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ined version of 
a3a0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
a3b0: 6c 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a  lease().      **
a3c0: 20 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61   that takes adva
a3d0: 6e 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63  ntage of the fac
a3e0: 74 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  t that the memor
a3f0: 79 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20  y cell value is 
a400: 0a 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20  .      ** being 
a410: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65  set to NULL afte
a420: 72 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20  r releasing any 
a430: 64 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65  dynamic resource
a440: 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s..      **.    
a450: 20 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69    ** The justifi
a460: 63 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69  cation for dupli
a470: 63 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74  cating code is t
a480: 68 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  hat according to
a490: 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67   .      ** callg
a4a0: 72 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65  rind, this cause
a4b0: 73 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74  s a certain test
a4c0: 20 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65   case to hit the
a4d0: 20 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20   CPU 4.7 .      
a4e0: 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20  ** percent less 
a4f0: 28 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20  (x86 linux, gcc 
a500: 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d  version 4.1.2, -
a510: 4f 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20  O6) than if .   
a520: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d     ** sqlite3Mem
a530: 52 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63  Release() were c
a540: 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e  alled from here.
a550: 20 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20   With -O2, this 
a560: 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74  jumps.      ** t
a570: 6f 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54  o 6.6 percent. T
a580: 68 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20  he test case is 
a590: 69 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72  inserting 1000 r
a5a0: 6f 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65  ows into a table
a5b0: 20 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20   .      ** with 
a5c0: 6e 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67  no indexes using
a5d0: 20 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72   a single prepar
a5e0: 65 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d  ed INSERT statem
a5f0: 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20  ent, bind() .   
a600: 20 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28     ** and reset(
a610: 29 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67  ). Inserts are g
a620: 72 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72  rouped into a tr
a630: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20  ansaction..     
a640: 20 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61   */.      testca
a650: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a660: 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20  EM_Agg );.      
a670: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a680: 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a  gs & MEM_Dyn );.
a690: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a6a0: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46  p->flags & MEM_F
a6b0: 72 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65  rame );.      te
a6c0: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
a6d0: 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b   & MEM_RowSet );
a6e0: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c  .      if( p->fl
a6f0: 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d  ags&(MEM_Agg|MEM
a700: 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d  _Dyn|MEM_Frame|M
a710: 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20  EM_RowSet) ){.  
a720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a730: 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a  eMemRelease(p);.
a740: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a750: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20  p->szMalloc ){. 
a760: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
a770: 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c  Free(db, p->zMal
a780: 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  loc);.        p-
a790: 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20  >szMalloc = 0;. 
a7a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d       }..      p-
a7b0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64  >flags = MEM_Und
a7c0: 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69  efined;.    }whi
a7d0: 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29  le( (++p)<pEnd )
a7e0: 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  ;.    db->malloc
a7f0: 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f  Failed = malloc_
a800: 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f  failed;.  }.}../
a810: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
a820: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
a830: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
a840: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
a850: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
a860: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
a870: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
a880: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
a890: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
a8a0: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
a8b0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
a8c0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
a8d0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
a8e0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
a8f0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
a900: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
a910: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
a920: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
a930: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
a940: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
a950: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
a960: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
a970: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
a980: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
a990: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
a9a0: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
a9b0: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
a9c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
a9d0: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
a9e0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
a9f0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
aa00: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
aa10: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
aa20: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
aa30: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
aa40: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
aa50: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
aa60: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
aa70: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
aa80: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
aa90: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
aaa0: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
aab0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
aac0: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
aad0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
aae0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
aaf0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
ab00: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
ab10: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
ab20: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
ab30: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
ab40: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
ab50: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
ab60: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
ab70: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
ab80: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
ab90: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
aba0: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
abb0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
abc0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
abd0: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
abe0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
abf0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
ac00: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
ac10: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
ac20: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
ac30: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
ac40: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
ac50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac60: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
ac70: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
ac80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ac90: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
aca0: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
acb0: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
acc0: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ace0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
acf0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
ad00: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
ad10: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
ad20: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
ad30: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
ad40: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
ad50: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
ad60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad70: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
ad80: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
ad90: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
ada0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
adb0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
adc0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
add0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
ade0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
ae10: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
ae20: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
ae30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
ae40: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
ae50: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
ae60: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
ae70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ae80: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
ae90: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
aea0: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
aeb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
aec0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
aed0: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
aee0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
aef0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
af00: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
af10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
af20: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
af30: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
af40: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
af50: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
af60: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
af70: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
af80: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
af90: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
afa0: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
afb0: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
afc0: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
afd0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
afe0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
aff0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
b000: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
b010: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
b020: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
b030: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b040: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
b050: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
b060: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
b070: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
b080: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
b090: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
b0a0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
b0b0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64  ailed.  */.    d
b0c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
b0d0: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
b0e0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b0f0: 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  }..  /* When the
b100: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
b110: 74 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e  t rows reaches n
b120: 52 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  Row, that means 
b130: 74 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67  the.  ** listing
b140: 20 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e   has finished an
b150: 64 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  d sqlite3_step()
b160: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53   should return S
b170: 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a  QLITE_DONE..  **
b180: 20 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d   nRow is the sum
b190: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b1a0: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61  f rows in the ma
b1b0: 69 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73  in program, plus
b1c0: 0a 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66  .  ** the sum of
b1d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
b1e0: 6f 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67  ows in all trigg
b1f0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65  er subprograms e
b200: 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20  ncountered.  ** 
b210: 73 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f  so far.  The nRo
b220: 77 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63  w value will inc
b230: 72 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69  rease as new tri
b240: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b250: 20 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e   are.  ** encoun
b260: 74 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63  tered, but p->pc
b270: 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
b280: 20 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f   catch up to nRo
b290: 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d  w..  */.  nRow =
b2a0: 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70   p->nOp;.  if( p
b2b0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
b2c0: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
b2d0: 20 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20   8 memory cells 
b2e0: 61 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  are used for the
b2f0: 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f   result set.  So
b300: 20 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20   we will.    ** 
b310: 63 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39  commandeer the 9
b320: 74 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61  th cell to use a
b330: 73 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e  s storage for an
b340: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
b350: 72 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69  rs.    ** to tri
b360: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
b370: 2e 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67  .  The VDBE is g
b380: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76  uaranteed to hav
b390: 65 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20  e at least 9.   
b3a0: 20 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20   ** cells.  */. 
b3b0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d     assert( p->nM
b3c0: 65 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62  em>9 );.    pSub
b3d0: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a   = &p->aMem[9];.
b3e0: 20 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c      if( pSub->fl
b3f0: 61 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  ags&MEM_Blob ){.
b400: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20        /* On the 
b410: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
b420: 6c 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53  lite3_step(), pS
b430: 75 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e  ub will hold a N
b440: 55 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ULL.  It is.    
b450: 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64    ** initialized
b460: 20 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68   to a BLOB by th
b470: 65 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  e P4_SUBPROGRAM 
b480: 70 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63  processing logic
b490: 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20   below */.      
b4a0: 6e 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73  nSub = pSub->n/s
b4b0: 69 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20  izeof(Vdbe*);.  
b4c0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
b4d0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
b4e0: 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  >z;.    }.    fo
b4f0: 72 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69  r(i=0; i<nSub; i
b500: 2b 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20  ++){.      nRow 
b510: 2b 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70  += apSub[i]->nOp
b520: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64  ;.    }.  }..  d
b530: 6f 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63  o{.    i = p->pc
b540: 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c  ++;.  }while( i<
b550: 6e 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61  nRow && p->expla
b560: 69 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b  in==2 && p->aOp[
b570: 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78  i].opcode!=OP_Ex
b580: 70 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69  plain );.  if( i
b590: 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d  >=nRow ){.    p-
b5a0: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
b5b0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
b5c0: 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69  _DONE;.  }else i
b5d0: 66 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  f( db->u1.isInte
b5e0: 72 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70  rrupted ){.    p
b5f0: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e  ->rc = SQLITE_IN
b600: 54 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20  TERRUPT;.    rc 
b610: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
b620: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
b630: 72 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45  rror(p, sqlite3E
b640: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
b650: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
b660: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
b670: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
b680: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
b690: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
b6a0: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
b6b0: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
b6c0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
b6d0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
b6e0: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
b6f0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
b700: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
b710: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
b720: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
b730: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
b740: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
b750: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
b760: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
b770: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
b780: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
b790: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
b7a0: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
b7b0: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
b7c0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
b7d0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
b7e0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
b7f0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
b800: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
b810: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
b820: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
b830: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
b840: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
b850: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
b860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b880: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
b890: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
b8a0: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
b8b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
b8c0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
b8d0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
b8e0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
b8f0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
b900: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
b910: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
b920: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
b930: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
b940: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
b950: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
b960: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
b970: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
b980: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
b990: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
b9a0: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
b9b0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
b9c0: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
b9d0: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
b9e0: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
b9f0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
ba00: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
ba10: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
ba20: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
ba30: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
ba40: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
ba50: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
ba60: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
ba70: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
ba80: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
ba90: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
baa0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
bab0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
bac0: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
bad0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
bae0: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
baf0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
bb00: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
bb10: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
bb20: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
bb30: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
bb40: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
bb50: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
bb60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb70: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
bb80: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
bb90: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
bba0: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
bbb0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
bbc0: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
bbd0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
bbe0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
bbf0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
bc00: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
bc10: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
bc20: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
bc30: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
bc40: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
bc50: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
bc60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
bc70: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
bc80: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
bc90: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
bca0: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
bcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcc0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
bcd0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
bce0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
bcf0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
bd00: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
bd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd20: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
bd30: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
bd40: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
bd50: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
bd60: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
bd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
bd90: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
bda0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
bdb0: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
bdc0: 73 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20  size(pMem, 100) 
bdd0: 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20  ){ /* P4 */.    
bde0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
bdf0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
be00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
be10: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
be20: 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  }.    pMem->flag
be30: 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  s = MEM_Str|MEM_
be40: 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20  Term;.    zP4 = 
be50: 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70  displayP4(pOp, p
be60: 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a  Mem->z, pMem->sz
be70: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  Malloc);.    if(
be80: 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b   zP4!=pMem->z ){
be90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bea0: 62 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d  beMemSetStr(pMem
beb0: 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54  , zP4, -1, SQLIT
bec0: 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20  E_UTF8, 0);.    
bed0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
bee0: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
bef0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
bf00: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
bf10: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
bf20: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
bf30: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
bf40: 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  }.    pMem++;.. 
bf50: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
bf60: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66  n==1 ){.      if
bf70: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
bf80: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
bf90: 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20  Mem, 4) ){.     
bfa0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
bfb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bfc0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
bfd0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
bfe0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
bff0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c000: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
c010: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a     pMem->n = 2;.
c020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
c030: 70 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e  printf(3, pMem->
c040: 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e  z, "%.2x", pOp->
c050: 70 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a  p5);   /* P5 */.
c060: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
c070: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
c080: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
c090: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c0a0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
c0b0: 4d 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20  MENTS.      if( 
c0c0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
c0d0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
c0e0: 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20  m, 500) ){.     
c0f0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62     assert( p->db
c100: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c110: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
c120: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c130: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65       }.      pMe
c140: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
c150: 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20  tr|MEM_Term;.   
c160: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73     pMem->n = dis
c170: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c  playComment(pOp,
c180: 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35   zP4, pMem->z, 5
c190: 30 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  00);.      pMem-
c1a0: 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54  >enc = SQLITE_UT
c1b0: 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  F8;.#else.      
c1c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c1d0: 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20  M_Null;         
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c1f0: 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64   Comment */.#end
c200: 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d  if.    }..    p-
c210: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20  >nResColumn = 8 
c220: 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d  - 4*(p->explain-
c230: 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75  1);.    p->pResu
c240: 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d  ltSet = &p->aMem
c250: 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  [1];.    p->rc =
c260: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
c270: 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b  rc = SQLITE_ROW;
c280: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c290: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
c2a0: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
c2b0: 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  N */..#ifdef SQL
c2c0: 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
c2d0: 50 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68  Print the SQL th
c2e0: 61 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67  at was used to g
c2f0: 65 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70  enerate a VDBE p
c300: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  rogram..*/.void 
c310: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
c320: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
c330: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
c340: 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c  0;.  if( p->zSql
c350: 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a   ){.    z = p->z
c360: 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  Sql;.  }else if(
c370: 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20   p->nOp>=1 ){.  
c380: 20 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a    const VdbeOp *
c390: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
c3a0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f  ;.    if( pOp->o
c3b0: 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26  pcode==OP_Init &
c3c0: 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29  & pOp->p4.z!=0 )
c3d0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d  {.      z = pOp-
c3e0: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69  >p4.z;.      whi
c3f0: 6c 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61  le( sqlite3Isspa
c400: 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20  ce(*z) ) z++;.  
c410: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20    }.  }.  if( z 
c420: 29 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b  ) printf("SQL: [
c430: 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65  %s]\n", z);.}.#e
c440: 6e 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e  ndif..#if !defin
c450: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
c460: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
c470: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
c480: 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72  OTRACE)./*.** Pr
c490: 69 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d  int an IOTRACE m
c4a0: 65 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53  essage showing S
c4b0: 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76  QL content..*/.v
c4c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49  oid sqlite3VdbeI
c4d0: 4f 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a  OTraceSql(Vdbe *
c4e0: 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20  p){.  int nOp = 
c4f0: 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70  p->nOp;.  VdbeOp
c500: 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c   *pOp;.  if( sql
c510: 69 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29  ite3IoTrace==0 )
c520: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e   return;.  if( n
c530: 4f 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20  Op<1 ) return;. 
c540: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30   pOp = &p->aOp[0
c550: 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  ];.  if( pOp->op
c560: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
c570: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
c580: 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  .    int i, j;. 
c590: 20 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b     char z[1000];
c5a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
c5b0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
c5c0: 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70   z, "%s", pOp->p
c5d0: 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  4.z);.    for(i=
c5e0: 30 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  0; sqlite3Isspac
c5f0: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
c600: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69      for(j=0; z[i
c610: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
c620: 66 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  f( sqlite3Isspac
c630: 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20  e(z[i]) ){.     
c640: 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27     if( z[i-1]!='
c650: 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   ' ){.          
c660: 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20  z[j++] = ' ';.  
c670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
c680: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a  lse{.        z[j
c690: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20  ++] = z[i];.    
c6a0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
c6b0: 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  j] = 0;.    sqli
c6c0: 74 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20  te3IoTrace("SQL 
c6d0: 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d  %s\n", z);.  }.}
c6e0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
c6f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26  TE_OMIT_TRACE &&
c700: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
c710: 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  OTRACE */../*.**
c720: 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   Allocate space 
c730: 66 72 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a  from a fixed siz
c740: 65 20 62 75 66 66 65 72 20 61 6e 64 20 72 65 74  e buffer and ret
c750: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
c760: 0a 2a 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20  .** that space. 
c770: 20 49 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74   If insufficient
c780: 20 73 70 61 63 65 20 69 73 20 61 76 61 69 6c 61   space is availa
c790: 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ble, return NULL
c7a0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66  ..**.** The pBuf
c7b0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
c7c0: 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  e initial value 
c7d0: 6f 66 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69  of a pointer whi
c7e0: 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69  ch will.** recei
c7f0: 76 65 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72  ve the new memor
c800: 79 2e 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d  y.  pBuf is norm
c810: 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70  ally NULL.  If p
c820: 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55  Buf is not.** NU
c830: 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  LL, it means tha
c840: 74 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68  t memory space h
c850: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
c860: 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
c870: 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  at.** this routi
c880: 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c  ne should not al
c890: 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d  locate any new m
c8a0: 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75  emory.  When pBu
c8b0: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
c8c0: 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70   simply return p
c8d0: 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63  Buf.  Only alloc
c8e0: 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73  ate new memory s
c8f0: 70 61 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a  pace when pBuf.*
c900: 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  * is NULL..**.**
c910: 20 6e 42 79 74 65 20 69 73 20 74 68 65 20 6e 75   nByte is the nu
c920: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
c930: 20 73 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a   space needed..*
c940: 2a 0a 2a 2a 20 70 46 72 6f 6d 20 70 6f 69 6e 74  *.** pFrom point
c950: 73 20 74 6f 20 2a 70 6e 46 72 6f 6d 20 62 79 74  s to *pnFrom byt
c960: 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
c970: 73 70 61 63 65 2e 20 20 4e 65 77 20 73 70 61 63  space.  New spac
c980: 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  e is allocated.*
c990: 2a 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f  * from the end o
c9a0: 66 20 74 68 65 20 70 46 72 6f 6d 20 62 75 66 66  f the pFrom buff
c9b0: 65 72 20 61 6e 64 20 2a 70 6e 46 72 6f 6d 20 69  er and *pnFrom i
c9c0: 73 20 64 65 63 72 65 6d 65 6e 74 65 64 2e 0a 2a  s decremented..*
c9d0: 2a 0a 2a 2a 20 2a 70 6e 4e 65 65 64 65 64 20 69  *.** *pnNeeded i
c9e0: 73 20 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74  s a counter of t
c9f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
ca00: 65 73 20 6f 66 20 73 70 61 63 65 20 74 68 61 74  es of space that
ca10: 20 68 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20   have failed.** 
ca20: 74 6f 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66  to allocate.  If
ca30: 20 74 68 65 72 65 20 69 73 20 69 6e 73 75 66 66   there is insuff
ca40: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20  icient space in 
ca50: 70 46 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79  pFrom to satisfy
ca60: 20 74 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c   the.** request,
ca70: 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20   then increment 
ca80: 2a 70 6e 4e 65 65 64 65 64 20 62 79 20 74 68 65  *pnNeeded by the
ca90: 20 61 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72   amount of the r
caa0: 65 71 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  equest..*/.stati
cab0: 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61  c void *allocSpa
cac0: 63 65 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66  ce(.  void *pBuf
cad0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
cae0: 65 72 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74  ere return point
caf0: 65 72 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65  er will be store
cb00: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  d */.  int nByte
cb10: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ,           /* N
cb20: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
cb30: 6f 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20  o allocate */.  
cb40: 75 38 20 2a 70 46 72 6f 6d 2c 20 20 20 20 20 20  u8 *pFrom,      
cb50: 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61       /* Memory a
cb60: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c  vailable for all
cb70: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74  ocation */.  int
cb80: 20 2a 70 6e 46 72 6f 6d 2c 20 20 20 20 20 20 20   *pnFrom,       
cb90: 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 70 61    /* IN/OUT: Spa
cba0: 63 65 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20  ce available at 
cbb0: 70 46 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a  pFrom */.  int *
cbc0: 70 6e 4e 65 65 64 65 64 20 20 20 20 20 20 20 20  pnNeeded        
cbd0: 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e  /* If allocation
cbe0: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c   cannot be made,
cbf0: 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79   increment *pnBy
cc00: 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72  te */.){.  asser
cc10: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
cc20: 49 47 4e 4d 45 4e 54 28 70 46 72 6f 6d 29 20 29  IGNMENT(pFrom) )
cc30: 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20  ;.  if( pBuf==0 
cc40: 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52  ){.    nByte = R
cc50: 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20  OUND8(nByte);.  
cc60: 20 20 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 2a    if( nByte <= *
cc70: 70 6e 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  pnFrom ){.      
cc80: 2a 70 6e 46 72 6f 6d 20 2d 3d 20 6e 42 79 74 65  *pnFrom -= nByte
cc90: 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
cca0: 70 46 72 6f 6d 5b 2a 70 6e 46 72 6f 6d 5d 3b 0a  pFrom[*pnFrom];.
ccb0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ccc0: 20 2a 70 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42   *pnNeeded += nB
ccd0: 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  yte;.    }.  }. 
cce0: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
ccf0: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42  YTE_ALIGNMENT(pB
cd00: 75 66 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  uf) );.  return 
cd10: 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pBuf;.}../*.** R
cd20: 65 77 69 6e 64 20 74 68 65 20 56 44 42 45 20 62  ewind the VDBE b
cd30: 61 63 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e  ack to the begin
cd40: 6e 69 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74  ning in preparat
cd50: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69  ion for.** runni
cd60: 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ng it..*/.void s
cd70: 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64  qlite3VdbeRewind
cd80: 28 56 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64  (Vdbe *p){.#if d
cd90: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
cda0: 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
cdb0: 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20  VDBE_PROFILE).  
cdc0: 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20  int i;.#endif.  
cdd0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
cde0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
cdf0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
ce00: 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  NIT );..  /* The
ce10: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20  re should be at 
ce20: 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65  least one opcode
ce30: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ce40: 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20   p->nOp>0 );..  
ce50: 2f 2a 20 53 65 74 20 74 68 65 20 6d 61 67 69 63  /* Set the magic
ce60: 20 74 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52   to VDBE_MAGIC_R
ce70: 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72  UN sooner rather
ce80: 20 74 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a   than later. */.
ce90: 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
cea0: 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69  E_MAGIC_RUN;..#i
ceb0: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
cec0: 47 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70  G.  for(i=1; i<p
ced0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  ->nMem; i++){.  
cee0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65    assert( p->aMe
cef0: 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29  m[i].db==p->db )
cf00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
cf10: 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e  ->pc = -1;.  p->
cf20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cf30: 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e    p->errorAction
cf40: 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70   = OE_Abort;.  p
cf50: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
cf60: 41 47 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e  AGIC_RUN;.  p->n
cf70: 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d  Change = 0;.  p-
cf80: 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20  >cacheCtr = 1;. 
cf90: 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65   p->minWriteFile
cfa0: 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20  Format = 255;.  
cfb0: 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20  p->iStatement = 
cfc0: 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74  0;.  p->nFkConst
cfd0: 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65  raint = 0;.#ifde
cfe0: 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20  f VDBE_PROFILE. 
cff0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
d000: 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d  Op; i++){.    p-
d010: 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b  >aOp[i].cnt = 0;
d020: 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63  .    p->aOp[i].c
d030: 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23  ycles = 0;.  }.#
d040: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
d050: 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61 6c  repare a virtual
d060: 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65   machine for exe
d070: 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66  cution for the f
d080: 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a  irst time after.
d090: 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65 20  ** creating the 
d0a0: 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
d0b0: 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20    This involves 
d0c0: 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61  things such.** a
d0d0: 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67  s allocating reg
d0e0: 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69  isters and initi
d0f0: 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67  alizing the prog
d100: 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20  ram counter..** 
d110: 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20 68  After the VDBE h
d120: 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20 69  as be prepped, i
d130: 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74 65  t can be execute
d140: 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  d by one or more
d150: 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  .** calls to sql
d160: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 20  ite3VdbeExec(). 
d170: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e   .**.** This fun
d180: 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c  ction may be cal
d190: 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65  led exactly once
d1a0: 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c   on each virtual
d1b0: 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74   machine..** Aft
d1c0: 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
d1d0: 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d  is called the VM
d1e0: 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61   has been "packa
d1f0: 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61 64  ged" and is read
d200: 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66  y.** to run.  Af
d210: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
d220: 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74   is called, furt
d230: 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a  her calls to .**
d240: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d250: 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  p() functions ar
d260: 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54  e prohibited.  T
d270: 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63  his routine disc
d280: 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56  onnects.** the V
d290: 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72  dbe from the Par
d2a0: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68  se object that h
d2b0: 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20 69  elped generate i
d2c0: 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a  t so that the.**
d2d0: 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65   the Vdbe become
d2e0: 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74  s an independent
d2f0: 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20   entity and the 
d300: 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e  Parse object can
d310: 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64   be.** destroyed
d320: 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  ..**.** Use the 
d330: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
d340: 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f  d() procedure to
d350: 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74 75   restore a virtu
d360: 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a  al machine back.
d370: 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61  ** to its initia
d380: 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69 74  l state after it
d390: 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a   has been run..*
d3a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
d3b0: 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56  beMakeReady(.  V
d3c0: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d3e0: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50   The VDBE */.  P
d3f0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20 20  arse *pParse    
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d410: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
d420: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
d430: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
d440: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
d450: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
d460: 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72  on */.  int nVar
d470: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d480: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d490: 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a   of parameters *
d4a0: 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20  /.  int nMem;   
d4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d4d0: 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74  VM memory regist
d4e0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75  ers */.  int nCu
d4f0: 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20  rsor;           
d500: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d510: 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71  r of cursors req
d520: 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  uired */.  int n
d530: 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Arg;            
d540: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d550: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d560: 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20   in subprograms 
d570: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20  */.  int nOnce; 
d580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d590: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d5a0: 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63   OP_Once instruc
d5b0: 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  tions */.  int n
d5c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d5d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
d5e0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
d5f0: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
d600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d610: 20 41 76 61 69 6c 61 62 6c 65 20 66 72 65 65 20   Available free 
d620: 73 70 61 63 65 20 2a 2f 0a 20 20 75 38 20 2a 7a  space */.  u8 *z
d630: 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Csr;            
d640: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
d650: 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  ory available fo
d660: 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a  r allocation */.
d670: 20 20 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20    int nByte;    
d680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d690: 20 2f 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74   /* How much ext
d6a0: 72 61 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65  ra memory is nee
d6b0: 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ded */..  assert
d6c0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
d6d0: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
d6e0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
d6f0: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
d700: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
d710: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
d720: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
d730: 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
d740: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
d750: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
d760: 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
d770: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
d780: 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
d790: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
d7a0: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
d7b0: 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
d7c0: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
d7d0: 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e  nOnce = pParse->
d7e0: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e  nOnce;.  if( nOn
d7f0: 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20  ce==0 ) nOnce = 
d800: 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20  1; /* Ensure at 
d810: 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69  least one byte i
d820: 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d  n p->aOnceFlag[]
d830: 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20   */.  .  /* For 
d840: 65 61 63 68 20 63 75 72 73 6f 72 20 72 65 71 75  each cursor requ
d850: 69 72 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63  ired, also alloc
d860: 61 74 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  ate a memory cel
d870: 6c 2e 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63  l. Memory.  ** c
d880: 65 6c 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75  ells (nMem+1-nCu
d890: 72 73 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63  rsor)..nMem, inc
d8a0: 6c 75 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76  lusive, will nev
d8b0: 65 72 20 62 65 20 75 73 65 64 20 62 79 0a 20 20  er be used by.  
d8c0: 2a 2a 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  ** the vdbe prog
d8d0: 72 61 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65  ram. Instead the
d8e0: 79 20 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c  y are used to al
d8f0: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
d900: 0a 20 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72  .  ** VdbeCursor
d910: 2f 42 74 43 75 72 73 6f 72 20 73 74 72 75 63 74  /BtCursor struct
d920: 75 72 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f  ures. The blob o
d930: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
d940: 74 65 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63  ted with .  ** c
d950: 75 72 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65  ursor 0 is store
d960: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  d in memory cell
d970: 20 6e 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65   nMem. Memory ce
d980: 6c 6c 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a  ll (nMem-1).  **
d990: 20 73 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62   stores the blob
d9a0: 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
d9b0: 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
d9c0: 72 20 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20  r 1, etc..  **. 
d9d0: 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c   ** See also: al
d9e0: 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a  locateCursor()..
d9f0: 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e    */.  nMem += n
da00: 43 75 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 7a 43  Cursor;..  /* zC
da10: 73 72 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 6c  sr will initiall
da20: 79 20 70 6f 69 6e 74 20 74 6f 20 6e 46 72 65 65  y point to nFree
da30: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
da40: 20 73 70 61 63 65 20 61 74 20 74 68 65 0a 20 20   space at the.  
da50: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70  ** end of the op
da60: 63 6f 64 65 20 61 72 72 61 79 2c 20 70 2d 3e 61  code array, p->a
da70: 4f 70 2e 20 20 54 68 65 20 63 6f 6d 70 75 74 61  Op.  The computa
da80: 74 69 6f 6e 20 6f 66 20 6e 46 72 65 65 20 69 73  tion of nFree is
da90: 0a 20 20 2a 2a 20 63 6f 6e 73 65 72 76 61 74 69  .  ** conservati
daa0: 76 65 20 2d 20 69 74 20 6d 69 67 68 74 20 62 65  ve - it might be
dab0: 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
dac0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 20 6f 66  e true number of
dad0: 20 66 72 65 65 0a 20 20 2a 2a 20 62 79 74 65 73   free.  ** bytes
dae0: 2c 20 62 75 74 20 6e 65 76 65 72 20 6c 61 72 67  , but never larg
daf0: 65 72 2e 20 20 6e 46 72 65 65 20 6d 75 73 74 20  er.  nFree must 
db00: 62 65 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66  be a multiple of
db10: 20 38 20 2d 20 69 74 20 69 73 0a 20 20 2a 2a 20   8 - it is.  ** 
db20: 72 6f 75 6e 64 65 64 20 64 6f 77 6e 20 69 66 20  rounded down if 
db30: 69 73 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 6e  is not..  */.  n
db40: 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66   = ROUND8(sizeof
db50: 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20  (Op)*p->nOp);   
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
db70: 74 65 73 20 6f 66 20 6f 70 63 6f 64 65 20 73 70  tes of opcode sp
db80: 61 63 65 20 75 73 65 64 20 2a 2f 0a 20 20 7a 43  ace used */.  zC
db90: 73 72 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61  sr = &((u8*)p->a
dba0: 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20  Op)[n];         
dbb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75            /* Unu
dbc0: 73 65 64 20 6f 70 63 6f 64 65 20 73 70 61 63 65  sed opcode space
dbd0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49   */.  assert( EI
dbe0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
dbf0: 4e 54 28 7a 43 73 72 29 20 29 3b 0a 20 20 6e 46  NT(zCsr) );.  nF
dc00: 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38  ree = ROUNDDOWN8
dc10: 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c  (pParse->szOpAll
dc20: 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74  oc - n);  /* Byt
dc30: 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61  es of unused spa
dc40: 63 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ce */.  assert( 
dc50: 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66  nFree>=0 );.  if
dc60: 28 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20  ( nFree>0 ){.   
dc70: 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c   memset(zCsr, 0,
dc80: 20 6e 46 72 65 65 29 3b 0a 20 20 20 20 61 73 73   nFree);.    ass
dc90: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
dca0: 41 4c 49 47 4e 4d 45 4e 54 28 26 7a 43 73 72 5b  ALIGNMENT(&zCsr[
dcb0: 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20 7d 0a 0a  nFree]) );.  }..
dcc0: 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65    resolveP2Value
dcd0: 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70  s(p, &nArg);.  p
dce0: 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
dcf0: 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d  l = (u8)(pParse-
dd00: 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26  >isMultiWrite &&
dd10: 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72   pParse->mayAbor
dd20: 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65  t);.  if( pParse
dd30: 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65  ->explain && nMe
dd40: 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d  m<10 ){.    nMem
dd50: 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e   = 10;.  }.  p->
dd60: 65 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20  expired = 0;..  
dd70: 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65  /* Memory for re
dd80: 67 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74  gisters, paramet
dd90: 65 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63  ers, cursor, etc
dda0: 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69  , is allocated i
ddb0: 6e 20 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65  n two.  ** passe
ddc0: 73 2e 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74  s.  On the first
ddd0: 20 70 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f   pass, we try to
dde0: 20 72 65 75 73 65 20 75 6e 75 73 65 64 20 73 70   reuse unused sp
ddf0: 61 63 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a  ace at the .  **
de00: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
de10: 64 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65  de array.  If we
de20: 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73   are unable to s
de30: 61 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72  atisfy all memor
de40: 79 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65  y.  ** requireme
de50: 6e 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74  nts by reusing t
de60: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
de70: 74 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73  tail, then the s
de80: 65 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20  econd.  ** pass 
de90: 77 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65  will fill in the
dea0: 20 72 65 73 74 20 75 73 69 6e 67 20 61 20 66 72   rest using a fr
deb0: 65 73 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  esh allocation. 
dec0: 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73   .  **.  ** This
ded0: 20 74 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61   two-pass approa
dee0: 63 68 20 74 68 61 74 20 72 65 75 73 65 73 20 61  ch that reuses a
def0: 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73  s much memory as
df00: 20 70 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20   possible from. 
df10: 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72   ** the leftover
df20: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
df30: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
df40: 61 72 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66  array can signif
df50: 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64  icantly.  ** red
df60: 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  uce the amount o
df70: 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  f memory held by
df80: 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
df90: 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f  ement..  */.  do
dfa0: 20 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30   {.    nByte = 0
dfb0: 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20  ;.    p->aMem = 
dfc0: 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d  allocSpace(p->aM
dfd0: 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28  em, nMem*sizeof(
dfe0: 4d 65 6d 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72  Mem), zCsr, &nFr
dff0: 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  ee, &nByte);.   
e000: 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63   p->aVar = alloc
e010: 53 70 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e  Space(p->aVar, n
e020: 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c  Var*sizeof(Mem),
e030: 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26   zCsr, &nFree, &
e040: 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61  nByte);.    p->a
e050: 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  pArg = allocSpac
e060: 65 28 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67  e(p->apArg, nArg
e070: 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 7a  *sizeof(Mem*), z
e080: 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42  Csr, &nFree, &nB
e090: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56  yte);.    p->azV
e0a0: 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  ar = allocSpace(
e0b0: 70 2d 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73  p->azVar, nVar*s
e0c0: 69 7a 65 6f 66 28 63 68 61 72 2a 29 2c 20 7a 43  izeof(char*), zC
e0d0: 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79  sr, &nFree, &nBy
e0e0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73  te);.    p->apCs
e0f0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
e100: 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72  ->apCsr, nCursor
e110: 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73  *sizeof(VdbeCurs
e120: 6f 72 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20  or*),.          
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e  zCsr, &nFree, &n
e150: 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  Byte);.    p->aO
e160: 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53  nceFlag = allocS
e170: 70 61 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61  pace(p->aOnceFla
e180: 67 2c 20 6e 4f 6e 63 65 2c 20 7a 43 73 72 2c 20  g, nOnce, zCsr, 
e190: 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b  &nFree, &nByte);
e1a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e1b0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
e1c0: 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45  TATUS.    p->anE
e1d0: 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
e1e0: 28 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e  (p->anExec, p->n
e1f0: 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20  Op*sizeof(i64), 
e200: 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e  zCsr, &nFree, &n
e210: 42 79 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Byte);.#endif.  
e220: 20 20 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20    if( nByte ){. 
e230: 20 20 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20       p->pFree = 
e240: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e250: 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a  ero(db, nByte);.
e260: 20 20 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d      }.    zCsr =
e270: 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 6e   p->pFree;.    n
e280: 46 72 65 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20  Free = nByte;.  
e290: 7d 77 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26  }while( nByte &&
e2a0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
e2b0: 65 64 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72  ed );..  p->nCur
e2c0: 73 6f 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20  sor = nCursor;. 
e2d0: 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20   p->nOnceFlag = 
e2e0: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e  nOnce;.  if( p->
e2f0: 61 56 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  aVar ){.    p->n
e300: 56 61 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61  Var = (ynVar)nVa
e310: 72 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  r;.    for(n=0; 
e320: 6e 3c 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nVar; n++){.  
e330: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66      p->aVar[n].f
e340: 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b  lags = MEM_Null;
e350: 0a 20 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e  .      p->aVar[n
e360: 5d 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d  ].db = db;.    }
e370: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a  .  }.  if( p->az
e380: 56 61 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e  Var && pParse->n
e390: 7a 56 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d  zVar>0 ){.    p-
e3a0: 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d  >nzVar = pParse-
e3b0: 3e 6e 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63  >nzVar;.    memc
e3c0: 70 79 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61  py(p->azVar, pPa
e3d0: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e  rse->azVar, p->n
e3e0: 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  zVar*sizeof(p->a
e3f0: 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d  zVar[0]));.    m
e400: 65 6d 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a  emset(pParse->az
e410: 56 61 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e  Var, 0, pParse->
e420: 6e 7a 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61  nzVar*sizeof(pPa
e430: 72 73 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  rse->azVar[0]));
e440: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d  .  }.  if( p->aM
e450: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65  em ){.    p->aMe
e460: 6d 2d 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20  m--;            
e470: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65            /* aMe
e480: 6d 5b 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e  m[] goes from 1.
e490: 2e 6e 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e  .nMem */.    p->
e4a0: 6e 4d 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20  nMem = nMem;    
e4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e4c0: 20 20 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30        not from 0
e4d0: 2e 2e 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20  ..nMem-1 */.    
e4e0: 66 6f 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d  for(n=1; n<=nMem
e4f0: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
e500: 3e 61 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aMem[n].flags =
e510: 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a   MEM_Undefined;.
e520: 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d        p->aMem[n]
e530: 2e 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a  .db = db;.    }.
e540: 20 20 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e    }.  p->explain
e550: 20 3d 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61   = pParse->expla
e560: 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  in;.  sqlite3Vdb
e570: 65 52 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f  eRewind(p);.}../
e580: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42  *.** Close a VDB
e590: 45 20 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c  E cursor and rel
e5a0: 65 61 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73  ease all the res
e5b0: 6f 75 72 63 65 73 20 74 68 61 74 20 63 75 72 73  ources that curs
e5c0: 6f 72 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74  or .** happens t
e5d0: 6f 20 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20  o hold..*/.void 
e5e0: 73 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43  sqlite3VdbeFreeC
e5f0: 75 72 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56  ursor(Vdbe *p, V
e600: 64 62 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b  dbeCursor *pCx){
e610: 0a 20 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b  .  if( pCx==0 ){
e620: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e630: 0a 20 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e  .  assert( pCx->
e640: 70 42 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65  pBt==0 || pCx->e
e650: 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
e660: 5f 42 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74  _BTREE );.  swit
e670: 63 68 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70  ch( pCx->eCurTyp
e680: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55  e ){.    case CU
e690: 52 54 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a  RTYPE_SORTER: {.
e6a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
e6b0: 65 53 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e  eSorterClose(p->
e6c0: 64 62 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20  db, pCx);.      
e6d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e6e0: 20 63 61 73 65 20 43 55 52 54 59 50 45 5f 42 54   case CURTYPE_BT
e6f0: 52 45 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  REE: {.      if(
e700: 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20   pCx->pBt ){.   
e710: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e720: 65 43 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29  eClose(pCx->pBt)
e730: 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;.        /* The
e740: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
e750: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
e760: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
e770: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
e780: 20 20 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20      ** the call 
e790: 61 62 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20  above. */.      
e7a0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
e7b0: 73 73 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70  ssert( pCx->uc.p
e7c0: 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20  Cursor!=0 );.   
e7d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e7e0: 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78  eCloseCursor(pCx
e7f0: 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20  ->uc.pCursor);. 
e800: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
e810: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
e820: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
e830: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
e840: 61 73 65 20 43 55 52 54 59 50 45 5f 56 54 41 42  ase CURTYPE_VTAB
e850: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e860: 33 5f 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70  3_vtab_cursor *p
e870: 56 43 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70  VCur = pCx->uc.p
e880: 56 43 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73  VCur;.      cons
e890: 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65  t sqlite3_module
e8a0: 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75   *pModule = pVCu
e8b0: 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c  r->pVtab->pModul
e8c0: 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
e8d0: 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e   pVCur->pVtab->n
e8e0: 52 65 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70  Ref>0 );.      p
e8f0: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
e900: 66 2d 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75  f--;.      pModu
e910: 6c 65 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72  le->xClose(pVCur
e920: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e930: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
e940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
e950: 61 6c 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74  all cursors in t
e960: 68 65 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65  he current frame
e970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e980: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
e990: 72 61 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  rame(Vdbe *p){. 
e9a0: 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b   if( p->apCsr ){
e9b0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
e9c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
e9d0: 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ursor; i++){.   
e9e0: 20 20 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70     VdbeCursor *p
e9f0: 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b  C = p->apCsr[i];
ea00: 0a 20 20 20 20 20 20 69 66 28 20 70 43 20 29 7b  .      if( pC ){
ea10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ea20: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
ea30: 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70  , pC);.        p
ea40: 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a  ->apCsr[i] = 0;.
ea50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ea60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  }.}../*.** Copy 
ea70: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
ea80: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
ea90: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
eaa0: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
eab0: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
eac0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
ead0: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
eae0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
eaf0: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
eb00: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
eb10: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
eb20: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
eb30: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
eb40: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
eb50: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
eb60: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
eb70: 49 6e 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64  InFrame(v);.#ifd
eb80: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
eb90: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
eba0: 0a 20 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70  .  v->anExec = p
ebb0: 46 72 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23  Frame->anExec;.#
ebc0: 65 6e 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65  endif.  v->aOnce
ebd0: 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Flag = pFrame->a
ebe0: 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e  OnceFlag;.  v->n
ebf0: 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d  OnceFlag = pFram
ec00: 65 2d 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20  e->nOnceFlag;.  
ec10: 76 2d 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->aOp = pFrame-
ec20: 3e 61 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d  >aOp;.  v->nOp =
ec30: 20 70 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20   pFrame->nOp;.  
ec40: 76 2d 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->aMem = pFrame
ec50: 2d 3e 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65  ->aMem;.  v->nMe
ec60: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d  m = pFrame->nMem
ec70: 3b 0a 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70  ;.  v->apCsr = p
ec80: 46 72 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20  Frame->apCsr;.  
ec90: 76 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72  v->nCursor = pFr
eca0: 61 6d 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20  ame->nCursor;.  
ecb0: 76 2d 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64  v->db->lastRowid
ecc0: 20 3d 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52   = pFrame->lastR
ecd0: 6f 77 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e  owid;.  v->nChan
ece0: 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68  ge = pFrame->nCh
ecf0: 61 6e 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e  ange;.  v->db->n
ed00: 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d  Change = pFrame-
ed10: 3e 6e 44 62 43 68 61 6e 67 65 3b 0a 20 20 72 65  >nDbChange;.  re
ed20: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
ed30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ed40: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
ed50: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
ed60: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
ed70: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
ed80: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
ed90: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
eda0: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
edb0: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
edc0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
edd0: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
ede0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
edf0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
ee00: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
ee10: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
ee20: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
ee30: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
ee40: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
ee50: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
ee60: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
ee70: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
ee80: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
ee90: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
eea0: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
eeb0: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
eec0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
eed0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
eee0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
eef0: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
ef00: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
ef10: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
ef20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
ef30: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
ef40: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
ef50: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
ef60: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
ef70: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
ef80: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  m[1], p->nMem);.
ef90: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
efa0: 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20  pDelFrame ){.   
efb0: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c   VdbeFrame *pDel
efc0: 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b   = p->pDelFrame;
efd0: 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d  .    p->pDelFram
efe0: 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e  e = pDel->pParen
eff0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
f000: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44  beFrameDelete(pD
f010: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  el);.  }..  /* D
f020: 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74  elete any auxdat
f030: 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61  a allocations ma
f040: 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a  de by the VM */.
f050: 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74    if( p->pAuxDat
f060: 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  a ) sqlite3VdbeD
f070: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20  eleteAuxData(p, 
f080: 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
f090: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
f0a0: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   );.}../*.** Cle
f0b0: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
f0c0: 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e  er a single run.
f0d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f0e0: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
f0f0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
f100: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
f110: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
f120: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
f130: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
f140: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
f150: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
f160: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
f170: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
f180: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
f190: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
f1a0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
f1b0: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
f1c0: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
f1d0: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
f1e0: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
f1f0: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
f200: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
f210: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
f220: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
f230: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
f240: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
f250: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
f260: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
f270: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
f280: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
f290: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
f2a0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
f2b0: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
f2c0: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
f2d0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f2e0: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
f2f0: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
f300: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
f310: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
f320: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
f330: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
f340: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
f350: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
f360: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
f370: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
f380: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
f390: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
f3a0: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
f3b0: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
f3c0: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
f3d0: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
f3e0: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
f3f0: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
f400: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
f410: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
f420: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
f430: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
f440: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
f450: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f460: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
f470: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
f480: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
f490: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
f4a0: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
f4b0: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
f4c0: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
f4d0: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
f4e0: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
f4f0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
f500: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
f510: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
f520: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
f530: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
f540: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
f550: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
f560: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
f570: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
f580: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
f590: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
f5a0: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
f5b0: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
f5c0: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
f5d0: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
f5e0: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
f5f0: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
f600: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
f610: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
f620: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
f630: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
f640: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
f650: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
f660: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
f670: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
f680: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
f690: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
f6a0: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
f6b0: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
f6c0: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
f6d0: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
f6e0: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
f6f0: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
f700: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
f710: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
f720: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
f730: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
f740: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
f750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f760: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
f770: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
f780: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
f790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7a0: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
f7b0: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
f7c0: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
f7d0: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
f7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f7f0: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
f800: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
f810: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
f820: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
f830: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
f840: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
f850: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
f860: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
f870: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
f880: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
f890: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
f8a0: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
f8b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
f8c0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
f8d0: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
f8e0: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
f8f0: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
f900: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
f910: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
f920: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
f930: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
f940: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
f950: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f960: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
f970: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
f980: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
f990: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
f9a0: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
f9b0: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
f9c0: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
f9d0: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
f9e0: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
f9f0: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
fa00: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
fa10: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
fa20: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
fa30: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
fa40: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
fa50: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
fa60: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
fa70: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
fa80: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
fa90: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
faa0: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
fab0: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
fac0: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
fad0: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
fae0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
faf0: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
fb00: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
fb10: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
fb20: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
fb30: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
fb40: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
fb50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
fb60: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
fb70: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
fb80: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
fb90: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
fba0: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
fbb0: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
fbc0: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
fbd0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
fbe0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
fbf0: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
fc00: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
fc10: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
fc20: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
fc30: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
fc40: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
fc50: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
fc60: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
fc70: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
fc80: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
fc90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fca0: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
fcb0: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
fcc0: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
fcd0: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
fce0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
fcf0: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
fd00: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
fd10: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
fd20: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
fd30: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
fd40: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
fd50: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
fd60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fd70: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
fd80: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
fd90: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
fda0: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
fdb0: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
fdc0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
fdd0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
fde0: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
fdf0: 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
fe00: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
fe10: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
fe20: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
fe30: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
fe40: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
fe50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
fe60: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
fe70: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
fe80: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
fe90: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
fea0: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
feb0: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
fec0: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
fed0: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
fee0: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
fef0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
ff00: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
ff10: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
ff20: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
ff30: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
ff40: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
ff50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
ff60: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
ff70: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
ff80: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
ff90: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
ffa0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
ffb0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
ffc0: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
ffd0: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
ffe0: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
fff0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
10000 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
10010 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10020 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71  ExclusiveLock(sq
10030 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
10040 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pBt));.      sql
10050 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
10060 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
10070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10080 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
10090 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
100a0 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
100b0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
100c0 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
100d0 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
100e0 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
100f0 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
10100 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
10110 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
10120 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
10130 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
10140 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10150 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
10160 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
10170 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
10180 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
10190 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
101a0 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
101b0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
101c0 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
101d0 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
101e0 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
101f0 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
10200 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
10210 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
10220 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
10230 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
10240 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
10250 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
10260 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
10270 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
10280 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
10290 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
102a0 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
102b0 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
102c0 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
102d0 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
102e0 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
102f0 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
10300 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
10310 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
10320 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
10330 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
10340 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
10350 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
10360 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
10370 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
10380 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
10390 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
103a0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
103b0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
103c0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
103d0 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
103e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
103f0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
10400 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
10410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
10420 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
10430 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
10440 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
10450 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
10460 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
10470 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
10480 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
10490 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
104a0 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
104b0 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
104c0 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
104d0 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
104e0 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
104f0 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
10500 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
10510 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
10520 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
10530 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
10540 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
10550 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
10560 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
10570 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
10580 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
10590 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
105a0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
105b0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
105c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
105d0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
105e0 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
105f0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
10600 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10610 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
10620 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
10630 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10640 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
10650 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
10660 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
10670 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
10680 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
10690 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
106a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
106b0 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
106c0 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
106d0 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
106e0 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
106f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
10700 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
10710 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
10720 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
10730 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
10740 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
10750 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
10760 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
10770 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10780 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
10790 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
107a0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
107b0 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
107c0 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
107d0 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
107e0 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
107f0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
10800 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
10810 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
10820 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
10830 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
10840 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
10850 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
10860 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
10870 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
10880 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
10890 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
108a0 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
108b0 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
108c0 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
108d0 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
108e0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
108f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a  NOMEM;.    do {.
10900 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
10910 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
10920 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
10930 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
10940 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
10950 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
10960 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
10970 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
10980 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
10990 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
109a0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
109b0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
109c0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
109d0 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
109e0 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
109f0 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
10a00 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
10a10 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
10a20 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
10a30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
10a40 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
10a50 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
10a60 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
10a70 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
10a80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10a90 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
10aa0 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
10ab0 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
10ac0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ae0 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
10af0 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
10b00 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
10b10 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
10b20 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
10b30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10b40 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
10b50 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
10b60 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
10b70 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
10b80 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
10b90 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
10ba0 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
10bb0 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
10bc0 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
10bd0 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
10be0 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
10bf0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
10c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10c10 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
10c20 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
10c30 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
10c40 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
10c50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10c60 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
10c70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10c80 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
10c90 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10ca0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
10cb0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
10cc0 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
10cd0 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
10ce0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
10cf0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
10d00 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
10d10 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
10d20 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
10d30 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
10d40 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
10d50 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
10d60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10d70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10d80 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10d90 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10da0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10db0 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
10dc0 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
10dd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10de0 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
10df0 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
10e00 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
10e10 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
10e20 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
10e30 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
10e40 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
10e50 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
10e60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
10e70 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
10e80 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
10e90 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
10ea0 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
10eb0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
10ec0 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
10ed0 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
10ee0 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
10ef0 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
10f00 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
10f10 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10f20 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
10f30 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
10f40 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
10f50 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
10f60 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
10f70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
10f80 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
10f90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
10fa0 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
10fb0 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
10fc0 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
10fd0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
10fe0 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
10ff0 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
11000 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
11010 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
11020 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
11030 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
11040 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
11050 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
11060 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
11070 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
11080 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
11090 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
110a0 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
110b0 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
110c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
110d0 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
110e0 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
110f0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11100 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
11110 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11120 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11130 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11140 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11150 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11160 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
11170 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
11180 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11190 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
111a0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
111b0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
111c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
111d0 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
111e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
111f0 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
11200 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
11210 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
11220 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
11230 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
11240 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
11250 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
11260 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
11270 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
11280 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
11290 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
112a0 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
112b0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
112c0 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
112d0 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
112e0 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
112f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
11300 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11310 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
11320 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
11330 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
11340 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11350 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11360 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11370 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
11380 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
11390 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
113a0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
113b0 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
113c0 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
113d0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
113e0 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
113f0 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
11400 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
11410 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
11420 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
11430 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11440 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
11450 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
11460 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
11470 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
11480 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
11490 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
114a0 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
114b0 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
114c0 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
114d0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
114e0 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
114f0 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
11500 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
11510 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
11520 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11530 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
11540 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
11550 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
11560 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
11570 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
11580 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
11590 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
115a0 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
115b0 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
115c0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
115d0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
115e0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
115f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
11600 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
11610 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
11620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
11630 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11640 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11650 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
11660 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
11670 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11680 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
11690 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
116a0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
116b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
116c0 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
116d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
116e0 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
116f0 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
11700 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
11710 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
11720 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
11730 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
11740 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
11750 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
11760 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
11770 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
11780 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11790 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
117a0 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63  Master, needSync
117b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
117c0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
117d0 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
117e0 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
117f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
11800 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
11810 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
11820 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
11830 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
11840 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
11850 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
11860 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
11870 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
11880 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
11890 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
118a0 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
118b0 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
118c0 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
118d0 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
118e0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
118f0 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
11900 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
11910 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
11920 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
11930 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
11940 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
11950 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
11960 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
11970 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
11980 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
11990 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
119a0 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
119b0 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
119c0 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
119d0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
119e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
119f0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
11a00 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
11a10 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
11a20 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
11a30 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
11a40 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
11a50 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
11a60 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
11a70 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
11a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11a90 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
11aa0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
11ab0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
11ac0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
11ae0 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
11af0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
11b00 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
11b10 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
11b20 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
11b30 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20  te3.nVdbeActive 
11b40 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
11b50 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
11b60 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
11b70 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
11b80 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
11b90 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
11ba0 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
11bb0 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
11bc0 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
11bd0 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
11be0 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
11bf0 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
11c00 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
11c10 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
11c20 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
11c30 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
11c40 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
11c50 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
11c60 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
11c70 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
11c80 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
11c90 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
11ca0 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
11cb0 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
11cc0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  = 0;.  int nRead
11cd0 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
11ce0 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
11cf0 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  p ){.    if( sql
11d00 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28  ite3_stmt_busy((
11d10 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29  sqlite3_stmt*)p)
11d20 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
11d30 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
11d40 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
11d50 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
11d60 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
11d70 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
11d80 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
11d90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
11da0 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
11db0 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
11dc0 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
11dd0 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
11de0 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
11df0 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
11e00 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
11e10 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
11e20 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
11e30 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
11e40 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
11e50 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
11e60 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
11e70 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
11e80 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
11e90 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
11ea0 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
11eb0 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
11ec0 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
11ed0 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
11ee0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
11ef0 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
11f00 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
11f10 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
11f20 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
11f30 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
11f40 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
11f50 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
11f60 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
11f70 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
11f80 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
11f90 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
11fa0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11fb0 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
11fc0 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
11fd0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
11fe0 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
11ff0 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
12000 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
12010 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
12020 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
12030 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
12040 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
12050 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
12060 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
12070 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
12080 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
12090 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
120a0 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
120b0 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
120c0 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
120d0 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
120e0 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
120f0 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
12100 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
12110 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
12120 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
12130 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
12140 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
12150 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
12160 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
12170 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
12180 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
12190 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
121a0 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
121b0 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
121c0 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
121d0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
121e0 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
121f0 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
12200 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
12210 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
12220 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
12230 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
12240 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
12250 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
12260 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
12270 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
12280 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
12290 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
122a0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
122b0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
122c0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
122d0 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
122e0 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
122f0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
12300 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
12310 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
12320 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
12330 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12340 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12350 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
12360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12370 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
12380 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
12390 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
123a0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
123b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
123c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
123d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
123e0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
123f0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12400 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
12410 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
12420 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
12430 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12440 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
12450 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12460 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
12470 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
12480 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
12490 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
124a0 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
124b0 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
124c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
124d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
124e0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
124f0 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
12500 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
12510 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12520 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12530 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
12540 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12550 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
12560 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
12570 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
12580 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
12590 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
125a0 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
125b0 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
125c0 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
125d0 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
125e0 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
125f0 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
12600 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12610 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12620 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
12630 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
12640 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
12650 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
12660 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
12670 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
12680 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12690 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
126a0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
126b0 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
126c0 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
126d0 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
126e0 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
126f0 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
12700 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
12710 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
12720 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
12730 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
12740 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
12750 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
12760 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
12770 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
12780 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
12790 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
127a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
127b0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
127c0 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
127d0 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
127e0 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
127f0 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
12800 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
12810 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
12820 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
12830 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
12840 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
12850 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
12860 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12870 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
12880 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
12890 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
128a0 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
128b0 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
128c0 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
128d0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
128e0 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
128f0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12900 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
12910 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
12920 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
12930 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
12940 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
12950 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
12960 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
12970 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
12980 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
12990 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
129a0 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45  beError(p, "FORE
129b0 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69  IGN KEY constrai
129c0 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20  nt failed");.   
129d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
129e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
129f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
12a00 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
12a10 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
12a20 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20  lled the when a 
12a30 56 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61  VDBE tries to ha
12a40 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45  lt.  If the VDBE
12a50 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61  .** has made cha
12a60 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61  nges and is in a
12a70 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20  utocommit mode, 
12a80 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73  then commit thos
12a90 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49  e.** changes.  I
12aa0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  f a rollback is 
12ab0 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20  needed, then do 
12ac0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  the rollback..**
12ad0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
12ae0 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79   is the only way
12af0 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61   to move the sta
12b00 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a  te of a VM from.
12b10 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  ** SQLITE_MAGIC_
12b20 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41  RUN to SQLITE_MA
12b30 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73  GIC_HALT.  It is
12b40 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20   harmless to.** 
12b50 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56  call this on a V
12b60 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65  M that is in the
12b70 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41   SQLITE_MAGIC_HA
12b80 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  LT state..**.** 
12b90 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
12ba0 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f  code.  If the co
12bb0 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63  mmit could not c
12bc0 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20  omplete because 
12bd0 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65  of.** lock conte
12be0 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51  ntion, return SQ
12bf0 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53  LITE_BUSY.  If S
12c00 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
12c10 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65  turned, it.** me
12c20 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69  ans the close di
12c30 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64  d not happen and
12c40 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70   needs to be rep
12c50 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eated..*/.int sq
12c60 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64  lite3VdbeHalt(Vd
12c70 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
12c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
12ca0 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73  d to store trans
12cb0 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65  ient return code
12cc0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
12cd0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
12ce0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12cf0 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67  contains the log
12d00 69 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e  ic that determin
12d10 65 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e  es if a statemen
12d20 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61  t or.  ** transa
12d30 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f  ction will be co
12d40 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
12d50 64 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75  d back as a resu
12d60 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65  lt of the.  ** e
12d70 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73  xecution of this
12d80 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
12d90 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  . .  **.  ** If 
12da0 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
12db0 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75  wing errors occu
12dc0 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  r:.  **.  **    
12dd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20   SQLITE_NOMEM.  
12de0 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f  **     SQLITE_IO
12df0 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ERR.  **     SQL
12e00 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20  ITE_FULL.  **   
12e10 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55    SQLITE_INTERRU
12e20 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  PT.  **.  ** The
12e30 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63  n the internal c
12e40 61 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20  ache might have 
12e50 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20  been left in an 
12e60 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a  inconsistent.  *
12e70 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65  * state.  We nee
12e80 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  d to rollback th
12e90 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
12ea0 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72  saction, if ther
12eb0 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f  e is.  ** one, o
12ec0 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74  r the complete t
12ed0 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68  ransaction if th
12ee0 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d  ere is no statem
12ef0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
12f00 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e  .  */..  if( p->
12f10 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
12f20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
12f30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
12f40 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65  }.  if( p->aOnce
12f50 46 6c 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d  Flag ) memset(p-
12f60 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70  >aOnceFlag, 0, p
12f70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20  ->nOnceFlag);.  
12f80 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28  closeAllCursors(
12f90 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67  p);.  if( p->mag
12fa0 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52  ic!=VDBE_MAGIC_R
12fb0 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  UN ){.    return
12fc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
12fd0 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64 62    checkActiveVdb
12fe0 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eCnt(db);..  /* 
12ff0 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c  No commit or rol
13000 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20  lback needed if 
13010 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65  the program neve
13020 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66 20  r started or if 
13030 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61  the.  ** SQL sta
13040 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20  tement does not 
13050 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61 20  read or write a 
13060 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
13070 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
13080 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65  0 && p->bIsReade
13090 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63  r ){.    int mrc
130a0 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65  ;   /* Primary e
130b0 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70  rror code from p
130c0 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ->rc */.    int 
130d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30  eStatementOp = 0
130e0 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65 63  ;.    int isSpec
130f0 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20  ialError;       
13100 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74       /* Set to t
13110 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69 61  rue if a 'specia
13120 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20  l' error */..   
13130 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72   /* Lock all btr
13140 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65 20  ees used by the 
13150 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
13160 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
13170 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  r(p);..    /* Ch
13180 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  eck for one of t
13190 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72  he special error
131a0 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70  s */.    mrc = p
131b0 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20  ->rc & 0xff;.   
131c0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
131d0 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  = mrc==SQLITE_NO
131e0 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  MEM || mrc==SQLI
131f0 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  TE_IOERR.       
13200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
13210 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54   mrc==SQLITE_INT
13220 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53  ERRUPT || mrc==S
13230 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
13240 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72 72  if( isSpecialErr
13250 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  or ){.      /* I
13260 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73 20  f the query was 
13270 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68  read-only and th
13280 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
13290 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
132a0 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72  , .      ** no r
132b0 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73  ollback is neces
132c0 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c  sary. Otherwise,
132d0 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76 65   at least a save
132e0 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20  point .      ** 
132f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
13300 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
13310 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
13320 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20  atabase to a .  
13330 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e      ** consisten
13340 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a  t state..      *
13350 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20  *.      ** Even 
13360 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  if the statement
13370 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69   is read-only, i
13380 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
13390 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20  o perform.      
133a0 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  ** a statement o
133b0 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f  r transaction ro
133c0 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  llback operation
133d0 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a  . If the error .
133e0 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65        ** occurre
133f0 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
13400 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  to the journal, 
13410 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64  sub-journal or d
13420 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a  atabase.      **
13430 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66   file as part of
13440 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72   an effort to fr
13450 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61 63  ee up cache spac
13460 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a  e (see function.
13470 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74        ** pagerSt
13480 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e  ress() in pager.
13490 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  c), the rollback
134a0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
134b0 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a  restore .      *
134c0 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20 61  * the pager to a
134d0 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
134e0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
134f0 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
13500 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54  ly || mrc!=SQLIT
13510 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20  E_INTERRUPT ){. 
13520 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d         if( (mrc=
13530 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
13540 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c   mrc==SQLITE_FUL
13550 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d  L) && p->usesStm
13560 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  tJournal ){.    
13570 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
13580 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
13590 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20  OLLBACK;.       
135a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
135b0 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63    /* We are forc
135c0 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
135d0 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e 73  the active trans
135e0 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64  action. Before d
135f0 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  oing.          *
13600 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20  * so, abort any 
13610 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73  other statements
13620 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72   this handle cur
13630 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76  rently has activ
13640 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
13650 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13660 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
13670 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
13680 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
13690 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53     sqlite3CloseS
136a0 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20  avepoints(db);. 
136b0 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74           db->aut
136c0 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
136d0 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
136e0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  e = 0;.        }
136f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
13700 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
13710 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69   immediate forei
13720 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e  gn key violation
13730 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d  s. */.    if( p-
13740 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  >rc==SQLITE_OK )
13750 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
13760 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29  dbeCheckFk(p, 0)
13770 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
13780 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
13790 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
137a0 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68 65   and this is the
137b0 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69   only active wri
137c0 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20  ter .    ** VM, 
137d0 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65  then we do eithe
137e0 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f  r a commit or ro
137f0 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75  llback of the cu
13800 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
13810 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n. .    **.    *
13820 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f  * Note: This blo
13830 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20  ck also runs if 
13840 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
13850 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65  al errors handle
13860 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20  d .    ** above 
13870 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20  has occurred. . 
13880 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73     */.    if( !s
13890 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63  qlite3VtabInSync
138a0 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64 62  (db) .     && db
138b0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20  ->autoCommit .  
138c0 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57     && db->nVdbeW
138d0 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e  rite==(p->readOn
138e0 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20  ly==0) .    ){. 
138f0 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13900 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d  SQLITE_OK || (p-
13910 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
13920 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65 63  _Fail && !isSpec
13930 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20  ialError) ){.   
13940 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13950 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20  3VdbeCheckFk(p, 
13960 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
13970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13980 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 4e  .          if( N
13990 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  EVER(p->readOnly
139a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
139b0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
139c0 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e(p);.          
139d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
139e0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20  ERROR;.         
139f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
13a00 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  = SQLITE_CONSTRA
13a10 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a  INT_FOREIGNKEY;.
13a20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a          }else{ .
13a30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
13a40 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
13a50 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20 76  g is true, the v
13a60 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20  dbe program was 
13a70 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20  successful .    
13a80 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20        ** or hit 
13a90 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e  an 'OR FAIL' con
13aa0 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72  straint and ther
13ab0 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65  e are no deferre
13ac0 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20  d foreign.      
13ad0 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74      ** key const
13ae0 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75  raints to hold u
13af0 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  p the transactio
13b00 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20  n. This means a 
13b10 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20  commit .        
13b20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64    ** is required
13b30 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  . */.          r
13b40 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64  c = vdbeCommit(d
13b50 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  b, p);.        }
13b60 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
13b70 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
13b80 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  p->readOnly ){. 
13b90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13ba0 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  VdbeLeave(p);.  
13bb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
13bc0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
13bd0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
13be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13bf0 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
13c00 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
13c10 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
13c20 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
13c30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e  ;.          p->n
13c40 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13c60 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72       db->nDeferr
13c70 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20  edCons = 0;.    
13c80 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
13c90 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a  redImmCons = 0;.
13ca0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
13cb0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
13cc0 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20  eferFKs;.       
13cd0 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74     sqlite3Commit
13ce0 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28  InternalChanges(
13cf0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  db);.        }. 
13d00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13d10 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
13d20 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13d30 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70  E_OK);.        p
13d40 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
13d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d       }.      db-
13d60 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
13d70 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65  .    }else if( e
13d80 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29  StatementOp==0 )
13d90 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72  {.      if( p->r
13da0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
13db0 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d  p->errorAction==
13dc0 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20  OE_Fail ){.     
13dd0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
13de0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  = SAVEPOINT_RELE
13df0 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ASE;.      }else
13e00 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74   if( p->errorAct
13e10 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b  ion==OE_Abort ){
13e20 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 6d  .        eStatem
13e30 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e  entOp = SAVEPOIN
13e40 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20  T_ROLLBACK;.    
13e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13e60 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13e70 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41  All(db, SQLITE_A
13e80 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a  BORT_ROLLBACK);.
13e90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43          sqlite3C
13ea0 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
13eb0 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e  b);.        db->
13ec0 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
13ed0 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
13ee0 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
13ef0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
13f00 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20  If eStatementOp 
13f10 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
13f20 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72  n a statement tr
13f30 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20  ansaction needs 
13f40 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d  to.    ** be com
13f50 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
13f60 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69   back. Call sqli
13f70 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
13f80 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a  ement() to.    *
13f90 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73  * do so. If this
13fa0 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72   operation retur
13fb0 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  ns an error, and
13fc0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
13fd0 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72  tement.    ** er
13fe0 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49  ror code is SQLI
13ff0 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f  TE_OK or SQLITE_
14000 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e  CONSTRAINT, then
14010 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20   promote the.   
14020 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74   ** current stat
14030 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ement error code
14040 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
14050 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b   eStatementOp ){
14060 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
14070 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74  te3VdbeCloseStat
14080 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d  ement(p, eStatem
14090 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66  entOp);.      if
140a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
140b0 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  if( p->rc==SQLIT
140c0 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30  E_OK || (p->rc&0
140d0 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e  xff)==SQLITE_CON
140e0 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20  STRAINT ){.     
140f0 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b       p->rc = rc;
14100 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14110 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
14120 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
14130 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
14140 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
14150 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c        sqlite3Rol
14160 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c  lbackAll(db, SQL
14170 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
14180 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  CK);.        sql
14190 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
141a0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
141b0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20   db->autoCommit 
141c0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 1;.        p->
141d0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
141e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
141f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73    /* If this was
14200 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41   an INSERT, UPDA
14210 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64  TE or DELETE and
14220 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72   no statement tr
14230 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a  ansaction.    **
14240 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64   has been rolled
14250 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68   back, update th
14260 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
14270 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75  ction change-cou
14280 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20  nter. .    */.  
14290 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43    if( p->changeC
142a0 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66  ntOn ){.      if
142b0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d  ( eStatementOp!=
142c0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
142d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  CK ){.        sq
142e0 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
142f0 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e  ges(db, p->nChan
14300 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ge);.      }else
14310 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
14320 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
14330 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  db, 0);.      }.
14340 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14350 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20   = 0;.    }..   
14360 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
14370 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c  locks */.    sql
14380 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
14390 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68  ;.  }..  /* We h
143a0 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ave successfully
143b0 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73   halted and clos
143c0 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f  ed the VM.  Reco
143d0 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f  rd this fact. */
143e0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
143f0 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65  ){.    db->nVdbe
14400 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66  Active--;.    if
14410 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  ( !p->readOnly )
14420 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d   db->nVdbeWrite-
14430 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49  -;.    if( p->bI
14440 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56  sReader ) db->nV
14450 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61  dbeRead--;.    a
14460 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
14470 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62  Active>=db->nVdb
14480 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73  eRead );.    ass
14490 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65  ert( db->nVdbeRe
144a0 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69  ad>=db->nVdbeWri
144b0 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  te );.    assert
144c0 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ( db->nVdbeWrite
144d0 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  >=0 );.  }.  p->
144e0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
144f0 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b  IC_HALT;.  check
14500 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
14510 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
14520 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14530 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49      p->rc = SQLI
14540 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20  TE_NOMEM;.  }.. 
14550 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d   /* If the auto-
14560 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73  commit flag is s
14570 65 74 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e  et to true, then
14580 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20   any locks that 
14590 77 65 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62  were held.  ** b
145a0 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  y connection db 
145b0 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65  have now been re
145c0 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c  leased. Call sql
145d0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
145e0 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74  locked() .  ** t
145f0 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71  o invoke any req
14600 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74  uired unlock-not
14610 69 66 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20  ify callbacks.. 
14620 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75   */.  if( db->au
14630 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  toCommit ){.    
14640 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
14650 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20  nUnlocked(db);. 
14660 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62   }..  assert( db
14670 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20  ->nVdbeActive>0 
14680 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  || db->autoCommi
14690 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61  t==0 || db->nSta
146a0 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72  tement==0 );.  r
146b0 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51  eturn (p->rc==SQ
146c0 4c 49 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49  LITE_BUSY ? SQLI
146d0 54 45 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45  TE_BUSY : SQLITE
146e0 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  _OK);.}.../*.** 
146f0 45 61 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20  Each VDBE holds 
14700 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68  the result of th
14710 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  e most recent sq
14720 6c 69 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c  lite3_step() cal
14730 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20  l.** in p->rc.  
14740 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
14750 73 20 74 68 61 74 20 72 65 73 75 6c 74 20 62 61  s that result ba
14760 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e  ck to SQLITE_OK.
14770 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14780 56 64 62 65 52 65 73 65 74 53 74 65 70 52 65 73  VdbeResetStepRes
14790 75 6c 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ult(Vdbe *p){.  
147a0 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
147b0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  K;.}../*.** Copy
147c0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
147d0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
147e0 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  e belonging to t
147f0 68 65 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a  he VDBE passed.*
14800 2a 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  * as the first a
14810 72 67 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64  rgument to its d
14820 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28  atabase handle (
14830 73 6f 20 74 68 61 74 20 74 68 65 79 20 77 69 6c  so that they wil
14840 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65  l be .** returne
14850 64 20 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71  d by calls to sq
14860 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20  lite3_errcode() 
14870 61 6e 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  and sqlite3_errm
14880 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  sg())..**.** Thi
14890 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
148a0 6e 6f 74 20 63 6c 65 61 72 20 74 68 65 20 56 44  not clear the VD
148b0 42 45 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72  BE error code or
148c0 20 6d 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a   message, just.*
148d0 2a 20 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f  * copies them to
148e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
148f0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
14900 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
14910 45 72 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a  Error(Vdbe *p){.
14920 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
14930 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20  p->db;.  int rc 
14940 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70  = p->rc;.  if( p
14950 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ->zErrMsg ){.   
14960 20 75 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64   u8 mallocFailed
14970 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   = db->mallocFai
14980 6c 65 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  led;.    sqlite3
14990 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
149a0 63 28 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  c();.    if( db-
149b0 3e 70 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70  >pErr==0 ) db->p
149c0 45 72 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Err = sqlite3Val
149d0 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
149e0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
149f0 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20  r(db->pErr, -1, 
14a00 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49  p->zErrMsg, SQLI
14a10 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
14a20 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
14a30 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
14a40 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62  Malloc();.    db
14a50 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
14a60 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20   mallocFailed;. 
14a70 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
14a80 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
14a90 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14aa0 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
14ab0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
14ac0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
14ad0 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
14ae0 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
14af0 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
14b00 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
14b10 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
14b20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
14b30 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
14b40 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
14b50 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
14b60 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
14b70 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
14b80 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
14b90 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
14ba0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
14bb0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
14bc0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
14bd0 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
14be0 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
14bf0 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
14c00 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
14c10 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
14c20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
14c30 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
14c40 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
14c50 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
14c60 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
14c70 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
14c80 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
14c90 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
14ca0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
14cb0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
14cc0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
14cd0 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
14ce0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
14cf0 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
14d00 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
14d10 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
14d20 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
14d30 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
14d40 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
14d50 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
14d60 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
14d70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
14d80 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
14d90 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
14da0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
14db0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
14dc0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
14dd0 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
14de0 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
14df0 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
14e00 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
14e10 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
14e20 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
14e30 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
14e40 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
14e50 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
14e60 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
14e70 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
14e80 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
14e90 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
14ea0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
14eb0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
14ec0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
14ed0 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
14ee0 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
14ef0 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
14f00 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
14f10 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
14f20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
14f30 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
14f40 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
14f50 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
14f60 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
14f70 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
14f80 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
14f90 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
14fa0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
14fb0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
14fc0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
14fd0 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
14fe0 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
14ff0 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
15000 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
15010 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
15020 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
15030 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
15040 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
15050 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15060 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
15070 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
15080 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
15090 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
150a0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
150b0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
150c0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
150d0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
150e0 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
150f0 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
15100 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
15110 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
15120 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
15130 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
15140 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
15150 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
15160 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
15170 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
15180 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
15190 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
151a0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
151b0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
151c0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
151d0 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
151e0 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
151f0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
15200 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
15210 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15220 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
15230 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
15240 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
15250 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
15260 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15270 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
15280 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
15290 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
152a0 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
152b0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
152c0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
152d0 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
152e0 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
152f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
15300 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
15310 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
15320 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
15330 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
15340 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
15350 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
15360 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
15370 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
15380 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
15390 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
153a0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
153b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
153c0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
153d0 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
153e0 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
153f0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15400 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
15410 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
15420 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
15430 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
15440 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15450 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
15460 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
15470 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
15480 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
15490 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
154a0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
154b0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
154c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
154d0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
154e0 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
154f0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15500 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
15510 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
15520 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
15530 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
15540 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
15550 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
15560 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
15570 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
15580 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
15590 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
155a0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
155b0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
155c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
155d0 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
155e0 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
155f0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
15600 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
15610 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15620 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
15630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15640 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
15650 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
15660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
15670 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
15680 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
15690 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
156a0 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
156b0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
156c0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
156d0 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
156e0 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
156f0 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
15700 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
15710 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
15720 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
15730 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
15740 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
15750 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
15760 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
15770 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15780 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
15790 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
157a0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
157b0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
157c0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
157d0 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
157e0 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
157f0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15800 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
15810 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
15820 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
15830 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15840 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
15850 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15860 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15870 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
15880 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
15890 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
158a0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
158b0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
158c0 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
158d0 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
158e0 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
158f0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
15900 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
15910 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
15920 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
15930 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
15940 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
15950 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
15960 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
15970 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
15980 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
15990 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
159a0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
159b0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
159c0 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
159d0 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
159e0 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
159f0 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
15a00 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
15a10 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
15a20 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
15a30 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
15a40 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
15a50 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
15a60 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
15a70 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
15a80 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
15a90 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
15aa0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
15ab0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
15ac0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
15ad0 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
15ae0 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
15af0 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
15b00 41 75 78 44 61 74 61 28 56 64 62 65 20 2a 70 56  AuxData(Vdbe *pV
15b10 64 62 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e  dbe, int iOp, in
15b20 74 20 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61  t mask){.  AuxDa
15b30 74 61 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65  ta **pp = &pVdbe
15b40 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68  ->pAuxData;.  wh
15b50 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20  ile( *pp ){.    
15b60 41 75 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20  AuxData *pAux = 
15b70 2a 70 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f  *pp;.    if( (iO
15b80 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41  p<0).     || (pA
15b90 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20  ux->iOp==iOp && 
15ba0 28 70 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c  (pAux->iArg>31 |
15bb0 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42  | !(mask & MASKB
15bc0 49 54 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29  IT32(pAux->iArg)
15bd0 29 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ))).    ){.     
15be0 20 74 65 73 74 63 61 73 65 28 20 70 41 75 78 2d   testcase( pAux-
15bf0 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20  >iArg==31 );.   
15c00 20 20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65     if( pAux->xDe
15c10 6c 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20  lete ){.        
15c20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41  pAux->xDelete(pA
15c30 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20  ux->pAux);.     
15c40 20 7d 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70   }.      *pp = p
15c50 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Aux->pNext;.    
15c60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15c70 70 56 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29  pVdbe->db, pAux)
15c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
15c90 20 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e     pp= &pAux->pN
15ca0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
15cb0 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c  ../*.** Free all
15cc0 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74   memory associat
15cd0 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
15ce0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
15cf0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a  econd argument,.
15d00 2a 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62  ** except for ob
15d10 6a 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69  ject itself, whi
15d20 63 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e  ch is preserved.
15d30 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65  .**.** The diffe
15d40 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68  rence between th
15d50 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  is function and 
15d60 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
15d70 65 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56  e() is that.** V
15d80 64 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f  dbeDelete() also
15d90 20 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62   unlinks the Vdb
15da0 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
15db0 6f 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65  of VMs associate
15dc0 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61  d with.** the da
15dd0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
15de0 6e 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20  n and frees the 
15df0 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a  object itself..*
15e00 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
15e10 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71  beClearObject(sq
15e20 6c 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20  lite3 *db, Vdbe 
15e30 2a 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61  *p){.  SubProgra
15e40 6d 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b  m *pSub, *pNext;
15e50 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65  .  int i;.  asse
15e60 72 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  rt( p->db==0 || 
15e70 70 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72  p->db==db );.  r
15e80 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
15e90 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29  ->aVar, p->nVar)
15ea0 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
15eb0 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
15ec0 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
15ed0 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72  OLNAME_N);.  for
15ee0 28 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61  (pSub=p->pProgra
15ef0 6d 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e  m; pSub; pSub=pN
15f00 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
15f10 3d 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20  = pSub->pNext;. 
15f20 20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72     vdbeFreeOpArr
15f30 61 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70  ay(db, pSub->aOp
15f40 2c 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20  , pSub->nOp);.  
15f50 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15f60 64 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20  db, pSub);.  }. 
15f70 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d   for(i=p->nzVar-
15f80 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71  1; i>=0; i--) sq
15f90 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15fa0 70 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20  p->azVar[i]);.  
15fb0 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
15fc0 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e  db, p->aOp, p->n
15fd0 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  Op);.  sqlite3Db
15fe0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
15ff0 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Name);.  sqlite3
16000 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53  DbFree(db, p->zS
16010 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ql);.  sqlite3Db
16020 46 72 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65  Free(db, p->pFre
16030 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
16040 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
16050 41 4e 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69  ANSTATUS.  for(i
16060 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20  =0; i<p->nScan; 
16070 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
16080 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16090 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  Scan[i].zName);.
160a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
160b0 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e  ree(db, p->aScan
160c0 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
160d0 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
160e0 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69  ire VDBE..*/.voi
160f0 64 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  d sqlite3VdbeDel
16100 65 74 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ete(Vdbe *p){.  
16110 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
16120 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
16130 29 20 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d  ) return;.  db =
16140 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
16150 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
16160 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
16170 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
16180 43 6c 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20  ClearObject(db, 
16190 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72  p);.  if( p->pPr
161a0 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72  ev ){.    p->pPr
161b0 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70  ev->pNext = p->p
161c0 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Next;.  }else{. 
161d0 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70     assert( db->p
161e0 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64  Vdbe==p );.    d
161f0 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e  b->pVdbe = p->pN
16200 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
16210 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70  ->pNext ){.    p
16220 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
16230 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20   p->pPrev;.  }. 
16240 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
16250 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70  _MAGIC_DEAD;.  p
16260 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69  ->db = 0;.  sqli
16270 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
16280 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  ;.}../*.** The c
16290 75 72 73 6f 72 20 22 70 22 20 68 61 73 20 61 20  ursor "p" has a 
162a0 70 65 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65  pending seek ope
162b0 72 61 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20  ration that has 
162c0 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20  not yet been.** 
162d0 63 61 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65  carried out.  Se
162e0 65 6b 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f  ek the cursor no
162f0 77 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  w.  If an error 
16300 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a  occurs, return.*
16310 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  * the appropriat
16320 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
16330 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16340 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16350 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  leDeferredMoveto
16360 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16370 0a 20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a  .  int res, rc;.
16380 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16390 53 54 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ST.  extern int 
163a0 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
163b0 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61  ount;.#endif.  a
163c0 73 73 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72  ssert( p->deferr
163d0 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73  edMoveto );.  as
163e0 73 65 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65  sert( p->isTable
163f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
16400 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16410 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63  PE_BTREE );.  rc
16420 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
16430 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d  ovetoUnpacked(p-
16440 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20  >uc.pCursor, 0, 
16450 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c  p->movetoTarget,
16460 20 30 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28   0, &res);.  if(
16470 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
16480 0a 20 20 69 66 28 20 72 65 73 21 3d 30 20 29 20  .  if( res!=0 ) 
16490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
164a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64  RRUPT_BKPT;.#ifd
164b0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
164c0 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
164d0 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a  count++;.#endif.
164e0 20 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76    p->deferredMov
164f0 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  eto = 0;.  p->ca
16500 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48  cheStatus = CACH
16510 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72  E_STALE;.  retur
16520 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
16530 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20  /*.** Something 
16540 68 61 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72  has moved cursor
16550 20 22 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63   "p" out of plac
16560 65 2e 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f  e.  Maybe the ro
16570 77 20 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e  w it was.** poin
16580 74 65 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74  ted to was delet
16590 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
165a0 72 20 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20  r it.  Or maybe 
165b0 74 68 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a  the btree was.**
165c0 20 72 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68   rebalanced.  Wh
165d0 61 74 65 76 65 72 20 74 68 65 20 63 61 75 73 65  atever the cause
165e0 2c 20 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65  , try to restore
165f0 20 22 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63   "p" to the plac
16600 65 20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f  e it.** is suppo
16610 73 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69  sed to be pointi
16620 6e 67 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20  ng.  If the row 
16630 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20  was deleted out 
16640 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a  from under the.*
16650 2a 20 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68  * cursor, set th
16660 65 20 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e  e cursor to poin
16670 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e  t to a NULL row.
16680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
16690 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
166a0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
166b0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
166c0 0a 20 20 69 6e 74 20 69 73 44 69 66 66 65 72 65  .  int isDiffere
166d0 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73  ntRow, rc;.  ass
166e0 65 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65  ert( p->eCurType
166f0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
16700 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
16710 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b  uc.pCursor!=0 );
16720 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16730 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73  e3BtreeCursorHas
16740 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72  Moved(p->uc.pCur
16750 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
16760 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16770 72 52 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70  rRestore(p->uc.p
16780 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65  Cursor, &isDiffe
16790 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63  rentRow);.  p->c
167a0 61 63 68 65 53 74 61 74 75 73 20 3d 20 43 41 43  acheStatus = CAC
167b0 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20  HE_STALE;.  if( 
167c0 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29  isDifferentRow )
167d0 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b   p->nullRow = 1;
167e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
167f0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20  ./*.** Check to 
16800 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
16810 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e  cursor is valid.
16820 20 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75    Restore the cu
16830 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20  rsor.** if need 
16840 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20  be.  Return any 
16850 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74  I/O error from t
16860 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61  he restore opera
16870 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
16880 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 52 65  ite3VdbeCursorRe
16890 73 74 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72  store(VdbeCursor
168a0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
168b0 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
168c0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
168d0 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
168e0 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70  CursorHasMoved(p
168f0 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b  ->uc.pCursor) ){
16900 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64  .    return hand
16910 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29  leMovedCursor(p)
16920 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
16930 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
16940 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  ** Make sure the
16950 20 63 75 72 73 6f 72 20 70 20 69 73 20 72 65 61   cursor p is rea
16960 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72  dy to read or wr
16970 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77  ite the row to w
16980 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c  hich it.** was l
16990 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20  ast positioned. 
169a0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
169b0 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20   code if an OOM 
169c0 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72  fault or I/O err
169d0 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75  or.** prevents u
169e0 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69  s from positioni
169f0 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ng the cursor to
16a00 20 69 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73   its correct pos
16a10 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ition..**.** If 
16a20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69  a MoveTo operati
16a30 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e  on is pending on
16a40 20 74 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f   the given curso
16a50 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a  r, then do that.
16a60 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20  ** MoveTo now.  
16a70 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65  If no move is pe
16a80 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20  nding, check to 
16a90 73 65 65 20 69 66 20 74 68 65 20 72 6f 77 20 68  see if the row h
16aa0 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74  as been.** delet
16ab0 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65  ed out from unde
16ac0 72 20 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64  r the cursor and
16ad0 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b   if it has, mark
16ae0 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61   the row as.** a
16af0 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a   NULL row..**.**
16b00 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   If the cursor i
16b10 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
16b20 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  ng to the correc
16b30 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72  t row and that r
16b40 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65  ow has.** not be
16b50 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66  en deleted out f
16b60 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75  rom under the cu
16b70 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20  rsor, then this 
16b80 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
16b90 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
16ba0 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65  e3VdbeCursorMove
16bb0 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  to(VdbeCursor *p
16bc0 29 7b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72  ){.  if( p->eCur
16bd0 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
16be0 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70  REE ){.    if( p
16bf0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
16c00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16c10 20 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d   handleDeferredM
16c20 6f 76 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a  oveto(p);.    }.
16c30 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
16c40 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
16c50 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
16c60 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
16c70 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  n handleMovedCur
16c80 73 6f 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  sor(p);.    }.  
16c90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
16ca0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
16cb0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e  he following fun
16cc0 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71  ctions:.**.** sq
16cd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16ce0 79 70 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  ype().** sqlite3
16cf0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
16d00 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  n().** sqlite3Vd
16d10 62 65 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a  beSerialLen().**
16d20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16d30 61 6c 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74  alPut().** sqlit
16d40 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
16d50 29 0a 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c  ).**.** encapsul
16d60 61 74 65 20 74 68 65 20 63 6f 64 65 20 74 68 61  ate the code tha
16d70 74 20 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c  t serializes val
16d80 75 65 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20  ues for storage 
16d90 69 6e 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74  in SQLite.** dat
16da0 61 20 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f  a and index reco
16db0 72 64 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c  rds. Each serial
16dc0 69 7a 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69  ized value consi
16dd0 73 74 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72  sts of a.** 'ser
16de0 69 61 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20  ial-type' and a 
16df0 62 6c 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68  blob of data. Th
16e00 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
16e10 20 61 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67   an 8-byte unsig
16e20 6e 65 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20  ned.** integer, 
16e30 73 74 6f 72 65 64 20 61 73 20 61 20 76 61 72 69  stored as a vari
16e40 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20  nt..**.** In an 
16e50 53 51 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63  SQLite index rec
16e60 6f 72 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20  ord, the serial 
16e70 74 79 70 65 20 69 73 20 73 74 6f 72 65 64 20 64  type is stored d
16e80 69 72 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a  irectly before.*
16e90 2a 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61  * the blob of da
16ea0 74 61 20 74 68 61 74 20 69 74 20 63 6f 72 72 65  ta that it corre
16eb0 73 70 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20  sponds to. In a 
16ec0 74 61 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c  table record, al
16ed0 6c 20 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65  l serial.** type
16ee0 73 20 61 72 65 20 73 74 6f 72 65 64 20 61 74 20  s are stored at 
16ef0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
16f00 20 72 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65   record, and the
16f10 20 62 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61   blobs of data a
16f20 74 0a 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65  t.** the end. He
16f30 6e 63 65 20 74 68 65 73 65 20 66 75 6e 63 74 69  nce these functi
16f40 6f 6e 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61  ons allow the ca
16f50 6c 6c 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74  ller to handle t
16f60 68 65 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70  he.** serial-typ
16f70 65 20 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20  e and data blob 
16f80 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a  separately..**.*
16f90 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
16fa0 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
16fb0 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72  the various stor
16fc0 61 67 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20  age classes for 
16fd0 64 61 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65  data:.**.**   se
16fe0 72 69 61 6c 20 74 79 70 65 20 20 20 20 20 20 20  rial type       
16ff0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 20   bytes of data  
17000 20 20 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d      type.**   --
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
17020 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17030 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
17040 2d 2d 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20  ---.**      0   
17050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17060 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 4e    0            N
17070 55 4c 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20  ULL.**      1   
17080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17090 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 73    1            s
170a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
170b0 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
170c0 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
170d0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
170e0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
170f0 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
17100 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20        3         
17110 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65     signed intege
17120 72 0a 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20  r.**      4     
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17140 34 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  4            sig
17150 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17160 20 20 20 20 35 20 20 20 20 20 20 20 20 20 20 20      5           
17170 20 20 20 20 20 20 20 20 20 20 36 20 20 20 20 20            6     
17180 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17190 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20  teger.**      6 
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171b0 20 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20      8           
171c0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
171d0 2a 2a 20 20 20 20 20 20 37 20 20 20 20 20 20 20  **      7       
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20                8 
171f0 20 20 20 20 20 20 20 20 20 20 20 49 45 45 45 20             IEEE 
17200 66 6c 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20  float.**      8 
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17230 20 49 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e   Integer constan
17240 74 20 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20  t 0.**      9   
17250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17260 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17270 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17280 31 0a 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20  1.**     10,11  
17290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172a0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
172b0 65 72 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73  erved for expans
172c0 69 6f 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20  ion.**    N>=12 
172d0 61 6e 64 20 65 76 65 6e 20 20 20 20 20 20 20 28  and even       (
172e0 4e 2d 31 32 29 2f 32 20 20 20 20 20 20 20 20 42  N-12)/2        B
172f0 4c 4f 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20  LOB.**    N>=13 
17300 61 6e 64 20 6f 64 64 20 20 20 20 20 20 20 20 28  and odd        (
17310 4e 2d 31 33 29 2f 32 20 20 20 20 20 20 20 20 74  N-13)/2        t
17320 65 78 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20  ext.**.** The 8 
17330 61 6e 64 20 39 20 74 79 70 65 73 20 77 65 72 65  and 9 types were
17340 20 61 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c   added in 3.3.0,
17350 20 66 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20   file format 4. 
17360 20 50 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a   Prior versions.
17370 2a 2a 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c  ** of SQLite wil
17380 6c 20 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64  l not understand
17390 20 74 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79   those serial ty
173a0 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  pes..*/../*.** R
173b0 65 74 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c  eturn the serial
173c0 2d 74 79 70 65 20 66 6f 72 20 74 68 65 20 76 61  -type for the va
173d0 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d  lue stored in pM
173e0 65 6d 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74  em..*/.u32 sqlit
173f0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
17400 28 4d 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20  (Mem *pMem, int 
17410 66 69 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32  file_format, u32
17420 20 2a 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66   *pLen){.  int f
17430 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61  lags = pMem->fla
17440 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20  gs;.  u32 n;..  
17450 61 73 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20  assert( pLen!=0 
17460 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d  );.  if( flags&M
17470 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a  EM_Null ){.    *
17480 70 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65  pLen = 0;.    re
17490 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
174a0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20  ( flags&MEM_Int 
174b0 29 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65  ){.    /* Figure
174c0 20 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20   out whether to 
174d0 75 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f  use 1, 2, 4, 6 o
174e0 72 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20  r 8 bytes. */.# 
174f0 20 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59    define MAX_6BY
17500 54 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30  TE ((((i64)0x000
17510 30 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20  08000)<<32)-1). 
17520 20 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d     i64 i = pMem-
17530 3e 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b  >u.i;.    u64 u;
17540 0a 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a  .    if( i<0 ){.
17550 20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20        u = ~i;.  
17560 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
17570 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
17580 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
17590 20 20 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69      if( (i&1)==i
175a0 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e   && file_format>
175b0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  =4 ){.        *p
175c0 4c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Len = 0;.       
175d0 20 72 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75   return 8+(u32)u
175e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
175f0 20 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31         *pLen = 1
17600 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
17610 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
17620 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37  }.    if( u<=327
17630 36 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b  67 ){ *pLen = 2;
17640 20 72 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20   return 2; }.   
17650 20 69 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20   if( u<=8388607 
17660 29 7b 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65  ){ *pLen = 3; re
17670 74 75 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66  turn 3; }.    if
17680 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
17690 29 7b 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65  ){ *pLen = 4; re
176a0 74 75 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66  turn 4; }.    if
176b0 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29  ( u<=MAX_6BYTE )
176c0 7b 20 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74  { *pLen = 6; ret
176d0 75 72 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c  urn 5; }.    *pL
176e0 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75  en = 8;.    retu
176f0 72 6e 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 6;.  }.  if( 
17700 66 6c 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29  flags&MEM_Real )
17710 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b  {.    *pLen = 8;
17720 0a 20 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20  .    return 7;. 
17730 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65   }.  assert( pMe
17740 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  m->db->mallocFai
17750 6c 65 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45  led || flags&(ME
17760 4d 5f 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20  M_Str|MEM_Blob) 
17770 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65  );.  assert( pMe
17780 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d  m->n>=0 );.  n =
17790 20 28 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20   (u32)pMem->n;. 
177a0 20 69 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d   if( flags & MEM
177b0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b  _Zero ){.    n +
177c0 3d 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b  = pMem->u.nZero;
177d0 0a 20 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e  .  }.  *pLen = n
177e0 3b 0a 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32  ;.  return ((n*2
177f0 29 20 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73  ) + 12 + ((flags
17800 26 4d 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a  &MEM_Str)!=0));.
17810 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  }../*.** The siz
17820 65 73 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79  es for serial ty
17830 70 65 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32  pes less than 12
17840 38 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  8.*/.static cons
17850 74 20 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c  t u8 sqlite3Smal
17860 6c 54 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b  lTypeSizes[] = {
17870 0a 20 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20  .        /*  0  
17880 20 31 20 20 20 32 20 20 20 33 20 20 20 34 20 20   1   2   3   4  
17890 20 35 20 20 20 36 20 20 20 37 20 20 20 38 20 20   5   6   7   8  
178a0 20 39 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20   9 */   ./*   0 
178b0 2a 2f 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20  */   0,  1,  2, 
178c0 20 33 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20   3,  4,  6,  8, 
178d0 20 38 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20   8,  0,  0,./*  
178e0 31 30 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20  10 */   0,  0,  
178f0 30 2c 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20  0,  0,  1,  1,  
17900 32 2c 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f  2,  2,  3,  3,./
17910 2a 20 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34  *  20 */   4,  4
17920 2c 20 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36  ,  5,  5,  6,  6
17930 2c 20 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38  ,  7,  7,  8,  8
17940 2c 0a 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c  ,./*  30 */   9,
17950 20 20 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c    9, 10, 10, 11,
17960 20 31 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c   11, 12, 12, 13,
17970 20 31 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20   13,./*  40 */  
17980 31 34 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20  14, 14, 15, 15, 
17990 31 36 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20  16, 16, 17, 17, 
179a0 31 38 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a  18, 18,./*  50 *
179b0 2f 20 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32  /  19, 19, 20, 2
179c0 30 2c 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32  0, 21, 21, 22, 2
179d0 32 2c 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36  2, 23, 23,./*  6
179e0 30 20 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35  0 */  24, 24, 25
179f0 2c 20 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37  , 25, 26, 26, 27
17a00 2c 20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a  , 27, 28, 28,./*
17a10 20 20 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c    70 */  29, 29,
17a20 20 33 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c   30, 30, 31, 31,
17a30 20 33 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c   32, 32, 33, 33,
17a40 0a 2f 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20  ./*  80 */  34, 
17a50 33 34 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20  34, 35, 35, 36, 
17a60 33 36 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20  36, 37, 37, 38, 
17a70 33 38 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33  38,./*  90 */  3
17a80 39 2c 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34  9, 39, 40, 40, 4
17a90 31 2c 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34  1, 41, 42, 42, 4
17aa0 33 2c 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f  3, 43,./* 100 */
17ab0 20 20 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35    44, 44, 45, 45
17ac0 2c 20 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37  , 46, 46, 47, 47
17ad0 2c 20 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30  , 48, 48,./* 110
17ae0 20 2a 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c   */  49, 49, 50,
17af0 20 35 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c   50, 51, 51, 52,
17b00 20 35 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20   52, 53, 53,./* 
17b10 31 32 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20  120 */  54, 54, 
17b20 35 35 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20  55, 55, 56, 56, 
17b30 35 37 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  57, 57.};../*.**
17b40 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
17b50 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
17b60 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
17b70 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
17b80 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
17b90 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
17ba0 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
17bb0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
17bc0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
17bd0 32 38 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  28 ){.    return
17be0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
17bf0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
17c00 20 20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c    assert( serial
17c10 5f 74 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20  _type<12 .      
17c20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
17c30 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
17c40 65 72 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65  erial_type]==(se
17c50 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f  rial_type - 12)/
17c60 32 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 );.    return 
17c70 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65  sqlite3SmallType
17c80 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70  Sizes[serial_typ
17c90 65 5d 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c  e];.  }.}.u8 sql
17ca0 69 74 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53  ite3VdbeOneByteS
17cb0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20  erialTypeLen(u8 
17cc0 73 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20  serial_type){.  
17cd0 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
17ce0 79 70 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74  ype<128 );.  ret
17cf0 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c  urn sqlite3Small
17d00 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c  TypeSizes[serial
17d10 5f 74 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a  _type];  .}../*.
17d20 2a 2a 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20  ** If we are on 
17d30 61 6e 20 61 72 63 68 69 74 65 63 74 75 72 65 20  an architecture 
17d40 77 69 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61  with mixed-endia
17d50 6e 20 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70  n floating .** p
17d60 6f 69 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29  oints (ex: ARM7)
17d70 20 74 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c   then swap the l
17d80 6f 77 65 72 20 34 20 62 79 74 65 73 20 77 69 74  ower 4 bytes wit
17d90 68 20 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20  h the .** upper 
17da0 34 20 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e  4 bytes.  Return
17db0 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
17dc0 2a 2a 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68  ** For most arch
17dd0 69 74 65 63 74 75 72 65 73 2c 20 74 68 69 73 20  itectures, this 
17de0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
17df0 2a 20 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69  * (later):  It i
17e00 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
17e10 20 74 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d   that the mixed-
17e20 65 6e 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a  endian problem.*
17e30 2a 20 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20  * on ARM7 is an 
17e40 69 73 73 75 65 20 77 69 74 68 20 47 43 43 2c 20  issue with GCC, 
17e50 6e 6f 74 20 77 69 74 68 20 74 68 65 20 41 52 4d  not with the ARM
17e60 37 20 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d  7 chip.  It seem
17e70 73 0a 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20  s.** that early 
17e80 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
17e90 73 74 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77  stored the two w
17ea0 6f 72 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74  ords of a 64-bit
17eb0 0a 2a 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65  .** float in the
17ec0 20 77 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41   wrong order.  A
17ed0 6e 64 20 74 68 61 74 20 65 72 72 6f 72 20 68 61  nd that error ha
17ee0 73 20 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65  s been propagate
17ef0 64 0a 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e  d.** ever since.
17f00 20 20 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e    The blame is n
17f10 6f 74 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77  ot necessarily w
17f20 69 74 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e  ith GCC, though.
17f30 0a 2a 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61  .** GCC might ha
17f40 76 65 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20  ve just copying 
17f50 74 68 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d  the problem from
17f60 20 61 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65   a prior compile
17f70 72 2e 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20  r..** I am also 
17f80 74 6f 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20  told that newer 
17f90 76 65 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20  versions of GCC 
17fa0 74 68 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69  that follow a di
17fb0 66 66 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67  fferent.** ABI g
17fc0 65 74 20 74 68 65 20 62 79 74 65 20 6f 72 64 65  et the byte orde
17fd0 72 20 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44  r right..**.** D
17fe0 65 76 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20  evelopers using 
17ff0 53 51 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d  SQLite on an ARM
18000 37 20 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65  7 should compile
18010 20 61 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a   and run their.*
18020 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73  * application us
18030 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42  ing -DSQLITE_DEB
18040 55 47 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e  UG=1 at least on
18050 63 65 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a  ce.  With DEBUG.
18060 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65  ** enabled, some
18070 20 61 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77   asserts below w
18080 69 6c 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20  ill ensure that 
18090 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f  the byte order o
180a0 66 0a 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f  f.** floating po
180b0 69 6e 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f  int values is co
180c0 72 72 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30  rrect..**.** (20
180d0 30 37 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b  07-08-30)  Frank
180e0 20 76 61 6e 20 56 75 67 74 20 68 61 73 20 73 74   van Vugt has st
180f0 75 64 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c  udied this probl
18100 65 6d 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e  em closely.** an
18110 64 20 68 61 73 20 73 65 6e 64 20 68 69 73 20 66  d has send his f
18120 69 6e 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53  indings to the S
18130 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
18140 2e 20 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74  .  Frank.** writ
18150 65 73 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e  es that some Lin
18160 75 78 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72  ux kernels offer
18170 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
18180 68 61 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c  hardware.** emul
18190 61 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20  ation that uses 
181a0 6f 6e 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74  only 32-bit mant
181b0 69 73 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66  issas instead of
181c0 20 61 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62   a full .** 48-b
181d0 69 74 73 20 61 73 20 72 65 71 75 69 72 65 64 20  its as required 
181e0 62 79 20 74 68 65 20 49 45 45 45 20 73 74 61 6e  by the IEEE stan
181f0 64 61 72 64 2e 20 20 28 54 68 69 73 20 69 73 20  dard.  (This is 
18200 74 68 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50  the.** CONFIG_FP
18210 45 5f 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e  E_FASTFPE option
18220 2e 29 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74  .)  On such syst
18230 65 6d 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  ems, floating po
18240 69 6e 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70  int.** byte swap
18250 70 69 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72  ping becomes ver
18260 79 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20  y complicated.  
18270 54 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d  To avoid problem
18280 73 2c 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73  s,.** the necess
18290 61 72 79 20 62 79 74 65 20 73 77 61 70 70 69 6e  ary byte swappin
182a0 67 20 69 73 20 63 61 72 72 69 65 64 20 6f 75 74  g is carried out
182b0 20 75 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20   using a 64-bit 
182c0 69 6e 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65  integer.** rathe
182d0 72 20 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20  r than a 64-bit 
182e0 66 6c 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73  float.  Frank as
182f0 73 75 72 65 73 20 75 73 20 74 68 61 74 20 74 68  sures us that th
18300 65 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77  e code here.** w
18310 6f 72 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57  orks for him.  W
18320 65 2c 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72  e, the developer
18330 73 2c 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74  s, have no way t
18340 6f 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a  o independently.
18350 2a 2a 20 76 65 72 69 66 79 20 74 68 69 73 2c 20  ** verify this, 
18360 62 75 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20  but Frank seems 
18370 74 6f 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20  to know what he 
18380 69 73 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74  is talking about
18390 0a 2a 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20  .** so we trust 
183a0 68 69 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  him..*/.#ifdef S
183b0 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49  QLITE_MIXED_ENDI
183c0 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73  AN_64BIT_FLOAT.s
183d0 74 61 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53  tatic u64 floatS
183e0 77 61 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75  wap(u64 in){.  u
183f0 6e 69 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72  nion {.    u64 r
18400 3b 0a 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a  ;.    u32 i[2];.
18410 20 20 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a    } u;.  u32 t;.
18420 0a 20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74  .  u.r = in;.  t
18430 20 3d 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69   = u.i[0];.  u.i
18440 5b 30 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20  [0] = u.i[1];.  
18450 75 2e 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65  u.i[1] = t;.  re
18460 74 75 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65  turn u.r;.}.# de
18470 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e  fine swapMixedEn
18480 64 69 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20  dianFloat(X)  X 
18490 3d 20 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23  = floatSwap(X).#
184a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77  else.# define sw
184b0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
184c0 61 74 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  at(X).#endif../*
184d0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 65  .** Write the se
184e0 72 69 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c  rialized data bl
184f0 6f 62 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  ob for the value
18500 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20   stored in pMem 
18510 69 6e 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74  into .** buf. It
18520 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
18530 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20   the caller has 
18540 61 6c 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63  allocated suffic
18550 69 65 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52  ient space..** R
18560 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
18570 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
18580 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73  n..**.** nBuf is
18590 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73   the amount of s
185a0 70 61 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66  pace left in buf
185b0 5b 5d 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20  [].  The caller 
185c0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a  is responsible.*
185d0 2a 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67  * for allocating
185e0 20 65 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f   enough space to
185f0 20 62 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74   buf[] to hold t
18600 68 65 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c  he entire field,
18610 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66   exclusive.** of
18620 20 74 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65   the pMem->u.nZe
18630 72 6f 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d  ro bytes for a M
18640 45 4d 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  EM_Zero value..*
18650 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18660 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
18670 61 63 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e  actually written
18680 20 69 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68   into buf[].  Th
18690 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62  e number.** of b
186a0 79 74 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f  ytes in the zero
186b0 2d 66 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20  -filled tail is 
186c0 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
186d0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c  return value onl
186e0 79 0a 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79  y.** if those by
186f0 74 65 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20  tes were zeroed 
18700 69 6e 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33  in buf[]..*/ .u3
18710 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
18720 69 61 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20  ialPut(u8 *buf, 
18730 4d 65 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73  Mem *pMem, u32 s
18740 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75  erial_type){.  u
18750 33 32 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e  32 len;..  /* In
18760 74 65 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a  teger and Real *
18770 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74  /.  if( serial_t
18780 79 70 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c  ype<=7 && serial
18790 5f 74 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75  _type>0 ){.    u
187a0 36 34 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b  64 v;.    u32 i;
187b0 0a 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f  .    if( serial_
187c0 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20  type==7 ){.     
187d0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
187e0 76 29 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d  v)==sizeof(pMem-
187f0 3e 75 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d  >u.r) );.      m
18800 65 6d 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d  emcpy(&v, &pMem-
18810 3e 75 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29  >u.r, sizeof(v))
18820 3b 0a 20 20 20 20 20 20 73 77 61 70 4d 69 78 65  ;.      swapMixe
18830 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b  dEndianFloat(v);
18840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
18850 20 20 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b    v = pMem->u.i;
18860 0a 20 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d  .    }.    len =
18870 20 69 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c   i = sqlite3Smal
18880 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
18890 6c 5f 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73  l_type];.    ass
188a0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
188b0 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
188c0 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
188d0 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
188e0 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
188f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
18900 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
18910 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
18920 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18930 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
18940 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
18950 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
18960 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
18970 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
18980 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
18990 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
189a0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
189b0 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
189c0 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66   pMem->n;.    if
189d0 28 20 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79  ( len>0 ) memcpy
189e0 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c  (buf, pMem->z, l
189f0 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
18a00 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  len;.  }..  /* N
18a10 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73  ULL or constants
18a20 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74   0 or 1 */.  ret
18a30 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70  urn 0;.}../* Inp
18a40 75 74 20 22 78 22 20 69 73 20 61 20 73 65 71 75  ut "x" is a sequ
18a50 65 6e 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64  ence of unsigned
18a60 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74   characters that
18a70 20 72 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20   represent a.** 
18a80 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
18a90 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
18aa0 65 71 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76  equivalent nativ
18ab0 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65  e integer.*/.#de
18ac0 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  fine ONE_BYTE_IN
18ad0 54 28 78 29 20 20 20 20 28 28 69 38 29 28 78 29  T(x)    ((i8)(x)
18ae0 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f  [0]).#define TWO
18af0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
18b00 28 32 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d  (256*(i8)((x)[0]
18b10 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e  )|(x)[1]).#defin
18b20 65 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54  e THREE_BYTE_INT
18b30 28 78 29 20 20 28 36 35 35 33 36 2a 28 69 38 29  (x)  (65536*(i8)
18b40 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
18b50 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65  <<8)|(x)[2]).#de
18b60 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55  fine FOUR_BYTE_U
18b70 49 4e 54 28 78 29 20 20 28 28 28 75 33 32 29 28  INT(x)  (((u32)(
18b80 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b  x)[0]<<24)|((x)[
18b90 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c  1]<<16)|((x)[2]<
18ba0 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66  <8)|(x)[3]).#def
18bb0 69 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e  ine FOUR_BYTE_IN
18bc0 54 28 78 29 20 28 31 36 37 37 37 32 31 36 2a 28  T(x) (16777216*(
18bd0 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
18be0 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d  [1]<<16)|((x)[2]
18bf0 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a  <<8)|(x)[3])../*
18c00 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20  .** Deserialize 
18c10 74 68 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f  the data blob po
18c20 69 6e 74 65 64 20 74 6f 20 62 79 20 62 75 66 20  inted to by buf 
18c30 61 73 20 73 65 72 69 61 6c 20 74 79 70 65 20 73  as serial type s
18c40 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e  erial_type.** an
18c50 64 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75  d store the resu
18c60 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74  lt in pMem.  Ret
18c70 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18c80 66 20 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a  f bytes read..**
18c90 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
18ca0 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
18cb0 20 61 73 20 74 77 6f 20 73 65 70 61 72 61 74 65   as two separate
18cc0 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65   routines for pe
18cd0 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68  rformance..** Th
18ce0 65 20 66 65 77 20 63 61 73 65 73 20 74 68 61 74  e few cases that
18cf0 20 72 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76   require local v
18d00 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f  ariables are bro
18d10 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73  ken out into a s
18d20 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69  eparate.** routi
18d30 6e 65 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f  ne so that in mo
18d40 73 74 20 63 61 73 65 73 20 74 68 65 20 6f 76 65  st cases the ove
18d50 72 68 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20  rhead of moving 
18d60 74 68 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65  the stack pointe
18d70 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e  r.** is avoided.
18d80 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20  .*/ .static u32 
18d90 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
18da0 73 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e  serialGet(.  con
18db0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
18dc0 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75   *buf,     /* Bu
18dd0 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c  ffer to deserial
18de0 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33  ize from */.  u3
18df0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20  2 serial_type,  
18e00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
18e10 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65  erial type to de
18e20 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d  serialize */.  M
18e30 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20  em *pMem        
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18e50 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77  Memory cell to w
18e60 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20  rite value into 
18e70 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20  */.){.  u64 x = 
18e80 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62  FOUR_BYTE_UINT(b
18e90 75 66 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46  uf);.  u32 y = F
18ea0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
18eb0 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c  f+4);.  x = (x<<
18ec0 33 32 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73  32) + y;.  if( s
18ed0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b  erial_type==6 ){
18ee0 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  .    /* EVIDENCE
18ef0 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32  -OF: R-29851-522
18f00 37 32 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  72 Value is a bi
18f10 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a  g-endian 64-bit.
18f20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
18f30 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
18f40 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  */.    pMem->u.i
18f50 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20   = *(i64*)&x;.  
18f60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
18f70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73  MEM_Int;.    tes
18f80 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
18f90 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  <0 );.  }else{. 
18fa0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
18fb0 46 3a 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34  F: R-57343-49114
18fc0 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
18fd0 65 6e 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d  endian IEEE 754-
18fe0 32 30 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20  2008 64-bit.    
18ff0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
19000 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66  t number. */.#if
19010 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47   !defined(NDEBUG
19020 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
19030 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
19040 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a  NG_POINT).    /*
19050 20 56 65 72 69 66 79 20 74 68 61 74 20 69 6e 74   Verify that int
19060 65 67 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69  egers and floati
19070 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
19080 75 73 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20  use the same.   
19090 20 2a 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20   ** byte order. 
190a0 20 4f 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c   Or, that if SQL
190b0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
190c0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a  _64BIT_FLOAT is.
190d0 20 20 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74      ** defined t
190e0 68 61 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  hat 64-bit float
190f0 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73  ing point values
19100 20 72 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65   really are mixe
19110 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e  d.    ** endian.
19120 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74  .    */.    stat
19130 69 63 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20  ic const u64 t1 
19140 3d 20 28 28 75 36 34 29 30 78 33 66 66 30 30 30  = ((u64)0x3ff000
19150 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61  00)<<32;.    sta
19160 74 69 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65  tic const double
19170 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75   r1 = 1.0;.    u
19180 36 34 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20  64 t2 = t1;.    
19190 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
191a0 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73  loat(t2);.    as
191b0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29  sert( sizeof(r1)
191c0 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20  ==sizeof(t2) && 
191d0 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c  memcmp(&r1, &t2,
191e0 20 73 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20   sizeof(r1))==0 
191f0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73  );.#endif.    as
19200 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
19210 3d 38 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65  =8 && sizeof(pMe
19220 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20  m->u.r)==8 );.  
19230 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61    swapMixedEndia
19240 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d  nFloat(x);.    m
19250 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72  emcpy(&pMem->u.r
19260 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29  , &x, sizeof(x))
19270 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67  ;.    pMem->flag
19280 73 20 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e  s = sqlite3IsNaN
19290 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45  (pMem->u.r) ? ME
192a0 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61  M_Null : MEM_Rea
192b0 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  l;.  }.  return 
192c0 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33  8;.}.u32 sqlite3
192d0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20  VdbeSerialGet(. 
192e0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
192f0 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
19300 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
19310 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
19320 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
19330 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
19340 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
19350 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
19360 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
19370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19380 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
19390 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
193a0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74  nto */.){.  swit
193b0 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
193c0 29 7b 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20  ){.    case 10: 
193d0 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
193e0 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
193f0 20 20 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f      case 11:   /
19400 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
19410 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
19420 20 63 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e   case 0: {  /* N
19430 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ull */.      /* 
19440 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19450 34 30 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65  4078-09375 Value
19460 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20   is a NULL. */. 
19470 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19480 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
19490 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
194a0 20 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20      case 1: {.  
194b0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
194c0 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39  OF: R-44885-2519
194d0 36 20 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d  6 Value is an 8-
194e0 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d  bit twos-complem
194f0 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74  ent.      ** int
19500 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
19510 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42  Mem->u.i = ONE_B
19520 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
19530 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19540 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
19550 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19560 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
19570 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
19580 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a      case 2: { /*
19590 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   2-byte signed i
195a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
195b0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
195c0 52 2d 34 39 37 39 34 2d 33 35 30 32 36 20 56 61  R-49794-35026 Va
195d0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
195e0 69 61 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20  ian 16-bit.     
195f0 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
19600 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
19610 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19620 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  = TWO_BYTE_INT(b
19630 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
19640 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
19650 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
19660 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
19670 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b  .      return 2;
19680 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
19690 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73  3: { /* 3-byte s
196a0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
196b0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
196c0 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35  CE-OF: R-37839-5
196d0 34 33 30 31 20 56 61 6c 75 65 20 69 73 20 61 20  4301 Value is a 
196e0 62 69 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69  big-endian 24-bi
196f0 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d  t.      ** twos-
19700 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67  complement integ
19710 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19720 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42  m->u.i = THREE_B
19730 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
19740 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19750 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
19760 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19770 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
19780 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a  return 3;.    }.
19790 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
197a0 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
197b0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
197c0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
197d0 52 2d 30 31 38 34 39 2d 32 36 30 37 39 20 56 61  R-01849-26079 Va
197e0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
197f0 69 61 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20  ian 32-bit.     
19800 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
19810 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
19820 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19830 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  = FOUR_BYTE_INT(
19840 62 75 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48  buf);.#ifdef __H
19850 50 5f 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57  P_cc .      /* W
19860 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67  ork around a sig
19870 6e 2d 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20  n-extension bug 
19880 69 6e 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c  in the HP compil
19890 65 72 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a  er for HP/UX */.
198a0 20 20 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d        if( buf[0]
198b0 26 30 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e  &0x80 ) pMem->u.
198c0 69 20 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38  i |= 0xffffffff8
198d0 30 30 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69  0000000LL;.#endi
198e0 66 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  f.      pMem->fl
198f0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19900 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19910 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19920 20 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20      return 4;.  
19930 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
19940 7b 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e  { /* 6-byte sign
19950 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19960 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19970 4f 46 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37  OF: R-50385-0967
19980 34 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  4 Value is a big
19990 2d 65 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20  -endian 48-bit. 
199a0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
199b0 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
199c0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
199d0 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f  u.i = FOUR_BYTE_
199e0 55 49 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28  UINT(buf+2) + ((
199f0 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f  (i64)1)<<32)*TWO
19a00 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a  _BYTE_INT(buf);.
19a10 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19a20 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19a30 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19a40 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
19a50 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20    return 6;.    
19a60 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 20 20  }.    case 6:   
19a70 2f 2a 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 8-byte signed
19a80 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
19a90 63 61 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45  case 7: { /* IEE
19aa0 45 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  E floating point
19ab0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   */.      /* The
19ac0 73 65 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72  se use local var
19ad0 69 61 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68  iables, so do th
19ae0 65 6d 20 69 6e 20 61 20 73 65 70 61 72 61 74 65  em in a separate
19af0 20 72 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a   routine.      *
19b00 2a 20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e  * to avoid havin
19b10 67 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72  g to move the fr
19b20 61 6d 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  ame pointer in t
19b30 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
19b40 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  /.      return s
19b50 65 72 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72  erialGet(buf,ser
19b60 69 61 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a  ial_type,pMem);.
19b70 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38      }.    case 8
19b80 3a 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20  :    /* Integer 
19b90 30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a  0 */.    case 9:
19ba0 20 7b 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31   {  /* Integer 1
19bb0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19bc0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37  DENCE-OF: R-1297
19bd0 36 2d 32 32 38 39 33 20 56 61 6c 75 65 20 69 73  6-22893 Value is
19be0 20 74 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20   the integer 0. 
19bf0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
19c00 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33  ENCE-OF: R-18143
19c10 2d 31 32 31 32 31 20 56 61 6c 75 65 20 69 73 20  -12121 Value is 
19c20 74 68 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a  the integer 1. *
19c30 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
19c40 69 20 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d  i = serial_type-
19c50 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  8;.      pMem->f
19c60 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19c70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
19c80 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
19c90 74 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56  t: {.      /* EV
19ca0 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36  IDENCE-OF: R-146
19cb0 30 36 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69  06-31564 Value i
19cc0 73 20 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73  s a BLOB that is
19cd0 20 28 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20   (N-12)/2 bytes 
19ce0 69 6e 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67  in.      ** leng
19cf0 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49  th..      ** EVI
19d00 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30  DENCE-OF: R-2840
19d10 31 2d 30 30 31 34 30 20 56 61 6c 75 65 20 69 73  1-00140 Value is
19d20 20 61 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65   a string in the
19d30 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61   text encoding a
19d40 6e 64 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31  nd.      ** (N-1
19d50 33 29 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65  3)/2 bytes in le
19d60 6e 67 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ngth. */.      s
19d70 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
19d80 61 46 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f  aFlag[] = { MEM_
19d90 42 6c 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20  Blob|MEM_Ephem, 
19da0 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65  MEM_Str|MEM_Ephe
19db0 6d 20 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  m };.      pMem-
19dc0 3e 7a 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66  >z = (char *)buf
19dd0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
19de0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
19df0 32 29 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d  2)/2;.      pMem
19e00 2d 3e 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b  ->flags = aFlag[
19e10 73 65 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a  serial_type&1];.
19e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65        return pMe
19e30 6d 2d 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  m->n;.    }.  }.
19e40 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a    return 0;.}./*
19e50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19e60 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f   is used to allo
19e70 63 61 74 65 20 73 75 66 66 69 63 69 65 6e 74 20  cate sufficient 
19e80 73 70 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70  space for an Unp
19e90 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73  ackedRecord.** s
19ea0 74 72 75 63 74 75 72 65 20 6c 61 72 67 65 20 65  tructure large e
19eb0 6e 6f 75 67 68 20 74 6f 20 62 65 20 75 73 65 64  nough to be used
19ec0 20 77 69 74 68 20 73 71 6c 69 74 65 33 56 64 62   with sqlite3Vdb
19ed0 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20  eRecordUnpack() 
19ee0 69 66 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  if.** the first 
19ef0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
19f00 69 6e 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f  inter to KeyInfo
19f10 20 73 74 72 75 63 74 75 72 65 20 70 4b 65 79 49   structure pKeyI
19f20 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  nfo..**.** The s
19f30 70 61 63 65 20 69 73 20 65 69 74 68 65 72 20 61  pace is either a
19f40 6c 6c 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73  llocated using s
19f50 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
19f60 77 28 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68  w() or from with
19f70 69 6e 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67  in.** the unalig
19f80 6e 65 64 20 62 75 66 66 65 72 20 70 61 73 73 65  ned buffer passe
19f90 64 20 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64  d via the second
19fa0 20 61 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d   and third argum
19fb0 65 6e 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79  ents (presumably
19fc0 0a 2a 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29  .** stack space)
19fd0 2e 20 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c  . If the former,
19fe0 20 74 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73   then *ppFree is
19ff0 20 73 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65   set to a pointe
1a000 72 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a  r that should.**
1a010 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
1a020 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
1a030 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
1a040 44 62 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66  DbFree(). Or, if
1a050 20 74 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74   the .** allocat
1a060 69 6f 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74  ion comes from t
1a070 68 65 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63  he pSpace/szSpac
1a080 65 20 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65  e buffer, *ppFre
1a090 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1a0a0 0a 2a 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72  .** before retur
1a0b0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
1a0c0 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75  n OOM error occu
1a0d0 72 73 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  rs, NULL is retu
1a0e0 72 6e 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65  rned..*/.Unpacke
1a0f0 64 52 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33  dRecord *sqlite3
1a100 56 64 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65  VdbeAllocUnpacke
1a110 64 52 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e  dRecord(.  KeyIn
1a120 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1a130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
1a140 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65  scription of the
1a150 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61   record */.  cha
1a160 72 20 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20  r *pSpace,      
1a170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a180 55 6e 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20  Unaligned space 
1a190 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69  available */.  i
1a1a0 6e 74 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20  nt szSpace,     
1a1b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1c0 2a 20 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65  * Size of pSpace
1a1d0 5b 5d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  [] in bytes */. 
1a1e0 20 63 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20   char **ppFree  
1a1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a200 20 2f 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20   /* OUT: Caller 
1a210 73 68 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73  should free this
1a220 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20   pointer */.){. 
1a230 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1a240 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
1a250 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63   /* Unpacked rec
1a260 6f 72 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f  ord to return */
1a270 0a 20 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20  .  int nOff;    
1a280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a290 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20     /* Increment 
1a2a0 70 53 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74  pSpace by nOff t
1a2b0 6f 20 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20  o align it */.  
1a2c0 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
1a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a2e0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a2f0 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72 20  es required for 
1a300 2a 70 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77  *p */..  /* We w
1a310 61 6e 74 20 74 6f 20 73 68 69 66 74 20 74 68 65  ant to shift the
1a320 20 70 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20   pointer pSpace 
1a330 75 70 20 73 75 63 68 20 74 68 61 74 20 69 74 20  up such that it 
1a340 69 73 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65  is 8-byte aligne
1a350 64 2e 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65  d..  ** Thus, we
1a360 20 6e 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61   need to calcula
1a370 74 65 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66  te a value, nOff
1a380 2c 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  , between 0 and 
1a390 37 2c 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a  7, to shift .  *
1a3a0 2a 20 69 74 20 62 79 2e 20 20 49 66 20 70 53 70  * it by.  If pSp
1a3b0 61 63 65 20 69 73 20 61 6c 72 65 61 64 79 20 38  ace is already 8
1a3c0 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e  -byte aligned, n
1a3d0 4f 66 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65  Off should be ze
1a3e0 72 6f 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20  ro..  */.  nOff 
1a3f0 3d 20 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50  = (8 - (SQLITE_P
1a400 54 52 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65  TR_TO_INT(pSpace
1a410 29 20 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e  ) & 7)) & 7;.  n
1a420 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69  Byte = ROUND8(si
1a430 7a 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63  zeof(UnpackedRec
1a440 6f 72 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d  ord)) + sizeof(M
1a450 65 6d 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e  em)*(pKeyInfo->n
1a460 46 69 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20  Field+1);.  if( 
1a470 6e 42 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f  nByte>szSpace+nO
1a480 66 66 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55  ff ){.    p = (U
1a490 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29  npackedRecord *)
1a4a0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52  sqlite3DbMallocR
1a4b0 61 77 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c  aw(pKeyInfo->db,
1a4c0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70   nByte);.    *pp
1a4d0 46 72 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70  Free = (char *)p
1a4e0 3b 0a 20 20 20 20 69 66 28 20 21 70 20 29 20 72  ;.    if( !p ) r
1a4f0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
1a500 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63  {.    p = (Unpac
1a510 6b 65 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61  kedRecord*)&pSpa
1a520 63 65 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70  ce[nOff];.    *p
1a530 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a  pFree = 0;.  }..
1a540 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d    p->aMem = (Mem
1a550 2a 29 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f  *)&((char*)p)[RO
1a560 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
1a570 63 6b 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20  ckedRecord))];. 
1a580 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1a590 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30  o->aSortOrder!=0
1a5a0 20 29 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66   );.  p->pKeyInf
1a5b0 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  o = pKeyInfo;.  
1a5c0 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79  p->nField = pKey
1a5d0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31  Info->nField + 1
1a5e0 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1a5f0 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
1a600 20 6e 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64   nKey-byte encod
1a610 69 6e 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20  ing of a record 
1a620 69 6e 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c  in pKey[], popul
1a630 61 74 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61  ate the .** Unpa
1a640 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75 63  ckedRecord struc
1a650 74 75 72 65 20 69 6e 64 69 63 61 74 65 64 20 62  ture indicated b
1a660 79 20 74 68 65 20 66 6f 75 72 74 68 20 61 72 67  y the fourth arg
1a670 75 6d 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a  ument with the.*
1a680 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
1a690 65 20 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64  e decoded record
1a6a0 2e 0a 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74  ..*/ .void sqlit
1a6b0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1a6c0 63 6b 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70  ck(.  KeyInfo *p
1a6d0 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20  KeyInfo,     /* 
1a6e0 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
1a6f0 74 20 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72  t the record for
1a700 6d 61 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65  mat */.  int nKe
1a710 79 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y,              
1a720 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62  /* Size of the b
1a730 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a  inary record */.
1a740 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b    const void *pK
1a750 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ey,      /* The 
1a760 62 69 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f  binary record */
1a770 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1a780 64 20 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70  d *p      /* Pop
1a790 75 6c 61 74 65 20 74 68 69 73 20 73 74 72 75 63  ulate this struc
1a7a0 74 75 72 65 20 62 65 66 6f 72 65 20 72 65 74 75  ture before retu
1a7b0 72 6e 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63  rning. */.){.  c
1a7c0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1a7d0 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73  ar *aKey = (cons
1a7e0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a7f0 2a 29 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b  *)pKey;.  int d;
1a800 20 0a 20 20 75 33 32 20 69 64 78 3b 20 20 20 20   .  u32 idx;    
1a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a820 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
1a830 20 61 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20   aKey[] to read 
1a840 66 72 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b  from */.  u16 u;
1a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a860 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73            /* Uns
1a870 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74  igned loop count
1a880 65 72 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  er */.  u32 szHd
1a890 72 3b 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  r;.  Mem *pMem =
1a8a0 20 70 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e   p->aMem;..  p->
1a8b0 64 65 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a  default_rc = 0;.
1a8c0 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
1a8d0 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
1a8e0 4d 65 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20  Mem) );.  idx = 
1a8f0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1a900 2c 20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20  , szHdr);.  d = 
1a910 73 7a 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a  szHdr;.  u = 0;.
1a920 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48    while( idx<szH
1a930 64 72 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b  dr && d<=nKey ){
1a940 0a 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f  .    u32 serial_
1a950 74 79 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b  type;..    idx +
1a960 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  = getVarint32(&a
1a970 4b 65 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c  Key[idx], serial
1a980 5f 74 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d  _type);.    pMem
1a990 2d 3e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f  ->enc = pKeyInfo
1a9a0 2d 3e 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d  ->enc;.    pMem-
1a9b0 3e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  >db = pKeyInfo->
1a9c0 64 62 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d  db;.    /* pMem-
1a9d0 3e 66 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73  >flags = 0; // s
1a9e0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1a9f0 47 65 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74  Get() will set t
1aa00 68 69 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20  his for us */.  
1aa10 20 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63    pMem->szMalloc
1aa20 20 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73   = 0;.    d += s
1aa30 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1aa40 47 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65  Get(&aKey[d], se
1aa50 72 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29  rial_type, pMem)
1aa60 3b 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20  ;.    pMem++;.  
1aa70 20 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e    if( (++u)>=p->
1aa80 6e 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a  nField ) break;.
1aa90 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c    }.  assert( u<
1aaa0 3d 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  =pKeyInfo->nFiel
1aab0 64 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46  d + 1 );.  p->nF
1aac0 69 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66  ield = u;.}..#if
1aad0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1aae0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
1aaf0 6e 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69  n compares two i
1ab00 6e 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65  ndex or table re
1ab10 63 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65  cord keys in the
1ab20 20 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20   same way.** as 
1ab30 74 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52  the sqlite3VdbeR
1ab40 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72  ecordCompare() r
1ab50 6f 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56  outine. Unlike V
1ab60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1ab70 28 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  (),.** this func
1ab80 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1ab90 73 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76  s and compares v
1aba0 61 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a  alues using the.
1abb0 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
1abc0 72 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71  rialGet() and sq
1abd0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1abe0 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20  ) functions. It 
1abf0 69 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73  is used.** in as
1ac00 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1ac10 73 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  s to ensure that
1ac20 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63   the optimized c
1ac30 6f 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65  ode in.** sqlite
1ac40 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1ac50 72 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73  re() returns res
1ac60 75 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20  ults with these 
1ac70 74 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a  two primitives..
1ac80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
1ac90 65 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20  e if the result 
1aca0 6f 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73  of comparison is
1acb0 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64   equivalent to d
1acc0 65 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a  esiredResult..**
1acd0 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66   Return false if
1ace0 20 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61   there is a disa
1acf0 67 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  greement..*/.sta
1ad00 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f  tic int vdbeReco
1ad10 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a  rdCompareDebug(.
1ad20 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1ad30 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1ad40 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1ad50 20 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52   const UnpackedR
1ad60 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f  ecord *pPKey2, /
1ad70 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1ad80 20 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75   int desiredResu
1ad90 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  lt             /
1ada0 2a 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72  * Correct answer
1adb0 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1adc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1add0 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1ade0 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65  ] of next data e
1adf0 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20  lement */.  u32 
1ae00 69 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f  idx1;          /
1ae10 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b  * Offset into aK
1ae20 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61  ey[] of next hea
1ae30 64 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20  der element */. 
1ae40 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
1ae50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ae60 20 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72   bytes in header
1ae70 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   */.  int i = 0;
1ae80 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
1ae90 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1aea0 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63  char *aKey1 = (c
1aeb0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1aec0 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65  ar *)pKey1;.  Ke
1aed0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b  yInfo *pKeyInfo;
1aee0 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20  .  Mem mem1;..  
1aef0 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1af00 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69  2->pKeyInfo;.  i
1af10 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d  f( pKeyInfo->db=
1af20 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1af30 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
1af40 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d  Info->enc;.  mem
1af50 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
1af60 3e 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66  >db;.  /* mem1.f
1af70 6c 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69  lags = 0;  // Wi
1af80 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ll be initialize
1af90 64 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65  d by sqlite3Vdbe
1afa0 53 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20  SerialGet() */. 
1afb0 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e   VVA_ONLY( mem1.
1afc0 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20  szMalloc = 0; ) 
1afd0 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62  /* Only needed b
1afe0 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  y assert() state
1aff0 6d 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43  ments */..  /* C
1b000 6f 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d  ompilers may com
1b010 70 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e  plain that mem1.
1b020 75 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c  u.i is potential
1b030 6c 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ly uninitialized
1b040 2e 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20  ..  ** We could 
1b050 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61  initialize it, a
1b060 73 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f  s shown here, to
1b070 20 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63   silence those c
1b080 6f 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20  omplaints..  ** 
1b090 42 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d  But in fact, mem
1b0a0 31 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72  1.u.i will never
1b0b0 20 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65   actually be use
1b0c0 64 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c  d uninitialized,
1b0d0 20 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a   and doing .  **
1b0e0 20 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79   the unnecessary
1b0f0 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
1b100 68 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65  has a measurable
1b110 20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72   negative perfor
1b120 6d 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63  mance.  ** impac
1b130 74 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f  t, since this ro
1b140 75 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20  utine is a very 
1b150 68 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e  high runner.  An
1b160 64 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a  d so, we choose.
1b170 20 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74    ** to ignore t
1b180 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  he compiler warn
1b190 69 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74  ings and leave t
1b1a0 68 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69  his variable uni
1b1b0 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f  nitialized..  */
1b1c0 0a 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20  .  /*  mem1.u.i 
1b1d0 3d 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65  = 0;  // not nee
1b1e0 64 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c  ded, here to sil
1b1f0 65 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61  ence compiler wa
1b200 72 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64  rning */.  .  id
1b210 78 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x1 = getVarint32
1b220 28 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b  (aKey1, szHdr1);
1b230 0a 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38  .  if( szHdr1>98
1b240 33 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c  307 ) return SQL
1b250 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64  ITE_CORRUPT;.  d
1b260 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73  1 = szHdr1;.  as
1b270 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1b280 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
1b290 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  >nXField>=pPKey2
1b2a0 2d 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52  ->nField || CORR
1b2b0 55 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65  UPT_DB );.  asse
1b2c0 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  rt( pKeyInfo->aS
1b2d0 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1b2e0 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66   assert( pKeyInf
1b2f0 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20  o->nField>0 );. 
1b300 20 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73   assert( idx1<=s
1b310 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54  zHdr1 || CORRUPT
1b320 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20  _DB );.  do{.   
1b330 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
1b340 31 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  1;..    /* Read 
1b350 74 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  the serial types
1b360 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c   for the next el
1b370 65 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65  ement in each ke
1b380 79 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b  y. */.    idx1 +
1b390 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61  = getVarint32( a
1b3a0 4b 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61  Key1+idx1, seria
1b3b0 6c 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20  l_type1 );..    
1b3c0 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74  /* Verify that t
1b3d0 68 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b  here is enough k
1b3e0 65 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69  ey space remaini
1b3f0 6e 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20  ng to avoid.    
1b400 2a 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72  ** a buffer over
1b410 72 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73  read.  The "d1+s
1b420 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73  erial_type1+2" s
1b430 75 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c  ubexpression wil
1b440 6c 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20  l.    ** always 
1b450 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
1b460 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1b470 61 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72  amount of requir
1b480 65 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20  ed key space..  
1b490 20 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70    ** Use that ap
1b4a0 70 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61  proximation to a
1b4b0 76 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78  void the more ex
1b4c0 70 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a  pensive call to.
1b4d0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64      ** sqlite3Vd
1b4e0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1b4f0 29 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  ) in the common 
1b500 63 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  case..    */.   
1b510 20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74   if( d1+serial_t
1b520 79 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79  ype1+2>(u32)nKey
1b530 31 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c  1.     && d1+sql
1b540 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1b550 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1b560 65 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a  e1)>(u32)nKey1 .
1b570 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65      ){.      bre
1b580 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1b590 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61  * Extract the va
1b5a0 6c 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61  lues to be compa
1b5b0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1b5c0 64 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62  d1 += sqlite3Vdb
1b5d0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1b5e0 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1b5f0 70 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20  pe1, &mem1);..  
1b600 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70    /* Do the comp
1b610 61 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20  arison.    */.  
1b620 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65    rc = sqlite3Me
1b630 6d 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20  mCompare(&mem1, 
1b640 26 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d  &pPKey2->aMem[i]
1b650 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c  , pKeyInfo->aCol
1b660 6c 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  l[i]);.    if( r
1b670 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  c!=0 ){.      as
1b680 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1b690 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65  loc==0 );  /* Se
1b6a0 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20  e comment below 
1b6b0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65  */.      if( pKe
1b6c0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1b6d0 72 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  r[i] ){.        
1b6e0 72 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e  rc = -rc;  /* In
1b6f0 76 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20  vert the result 
1b700 66 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72  for DESC sort or
1b710 64 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  der. */.      }.
1b720 20 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67        goto debug
1b730 43 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20  CompareEnd;.    
1b740 7d 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68  }.    i++;.  }wh
1b750 69 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31  ile( idx1<szHdr1
1b760 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1b770 69 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  ield );..  /* No
1b780 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
1b790 6f 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20  on is ever used 
1b7a0 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20  on mem1.  Prove 
1b7b0 74 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20  this using.  ** 
1b7c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  the following as
1b7d0 73 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20  sert().  If the 
1b7e0 61 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20  assert() fails, 
1b7f0 69 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20  it indicates a. 
1b800 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20   ** memory leak 
1b810 61 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61  and a need to ca
1b820 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  ll sqlite3VdbeMe
1b830 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e  mRelease(&mem1).
1b840 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1b850 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1b860 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20   );..  /* rc==0 
1b870 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20  here means that 
1b880 6f 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20  one of the keys 
1b890 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64  ran out of field
1b8a0 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74  s and.  ** all t
1b8b0 68 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20  he fields up to 
1b8c0 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20  that point were 
1b8d0 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68  equal. Return th
1b8e0 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a  e default_rc.  *
1b8f0 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72  * value.  */.  r
1b900 63 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  c = pPKey2->defa
1b910 75 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f  ult_rc;..debugCo
1b920 6d 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20  mpareEnd:.  if( 
1b930 64 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30  desiredResult==0
1b940 20 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75   && rc==0 ) retu
1b950 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1b960 72 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72  redResult<0 && r
1b970 63 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c<0 ) return 1;.
1b980 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1b990 75 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20  ult>0 && rc>0 ) 
1b9a0 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
1b9b0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1b9c0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65  urn 1;.  if( pKe
1b9d0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
1b9e0 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
1b9f0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
1ba00 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1ba10 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1ba20 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1ba30 72 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b  r of fields (a.k
1ba40 2e 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20  .a. columns) in 
1ba50 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
1ba60 20 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79   by.** pKey,nKey
1ba70 2e 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68  .  The verify th
1ba80 61 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73  at this count is
1ba90 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
1baa0 75 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69  ual to the.** li
1bab0 6d 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65  mit given by pKe
1bac0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
1bad0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1bae0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  d..**.** If this
1baf0 20 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e   constraint is n
1bb00 6f 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74  ot satisfied, it
1bb10 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1bb20 68 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64  high-speed.** vd
1bb30 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49  beRecordCompareI
1bb40 6e 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63  nt() and vdbeRec
1bb50 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
1bb60 28 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c  () routines will
1bb70 0a 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72  .** not work cor
1bb80 72 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73  rectly.  If this
1bb90 20 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66   assert() ever f
1bba0 69 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c  ires, it probabl
1bbb0 79 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20  y means.** that 
1bbc0 74 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65  the KeyInfo.nFie
1bbd0 6c 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58  ld or KeyInfo.nX
1bbe0 46 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72  Field values wer
1bbf0 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e  e computed.** in
1bc00 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74  correctly..*/.st
1bc10 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73  atic void vdbeAs
1bc20 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1bc30 74 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e  thinLimits(.  in
1bc40 74 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f  t nKey, const vo
1bc50 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54  id *pKey,   /* T
1bc60 68 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72  he record to ver
1bc70 69 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20  ify */ .  const 
1bc80 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1bc90 6f 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61  o       /* Compa
1bca0 72 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69  re size with thi
1bcb0 73 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a  s KeyInfo */.){.
1bcc0 20 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30    int nField = 0
1bcd0 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20  ;.  u32 szHdr;. 
1bce0 20 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20   u32 idx;.  u32 
1bcf0 6e 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74  notUsed;.  const
1bd00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1bd10 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e  aKey = (const un
1bd20 73 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65  signed char*)pKe
1bd30 79 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50  y;..  if( CORRUP
1bd40 54 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  T_DB ) return;. 
1bd50 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
1bd60 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
1bd70 0a 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e  .  assert( nKey>
1bd80 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1bd90 73 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79  szHdr<=(u32)nKey
1bda0 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78   );.  while( idx
1bdb0 3c 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64  <szHdr ){.    id
1bdc0 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32  x += getVarint32
1bdd0 28 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73  (aKey+idx, notUs
1bde0 65 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b  ed);.    nField+
1bdf0 2b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  +;.  }.  assert(
1be00 20 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49   nField <= pKeyI
1be10 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79  nfo->nField+pKey
1be20 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b  Info->nXField );
1be30 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
1be40 65 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c  e vdbeAssertFiel
1be50 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
1be60 74 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66  ts(A,B,C).#endif
1be70 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d  ../*.** Both *pM
1be80 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63  em1 and *pMem2 c
1be90 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61  ontain string va
1bea0 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68  lues. Compare th
1beb0 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20  e two values.** 
1bec0 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74  using the collat
1bed0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f  ion sequence pCo
1bee0 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65  ll. As usual, re
1bef0 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20  turn a negative 
1bf00 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73  , zero.** or pos
1bf10 69 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a  itive value if *
1bf20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1bf30 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20  an, equal to or 
1bf40 67 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a  greater than .**
1bf50 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74   *pMem2, respect
1bf60 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69  ively. Similar i
1bf70 6e 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20  n spirit to "rc 
1bf80 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70  = (*pMem1) - (*p
1bf90 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74  Mem2);"..*/.stat
1bfa0 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61  ic int vdbeCompa
1bfb0 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63  reMemString(.  c
1bfc0 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1bfd0 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  .  const Mem *pM
1bfe0 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c  em2,.  const Col
1bff0 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75  lSeq *pColl,.  u
1c000 38 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20  8 *prcErr       
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c020 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75  * If an OOM occu
1c030 72 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54  rs, set to SQLIT
1c040 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20  E_NOMEM */.){.  
1c050 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d  if( pMem1->enc==
1c060 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
1c070 20 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73    /* The strings
1c080 20 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20   are already in 
1c090 74 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f  the correct enco
1c0a0 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a  ding.  Call the.
1c0b0 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73       ** comparis
1c0c0 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65  on function dire
1c0d0 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75  ctly */.    retu
1c0e0 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70  rn pColl->xCmp(p
1c0f0 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d  Coll->pUser,pMem
1c100 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d  1->n,pMem1->z,pM
1c110 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29  em2->n,pMem2->z)
1c120 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c130 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74  nt rc;.    const
1c140 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a   void *v1, *v2;.
1c150 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a      int n1, n2;.
1c160 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20      Mem c1;.    
1c170 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69  Mem c2;.    sqli
1c180 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1c190 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c1, pMem1->db, M
1c1a0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1c1b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
1c1c0 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c  (&c2, pMem1->db,
1c1d0 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20   MEM_Null);.    
1c1e0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68  sqlite3VdbeMemSh
1c1f0 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70  allowCopy(&c1, p
1c200 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29  Mem1, MEM_Ephem)
1c210 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1c220 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1c230 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f  &c2, pMem2, MEM_
1c240 45 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d  Ephem);.    v1 =
1c250 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1c260 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1c270 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c1, pColl->en
1c280 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d  c);.    n1 = v1=
1c290 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20  =0 ? 0 : c1.n;. 
1c2a0 20 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56     v2 = sqlite3V
1c2b0 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65  alueText((sqlite
1c2c0 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43  3_value*)&c2, pC
1c2d0 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e  oll->enc);.    n
1c2e0 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20  2 = v2==0 ? 0 : 
1c2f0 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70  c2.n;.    rc = p
1c300 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c  Coll->xCmp(pColl
1c310 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c  ->pUser, n1, v1,
1c320 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 73 71   n2, v2);.    sq
1c330 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1c340 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1c350 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1c360 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 69 66  ase(&c2);.    if
1c370 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d  ( (v1==0 || v2==
1c380 30 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a  0) && prcErr ) *
1c390 70 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f  prcErr = SQLITE_
1c3a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65 74 75 72  NOMEM;.    retur
1c3b0 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  n rc;.  }.}../*.
1c3c0 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62  ** Compare two b
1c3d0 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65  lobs.  Return ne
1c3e0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1c3f0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1c400 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73   first.** is les
1c410 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1c420 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  , or greater tha
1c430 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65  n the second, re
1c440 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49  spectively..** I
1c450 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20  f one blob is a 
1c460 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74  prefix of the ot
1c470 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68  her, then the sh
1c480 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65 73  orter is the les
1c490 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  sor..*/.static S
1c4a0 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69  QLITE_NOINLINE i
1c4b0 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  nt sqlite3BlobCo
1c4c0 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20  mpare(const Mem 
1c4d0 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20  *pB1, const Mem 
1c4e0 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d  *pB2){.  int c =
1c4f0 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20   memcmp(pB1->z, 
1c500 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70  pB2->z, pB1->n>p
1c510 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a  B2->n ? pB2->n :
1c520 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20   pB1->n);.  if( 
1c530 63 20 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20  c ) return c;.  
1c540 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20  return pB1->n - 
1c550 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pB2->n;.}../*.**
1c560 20 44 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e   Do a comparison
1c570 20 62 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69   between a 64-bi
1c580 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
1c590 20 61 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c   and a 64-bit fl
1c5a0 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20  oating-point.** 
1c5b0 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20  number.  Return 
1c5c0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
1c5d0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74  or positive if t
1c5e0 68 65 20 66 69 72 73 74 20 28 69 36 34 29 20 69  he first (i64) i
1c5f0 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20  s less than,.** 
1c600 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65  equal to, or gre
1c610 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 73 65  ater than the se
1c620 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a  cond (double)..*
1c630 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
1c640 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1c650 61 72 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c  are(i64 i, doubl
1c660 65 20 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65  e r){.  if( size
1c670 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59  of(LONGDOUBLE_TY
1c680 50 45 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e  PE)>8 ){.    LON
1c690 47 44 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d  GDOUBLE_TYPE x =
1c6a0 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50   (LONGDOUBLE_TYP
1c6b0 45 29 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72  E)i;.    if( x<r
1c6c0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1c6d0 20 20 69 66 28 20 78 3e 72 20 29 20 72 65 74 75    if( x>r ) retu
1c6e0 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72  rn +1;.    retur
1c6f0 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  n 0;.  }else{.  
1c700 20 20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75    i64 y;.    dou
1c710 62 6c 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72  ble s;.    if( r
1c720 3c 2d 39 32 32 33 33 37 32 30 33 36 38 35 34 37  <-92233720368547
1c730 37 35 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e  75808.0 ) return
1c740 20 2b 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39   +1;.    if( r>9
1c750 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1c760 30 37 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31  07.0 ) return -1
1c770 3b 0a 20 20 20 20 79 20 3d 20 28 69 36 34 29 72  ;.    y = (i64)r
1c780 3b 0a 20 20 20 20 69 66 28 20 69 3c 79 20 29 20  ;.    if( i<y ) 
1c790 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1c7a0 66 28 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20  f( i>y ){.      
1c7b0 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f  if( y==SMALLEST_
1c7c0 49 4e 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29  INT64 && r>0.0 )
1c7d0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c7e0 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20    return +1;.   
1c7f0 20 7d 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62   }.    s = (doub
1c800 6c 65 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c  le)i;.    if( s<
1c810 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1c820 20 20 20 69 66 28 20 73 3e 72 20 29 20 72 65 74     if( s>r ) ret
1c830 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75  urn +1;.    retu
1c840 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
1c850 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76  ** Compare the v
1c860 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  alues contained 
1c870 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72  by the two memor
1c880 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69  y cells, returni
1c890 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20  ng.** negative, 
1c8a0 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65  zero or positive
1c8b0 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73   if pMem1 is les
1c8c0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1c8d0 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20  , or greater.** 
1c8e0 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74  than pMem2. Sort
1c8f0 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c  ing order is NUL
1c900 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f  L's first, follo
1c910 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28  wed by numbers (
1c920 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20  integers.** and 
1c930 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75  reals) sorted nu
1c940 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f  merically, follo
1c950 77 65 64 20 62 79 20 74 65 78 74 20 6f 72 64 65  wed by text orde
1c960 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61  red by the colla
1c970 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65  ting.** sequence
1c980 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c   pColl and final
1c990 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65  ly blob's ordere
1c9a0 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a  d by memcmp()..*
1c9b0 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61  *.** Two NULL va
1c9c0 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
1c9d0 72 65 64 20 65 71 75 61 6c 20 62 79 20 74 68 69  red equal by thi
1c9e0 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
1c9f0 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d  nt sqlite3MemCom
1ca00 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a  pare(const Mem *
1ca10 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d  pMem1, const Mem
1ca20 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43   *pMem2, const C
1ca30 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a  ollSeq *pColl){.
1ca40 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20    int f1, f2;.  
1ca50 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  int combined_fla
1ca60 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d  gs;..  f1 = pMem
1ca70 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d  1->flags;.  f2 =
1ca80 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20   pMem2->flags;. 
1ca90 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20   combined_flags 
1caa0 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72  = f1|f2;.  asser
1cab0 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  t( (combined_fla
1cac0 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29  gs & MEM_RowSet)
1cad0 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66  ==0 );. .  /* If
1cae0 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55   one value is NU
1caf0 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74  LL, it is less t
1cb00 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49  han the other. I
1cb10 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20  f both values.  
1cb20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74  ** are NULL, ret
1cb30 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66  urn 0..  */.  if
1cb40 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1cb50 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20  &MEM_Null ){.   
1cb60 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f   return (f2&MEM_
1cb70 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f  Null) - (f1&MEM_
1cb80 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  Null);.  }..  /*
1cb90 20 41 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66   At least one of
1cba0 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20   the two values 
1cbb0 69 73 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f  is a number.  */
1cbc0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1cbd0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1cbe0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1cbf0 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20 4d  if( (f1 & f2 & M
1cc00 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20  EM_Int)!=0 ){.  
1cc10 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75      if( pMem1->u
1cc20 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20  .i < pMem2->u.i 
1cc30 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1cc40 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e     if( pMem1->u.
1cc50 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29  i > pMem2->u.i )
1cc60 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1cc70 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
1cc80 7d 0a 20 20 20 20 69 66 28 20 28 66 31 20 26 20  }.    if( (f1 & 
1cc90 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d  f2 & MEM_Real)!=
1cca0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
1ccb0 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d  Mem1->u.r < pMem
1ccc0 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20  2->u.r ) return 
1ccd0 2d 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  -1;.      if( pM
1cce0 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32  em1->u.r > pMem2
1ccf0 2d 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b  ->u.r ) return +
1cd00 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  1;.      return 
1cd10 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
1cd20 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f1&MEM_Int)!=0
1cd30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66   ){.      if( (f
1cd40 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  2&MEM_Real)!=0 )
1cd50 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1cd60 20 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74   sqlite3IntFloat
1cd70 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75  Compare(pMem1->u
1cd80 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b  .i, pMem2->u.r);
1cd90 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1cda0 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b        return -1;
1cdb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1cdc0 20 20 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52     if( (f1&MEM_R
1cdd0 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  eal)!=0 ){.     
1cde0 20 69 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74   if( (f2&MEM_Int
1cdf0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
1ce00 72 65 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49  return -sqlite3I
1ce10 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70  ntFloatCompare(p
1ce20 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31  Mem2->u.i, pMem1
1ce30 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
1ce40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74  lse{.        ret
1ce50 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  urn -1;.      }.
1ce60 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1ce70 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   +1;.  }..  /* I
1ce80 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61  f one value is a
1ce90 20 73 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20   string and the 
1cea0 6f 74 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c  other is a blob,
1ceb0 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c   the string is l
1cec0 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74  ess..  ** If bot
1ced0 68 20 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63  h are strings, c
1cee0 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 74 68 65  ompare using the
1cef0 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
1cf00 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ions..  */.  if(
1cf10 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26   combined_flags&
1cf20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69  MEM_Str ){.    i
1cf30 66 28 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72  f( (f1 & MEM_Str
1cf40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1cf50 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
1cf60 20 20 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f    if( (f2 & MEM_
1cf70 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1cf80 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1cf90 7d 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  }..    assert( p
1cfa0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32  Mem1->enc==pMem2
1cfb0 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e  ->enc || pMem1->
1cfc0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1cfd0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1cfe0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1cff0 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1d000 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1d010 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1d020 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1d030 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1d040 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1d050 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1d060 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1d070 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1d080 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1d090 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1d0a0 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1d0b0 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1d0c0 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
1d0d0 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
1d0e0 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
1d0f0 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
1d100 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
1d110 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
1d120 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
1d130 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1d140 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1d150 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1d160 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
1d170 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
1d180 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
1d190 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
1d1a0 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
1d1b0 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
1d1c0 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
1d1d0 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
1d1e0 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
1d1f0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
1d200 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
1d210 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
1d220 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
1d230 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
1d240 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
1d250 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
1d260 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
1d270 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1d280 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1d290 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1d2a0 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
1d2b0 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1d2c0 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
1d2d0 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
1d2e0 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
1d2f0 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
1d300 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
1d310 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1d320 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
1d330 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
1d340 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
1d350 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
1d360 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
1d370 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1d380 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
1d390 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
1d3a0 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
1d3b0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
1d3c0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
1d3d0 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
1d3e0 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
1d3f0 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1d400 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
1d410 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
1d420 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
1d430 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
1d440 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1d450 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
1d460 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
1d470 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1d480 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1d490 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
1d4a0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1d4b0 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
1d4c0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1d4d0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1d4e0 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
1d4f0 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1d500 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
1d510 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d520 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d530 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1d540 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1d550 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
1d560 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1d570 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
1d580 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1d590 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
1d5a0 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
1d5b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1d5c0 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
1d5d0 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1d5e0 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1d5f0 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
1d600 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1d610 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1d620 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d630 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1d640 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
1d650 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1d660 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1d670 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1d680 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
1d690 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
1d6a0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
1d6b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d6c0 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
1d6d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1d6e0 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
1d6f0 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
1d700 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1d710 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
1d720 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
1d730 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
1d740 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
1d750 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
1d760 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
1d770 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
1d780 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1d790 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
1d7a0 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1d7b0 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
1d7c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
1d7d0 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
1d7e0 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
1d7f0 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
1d800 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
1d810 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1d820 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
1d830 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
1d840 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
1d850 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
1d860 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
1d870 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
1d880 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1d890 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
1d8a0 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
1d8b0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1d8c0 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1d8d0 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
1d8e0 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1d8f0 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1d900 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1d910 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
1d920 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
1d930 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1d940 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
1d950 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
1d960 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
1d970 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
1d980 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
1d990 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1d9a0 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
1d9b0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
1d9c0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1d9d0 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
1d9e0 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
1d9f0 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
1da00 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
1da10 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
1da20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
1da30 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
1da40 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
1da50 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1da60 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
1da70 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1da80 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
1da90 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
1daa0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
1dab0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1dac0 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
1dad0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1dae0 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
1daf0 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1db00 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1db10 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1db20 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1db30 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1db40 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1db50 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1db60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db70 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1db80 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1db90 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1dba0 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dbc0 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1dbd0 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1dbe0 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1dbf0 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dc10 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
1dc20 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
1dc30 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1dc40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc50 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1dc60 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
1dc70 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
1dc80 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
1dc90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1dca0 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
1dcb0 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
1dcc0 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1dcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dce0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1dcf0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
1dd00 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
1dd10 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1dd20 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
1dd30 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
1dd40 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1dd50 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1dd60 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
1dd70 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1dd80 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1dd90 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1dda0 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1ddb0 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
1ddc0 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
1ddd0 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1dde0 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
1ddf0 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
1de00 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1de10 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1de20 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
1de30 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
1de40 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
1de50 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
1de60 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
1de70 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
1de80 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
1de90 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
1dea0 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
1deb0 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
1dec0 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
1ded0 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
1dee0 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
1def0 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
1df00 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1df10 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
1df20 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
1df30 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
1df40 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1df50 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
1df60 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
1df70 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
1df80 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
1df90 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1dfa0 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1dfb0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1dfc0 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1dfd0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1dfe0 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
1dff0 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28    }..  VVA_ONLY(
1e000 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1e010 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1e020 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1e030 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1e040 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e050 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1e060 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1e070 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1e080 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1e090 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1e0a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1e0b0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e0c0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1e0d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1e0e0 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1e0f0 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1e100 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1e110 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1e120 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1e130 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1e140 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1e150 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1e160 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1e170 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1e180 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1e190 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1e1a0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1e1b0 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1e1c0 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1e1d0 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20  type>=10 ){.    
1e1e0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1e1f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1e200 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1e210 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1e220 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e230 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1e240 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1e250 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1e260 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1e270 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1e280 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71          rc = -sq
1e290 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1e2a0 70 61 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20  pare(pRhs->u.i, 
1e2b0 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20  mem1.u.r);.     
1e2c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e2d0 69 36 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65  i64 lhs = vdbeRe
1e2e0 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65  cordDecodeInt(se
1e2f0 72 69 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79  rial_type, &aKey
1e300 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  1[d1]);.        
1e310 69 36 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e  i64 rhs = pRhs->
1e320 75 2e 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  u.i;.        if(
1e330 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20   lhs<rhs ){.    
1e340 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1e350 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1e360 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20   lhs>rhs ){.    
1e370 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1e380 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e390 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1e3a0 48 53 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20  HS is real */.  
1e3b0 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d    else if( pRhs-
1e3c0 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61  >flags & MEM_Rea
1e3d0 6c 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61  l ){.      seria
1e3e0 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69  l_type = aKey1[i
1e3f0 64 78 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  dx1];.      if( 
1e400 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20  serial_type>=10 
1e410 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65  ){.        /* Se
1e420 72 69 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72  rial types 12 or
1e430 20 67 72 65 61 74 65 72 20 61 72 65 20 73 74 72   greater are str
1e440 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28  ings and blobs (
1e450 67 72 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20  greater than.   
1e460 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29       ** numbers)
1e470 2e 20 54 79 70 65 73 20 31 30 20 61 6e 64 20 31  . Types 10 and 1
1e480 31 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  1 are currently 
1e490 22 72 65 73 65 72 76 65 64 20 66 6f 72 20 66 75  "reserved for fu
1e4a0 74 75 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a  ture .        **
1e4b0 20 75 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65   use", so it doe
1e4c0 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74  sn't really matt
1e4d0 65 72 20 77 68 61 74 20 74 68 65 20 72 65 73 75  er what the resu
1e4e0 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67  lts of comparing
1e4f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d  .        ** them
1e500 20 74 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c   to numberic val
1e510 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20  ues are.  */.   
1e520 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1e530 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1e540 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a  rial_type==0 ){.
1e550 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1e560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e570 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1e580 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1e590 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1e5a0 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1e5b0 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1e5c0 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1e5d0 20 20 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72      if( mem1.u.r
1e5e0 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20  <pRhs->u.r ){.  
1e5f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d            rc = -
1e600 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  1;.          }el
1e610 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e  se if( mem1.u.r>
1e620 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20  pRhs->u.r ){.   
1e630 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1e640 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e650 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e660 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1e670 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1e680 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68  re(mem1.u.i, pRh
1e690 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20  s->u.r);.       
1e6a0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1e6b0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1e6c0 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20  a string */.    
1e6d0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1e6e0 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29  lags & MEM_Str )
1e6f0 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1e700 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1e710 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1e720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e730 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1e740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1e750 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1e760 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1e770 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e780 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1e790 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1e7a0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1e7b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d  }else{.        m
1e7c0 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f  em1.n = (serial_
1e7d0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1e7e0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1e7f0 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28  ( (d1+mem1.n)==(
1e800 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1e810 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1e820 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31  se( (d1+mem1.n+1
1e830 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  )==(unsigned)nKe
1e840 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  y1 );.        if
1e850 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20  ( (d1+mem1.n) > 
1e860 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1e870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  ){.          pPK
1e880 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1e890 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1e8a0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1e8b0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20    return 0;     
1e8c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1e8d0 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1e8e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b      }else if( pK
1e8f0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1e900 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
1e910 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1e920 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  o->enc;.        
1e930 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79    mem1.db = pKey
1e940 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20  Info->db;.      
1e950 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d      mem1.flags =
1e960 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20   MEM_Str;.      
1e970 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68      mem1.z = (ch
1e980 61 72 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a  ar*)&aKey1[d1];.
1e990 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76            rc = v
1e9a0 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72  dbeCompareMemStr
1e9b0 69 6e 67 28 0a 20 20 20 20 20 20 20 20 20 20 20  ing(.           
1e9c0 20 20 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20     &mem1, pRhs, 
1e9d0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1e9e0 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72  i], &pPKey2->err
1e9f0 43 6f 64 65 0a 20 20 20 20 20 20 20 20 20 20 29  Code.          )
1ea00 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1ea10 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e  .          int n
1ea20 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e  Cmp = MIN(mem1.n
1ea30 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1ea40 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1ea50 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1ea60 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1ea70 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ea80 30 20 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20  0 ) rc = mem1.n 
1ea90 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20  - pRhs->n; .    
1eaa0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1eab0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1eac0 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20  is a blob */.   
1ead0 20 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e   else if( pRhs->
1eae0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1eaf0 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72   ){.      getVar
1eb00 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78  int32(&aKey1[idx
1eb10 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29  1], serial_type)
1eb20 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1eb30 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31  ( serial_type==1
1eb40 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  2 );.      if( s
1eb50 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c  erial_type<12 ||
1eb60 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20   (serial_type & 
1eb70 30 78 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20  0x01) ){.       
1eb80 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1eb90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
1eba0 6e 74 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61  nt nStr = (seria
1ebb0 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32  l_type - 12) / 2
1ebc0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1ebd0 73 65 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28  se( (d1+nStr)==(
1ebe0 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1ebf0 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
1ec00 73 65 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d  se( (d1+nStr+1)=
1ec10 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1ec20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1ec30 28 64 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73  (d1+nStr) > (uns
1ec40 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1ec50 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1ec60 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1ec70 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1ec80 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1ec90 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1eca0 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1ecb0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1ecc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1ecd0 20 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28   int nCmp = MIN(
1ece0 6e 53 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a  nStr, pRhs->n);.
1ecf0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d            rc = m
1ed00 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d  emcmp(&aKey1[d1]
1ed10 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29  , pRhs->z, nCmp)
1ed20 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1ed30 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74  rc==0 ) rc = nSt
1ed40 72 20 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20  r - pRhs->n;.   
1ed50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ed60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1ed70 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20   is null */.    
1ed80 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69  else{.      seri
1ed90 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1eda0 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20  idx1];.      rc 
1edb0 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  = (serial_type!=
1edc0 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  0);.    }..    i
1edd0 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1ede0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1edf0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1ee00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1ee10 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
1ee20 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1ee30 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1ee40 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1ee50 4b 65 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20  Key2, rc) );.   
1ee60 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e     assert( mem1.
1ee70 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20  szMalloc==0 );  
1ee80 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62  /* See comment b
1ee90 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65  elow */.      re
1eea0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
1eeb0 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68      i++;.    pRh
1eec0 73 2b 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73  s++;.    d1 += s
1eed0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1eee0 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74  TypeLen(serial_t
1eef0 79 70 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b  ype);.    idx1 +
1ef00 3d 20 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c  = sqlite3VarintL
1ef10 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b  en(serial_type);
1ef20 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1ef30 28 75 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31  (unsigned)szHdr1
1ef40 20 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46   && i<pPKey2->nF
1ef50 69 65 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73  ield && d1<=(uns
1ef60 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a  igned)nKey1 );..
1ef70 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61    /* No memory a
1ef80 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65  llocation is eve
1ef90 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20  r used on mem1. 
1efa0 20 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e   Prove this usin
1efb0 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f  g.  ** the follo
1efc0 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20  wing assert().  
1efd0 49 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20  If the assert() 
1efe0 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61  fails, it indica
1eff0 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72  tes a.  ** memor
1f000 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65  y leak and a nee
1f010 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  d to call sqlite
1f020 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1f030 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73  &mem1).  */.  as
1f040 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1f050 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1f060 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1f070 20 74 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74   that one or bot
1f080 68 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  h of the keys ra
1f090 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1f0a0 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1f0b0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1f0c0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1f0d0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1f0e0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1f0f0 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73  value.  */.  ass
1f100 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20  ert( CORRUPT_DB 
1f110 0a 20 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52  .       || vdbeR
1f120 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
1f130 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
1f140 70 50 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e  pPKey2, pPKey2->
1f150 64 65 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20  default_rc) .   
1f160 20 20 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d      || pKeyInfo-
1f170 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
1f180 64 0a 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d  d.  );.  pPKey2-
1f190 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72  >eqSeen = 1;.  r
1f1a0 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1f1b0 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20  fault_rc;.}.int 
1f1c0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1f1d0 64 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20  dCompare(.  int 
1f1e0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1f1f0 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1f200 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1f210 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1f220 65 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2          /* 
1f230 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a  Right key */.){.
1f240 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1f250 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1f260 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1f270 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1f280 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
1f290 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1f2a0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1f2b0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1f2c0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1f2d0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1f2e0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1f2f0 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
1f300 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
1f310 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
1f320 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
1f330 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1f340 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1f350 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
1f360 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
1f370 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
1f380 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
1f390 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
1f3a0 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
1f3b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
1f3c0 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
1f3d0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
1f3e0 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
1f3f0 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
1f400 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
1f410 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1f420 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1f430 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1f440 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1f450 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1f460 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1f470 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1f480 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1f490 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1f4a0 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
1f4b0 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
1f4c0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
1f4d0 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
1f4e0 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
1f4f0 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
1f500 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
1f510 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
1f520 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d   i64 v = pPKey2-
1f530 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
1f540 69 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65  i64 lhs;..  vdbe
1f550 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1f560 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
1f570 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1f580 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
1f590 61 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70  assert( (*(u8*)p
1f5a0 4b 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43  Key1)<=0x3F || C
1f5b0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73  ORRUPT_DB );.  s
1f5c0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
1f5d0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
1f5e0 3a 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69  : { /* 1-byte si
1f5f0 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1f600 20 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f        lhs = ONE_
1f610 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1f620 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f630 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f640 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f650 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62  case 2: { /* 2-b
1f660 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f670 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f680 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  = TWO_BYTE_INT(a
1f690 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
1f6a0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1f6b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f6c0 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20  }.    case 3: { 
1f6d0 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 3-byte signed
1f6e0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1f6f0 20 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59    lhs = THREE_BY
1f700 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f710 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1f720 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1f730 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f740 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74  se 4: { /* 4-byt
1f750 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1f760 20 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f   */.      y = FO
1f770 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f780 79 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20  y);.      lhs = 
1f790 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1f7a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7b0 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62  lhs<0 );.      b
1f7c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1f7d0 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1f7e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1f7f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
1f800 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1f810 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36  (aKey+2) + (((i6
1f820 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1f830 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f840 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1f850 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1f860 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f870 73 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74  se 6: { /* 8-byt
1f880 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1f890 20 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f   */.      x = FO
1f8a0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1f8b0 79 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78  y);.      x = (x
1f8c0 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1f8d0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1f8e0 20 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36        lhs = *(i6
1f8f0 34 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73  4*)&x;.      tes
1f900 74 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a  tcase( lhs<0 );.
1f910 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1f920 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a   }.    case 8: .
1f930 20 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20        lhs = 0;. 
1f940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1f950 63 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68  case 9:.      lh
1f960 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  s = 1;.      bre
1f970 61 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73  ak;..    /* This
1f980 20 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72   case could be r
1f990 65 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63  emoved without c
1f9a0 68 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75  hanging the resu
1f9b0 6c 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20  lts of running. 
1f9c0 20 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e     ** this code.
1f9d0 20 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61   Including it ca
1f9e0 75 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65  uses gcc to gene
1f9f0 72 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77  rate a faster sw
1fa00 69 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61  itch .    ** sta
1fa10 74 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68  tement (since th
1fa20 65 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63  e range of switc
1fa30 68 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74  h targets now st
1fa40 61 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64  arts at zero and
1fa50 0a 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69  .    ** is conti
1fa60 67 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20  guous) but does 
1fa70 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75  not cause any du
1fa80 70 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20  plicate code to 
1fa90 62 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20  be generated.   
1faa0 20 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63   ** (as gcc is c
1fab0 6c 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20  lever enough to 
1fac0 63 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20  combine the two 
1fad0 6c 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68  like cases). Oth
1fae0 65 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69  er .    ** compi
1faf0 6c 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69  lers might be si
1fb00 6d 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20  milar.  */ .    
1fb10 63 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a  case 0: case 7:.
1fb20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1fb30 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1fb40 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65  mpare(nKey1, pKe
1fb50 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20  y1, pPKey2);..  
1fb60 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
1fb70 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1fb80 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fb90 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1fba0 50 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69  PKey2);.  }..  i
1fbb0 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20  f( v>lhs ){.    
1fbc0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
1fbd0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c  ;.  }else if( v<
1fbe0 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d  lhs ){.    res =
1fbf0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d   pPKey2->r2;.  }
1fc00 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d  else if( pPKey2-
1fc10 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20  >nField>1 ){.   
1fc20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69   /* The first fi
1fc30 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20  elds of the two 
1fc40 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1fc50 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69  Compare the trai
1fc60 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65  ling .    ** fie
1fc70 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73  lds.  */.    res
1fc80 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1fc90 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53  cordCompareWithS
1fca0 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  kip(nKey1, pKey1
1fcb0 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20  , pPKey2, 1);.  
1fcc0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1fcd0 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f  e first fields o
1fce0 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61  f the two keys a
1fcf0 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65  re equal and the
1fd00 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69  re are no traili
1fd10 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  ng.    ** fields
1fd20 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d  . Return pPKey2-
1fd30 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74  >default_rc in t
1fd40 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20  his case. */.   
1fd50 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64   res = pPKey2->d
1fd60 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70  efault_rc;.    p
1fd70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
1fd80 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  1;.  }..  assert
1fd90 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1fda0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1fdb0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1fdc0 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  es) );.  return 
1fdd0 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  res;.}../*.** Th
1fde0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1fdf0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1fe00 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1fe10 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1fe20 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1fe30 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1fe40 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73 74  f pPKey2 is a st
1fe50 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74  ring, that (b) t
1fe60 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a  he first field.*
1fe70 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  * uses the colla
1fe80 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
1fe90 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68 61  NARY and (c) tha
1fea0 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65  t the size-of-he
1feb0 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20  ader varint .** 
1fec0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
1fed0 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69  (pKey1/nKey1) fi
1fee0 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1fef0 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  yte..*/.static i
1ff00 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  nt vdbeRecordCom
1ff10 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e  pareString(.  in
1ff20 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1ff30 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c  oid *pKey1, /* L
1ff40 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1ff50 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1ff60 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69  ey2        /* Ri
1ff70 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1ff80 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20  const u8 *aKey1 
1ff90 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65  = (const u8*)pKe
1ffa0 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  y1;.  int serial
1ffb0 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73  _type;.  int res
1ffc0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  ;..  assert( pPK
1ffd0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61  ey2->aMem[0].fla
1ffe0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a  gs & MEM_Str );.
1fff0 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
20000 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
20010 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
20020 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20030 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33  o);.  getVarint3
20040 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72  2(&aKey1[1], ser
20050 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28  ial_type);.  if(
20060 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20   serial_type<12 
20070 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
20080 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a  ey2->r1;      /*
20090 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69   (pKey1/nKey1) i
200a0 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20  s a number or a 
200b0 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  null */.  }else 
200c0 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70  if( !(serial_typ
200d0 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20  e & 0x01) ){ .  
200e0 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
200f0 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65  r2;      /* (pKe
20100 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62  y1/nKey1) is a b
20110 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  lob */.  }else{.
20120 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20      int nCmp;.  
20130 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20    int nStr;.    
20140 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79  int szHdr = aKey
20150 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20  1[0];..    nStr 
20160 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31  = (serial_type-1
20170 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20  2) / 2;.    if( 
20180 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e  (szHdr + nStr) >
20190 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20   nKey1 ){.      
201a0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
201b0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
201c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
201d0 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a   return 0;    /*
201e0 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
201f0 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20     }.    nCmp = 
20200 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65  MIN( pPKey2->aMe
20210 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a  m[0].n, nStr );.
20220 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70      res = memcmp
20230 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20  (&aKey1[szHdr], 
20240 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
20250 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69  z, nCmp);..    i
20260 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
20270 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20     res = nStr - 
20280 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e  pPKey2->aMem[0].
20290 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 73  n;.      if( res
202a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
202b0 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  f( pPKey2->nFiel
202c0 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
202d0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64   res = sqlite3Vd
202e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
202f0 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
20300 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29  Key1, pPKey2, 1)
20310 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
20320 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
20330 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
20340 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _rc;.          p
20350 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20  PKey2->eqSeen = 
20360 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
20370 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
20380 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  >0 ){.        re
20390 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a  s = pPKey2->r2;.
203a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
203b0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
203c0 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20  2->r1;.      }. 
203d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
203e0 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  >0 ){.      res 
203f0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
20400 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20410 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
20420 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
20430 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
20440 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
20450 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20460 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c  2, res).       |
20470 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20  | CORRUPT_DB.   
20480 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70      || pPKey2->p
20490 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c  KeyInfo->db->mal
204a0 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20  locFailed.  );. 
204b0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
204c0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
204d0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
204e0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
204f0 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62  mpare() compatib
20500 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73  le function.** s
20510 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70  uitable for comp
20520 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64  aring serialized
20530 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20   records to the 
20540 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20  unpacked record 
20550 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65  passed.** as the
20560 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a   only argument..
20570 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  */.RecordCompare
20580 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64   sqlite3VdbeFind
20590 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64  Compare(Unpacked
205a0 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a  Record *p){.  /*
205b0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
205c0 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61  pareInt() and va
205d0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
205e0 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61  eString() both a
205f0 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20  ssume.  ** that 
20600 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
20610 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f  er varint that o
20620 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74 61  ccurs at the sta
20630 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72  rt of each recor
20640 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61  d.  ** fits in a
20650 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e   single byte (i.
20660 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73  e. is 127 or les
20670 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64  s). varintRecord
20680 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a  CompareInt().  *
20690 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74  * also assumes t
206a0 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20 74  hat it is safe t
206b0 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75 66  o overread a buf
206c0 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74 20  fer by at least 
206d0 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75  the .  ** maximu
206e0 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c  m possible legal
206f0 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75   header size plu
20700 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75  s 8 bytes. Becau
20710 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a  se there is.  **
20720 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
20730 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28 62  e at least 74 (b
20740 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65  ut not 136) byte
20750 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c  s of padding fol
20760 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a  lowing each.  **
20770 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 74   buffer passed t
20780 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  o varintRecordCo
20790 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73 20  mpareInt() this 
207a0 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69  makes it conveni
207b0 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69  ent to.  ** limi
207c0 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  t the size of th
207d0 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20 62  e header to 64 b
207e0 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77 68  ytes in cases wh
207f0 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66 69  ere the first fi
20800 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69  eld.  ** is an i
20810 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a  nteger..  **.  *
20820 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77 61  * The easiest wa
20830 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69  y to enforce thi
20840 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f  s limit is to co
20850 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f  nsider only reco
20860 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33  rds with.  ** 13
20870 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e   fields or less.
20880 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66 69   If the first fi
20890 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65  eld is an intege
208a0 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c  r, the maximum l
208b0 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72  egal.  ** header
208c0 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b   size is (12*5 +
208d0 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20   1 + 1) bytes.  
208e0 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65  */.  if( (p->pKe
208f0 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20  yInfo->nField + 
20900 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46  p->pKeyInfo->nXF
20910 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20  ield)<=13 ){.   
20920 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e   int flags = p->
20930 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20  aMem[0].flags;. 
20940 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e     if( p->pKeyIn
20950 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  fo->aSortOrder[0
20960 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31  ] ){.      p->r1
20970 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72   = 1;.      p->r
20980 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  2 = -1;.    }els
20990 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  e{.      p->r1 =
209a0 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32   -1;.      p->r2
209b0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
209c0 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d  if( (flags & MEM
209d0 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72  _Int) ){.      r
209e0 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64  eturn vdbeRecord
209f0 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20  CompareInt;.    
20a00 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  }.    testcase( 
20a10 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c  flags & MEM_Real
20a20 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20a30 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75  ( flags & MEM_Nu
20a40 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61  ll );.    testca
20a50 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  se( flags & MEM_
20a60 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20  Blob );.    if( 
20a70 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65  (flags & (MEM_Re
20a80 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f  al|MEM_Null|MEM_
20a90 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e  Blob))==0 && p->
20aa0 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
20ab0 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  0]==0 ){.      a
20ac0 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d  ssert( flags & M
20ad0 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20  EM_Str );.      
20ae0 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
20af0 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a  dCompareString;.
20b00 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
20b10 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
20b20 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a  ecordCompare;.}.
20b30 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e  ./*.** pCur poin
20b40 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65  ts at an index e
20b50 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73 69  ntry created usi
20b60 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  ng the OP_MakeRe
20b70 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20  cord opcode..** 
20b80 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20 28  Read the rowid (
20b90 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69  the last field i
20ba0 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e  n the record) an
20bb0 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72  d store it in *r
20bc0 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  owid..** Return 
20bd0 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
20be0 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f  rything works, o
20bf0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
20c00 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a  otherwise..**.**
20c10 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20 70   pCur might be p
20c20 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20  ointing to text 
20c30 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
20c40 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65  corrupt database
20c50 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65   file..** So the
20c60 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20   content cannot 
20c70 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20  be trusted.  Do 
20c80 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65 63  appropriate chec
20c90 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ks on the conten
20ca0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
20cb0 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73 71  3VdbeIdxRowid(sq
20cc0 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72  lite3 *db, BtCur
20cd0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
20ce0 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43  rowid){.  i64 nC
20cf0 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
20d00 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64  t rc;.  u32 szHd
20d10 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a  r;        /* Siz
20d20 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
20d30 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77  */.  u32 typeRow
20d40 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c  id;    /* Serial
20d50 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77   type of the row
20d60 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52  id */.  u32 lenR
20d70 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a  owid;     /* Siz
20d80 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
20d90 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20  /.  Mem m, v;.. 
20da0 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65   /* Get the size
20db0 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
20dc0 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63  try.  Only indic
20dd0 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65  es entries of le
20de0 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69  ss.  ** than 2Gi
20df0 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20  B are support - 
20e00 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d  anything large m
20e10 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65 20  ust be database 
20e20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a  corruption..  **
20e30 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20   Any corruption 
20e40 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20 73  is detected in s
20e50 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
20e60 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67  CellPtr(), thoug
20e70 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20  h, so.  ** this 
20e80 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20  code can safely 
20e90 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c  assume that nCel
20ea0 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73 20  lKey is 32-bits 
20eb0 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28   .  */.  assert(
20ec0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
20ed0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
20ee0 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
20ef0 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
20f00 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
20f10 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
20f20 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
20f30 4f 4b 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75  OK );     /* pCu
20f40 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
20f50 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
20f60 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73  not fail */.  as
20f70 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20  sert( (nCellKey 
20f80 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32  & SQLITE_MAX_U32
20f90 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79  )==(u64)nCellKey
20fa0 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69   );..  /* Read i
20fb0 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63  n the complete c
20fc0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e  ontent of the in
20fd0 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73  dex entry */.  s
20fe0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
20ff0 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
21000 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
21010 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
21020 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
21030 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
21040 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
21050 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
21060 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72  * The index entr
21070 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74  y must begin wit
21080 68 20 61 20 68 65 61 64 65 72 20 73 69 7a 65 20  h a header size 
21090 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61  */.  (void)getVa
210a0 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c  rint32((u8*)m.z,
210b0 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63   szHdr);.  testc
210c0 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b  ase( szHdr==3 );
210d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48  .  testcase( szH
210e0 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28  dr==m.n );.  if(
210f0 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c   unlikely(szHdr<
21100 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e  3 || (int)szHdr>
21110 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  m.n) ){.    goto
21120 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
21130 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
21140 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20   The last field 
21150 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f  of the index sho
21160 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65  uld be an intege
21170 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20  r - the ROWID.. 
21180 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   ** Verify that 
21190 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72  the last entry r
211a0 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65  eally is an inte
211b0 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29  ger. */.  (void)
211c0 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
211d0 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20  )&m.z[szHdr-1], 
211e0 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65  typeRowid);.  te
211f0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21200 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61  d==1 );.  testca
21210 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32  se( typeRowid==2
21220 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
21230 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a  typeRowid==3 );.
21240 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
21250 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65  Rowid==4 );.  te
21260 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
21270 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61  d==5 );.  testca
21280 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36  se( typeRowid==6
21290 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
212a0 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a  typeRowid==8 );.
212b0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
212c0 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66  Rowid==9 );.  if
212d0 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52  ( unlikely(typeR
212e0 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f  owid<1 || typeRo
212f0 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77  wid>9 || typeRow
21300 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f  id==7) ){.    go
21310 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
21320 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c  ruption;.  }.  l
21330 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65  enRowid = sqlite
21340 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
21350 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65  typeRowid];.  te
21360 73 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e  stcase( (u32)m.n
21370 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64  ==szHdr+lenRowid
21380 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65   );.  if( unlike
21390 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64  ly((u32)m.n<szHd
213a0 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20  r+lenRowid) ){. 
213b0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
213c0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
213d0 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68  }..  /* Fetch th
213e0 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68  e integer off th
213f0 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64  e end of the ind
21400 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73  ex record */.  s
21410 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
21420 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e  Get((u8*)&m.z[m.
21430 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70  n-lenRowid], typ
21440 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a  eRowid, &v);.  *
21450 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20  rowid = v.u.i;. 
21460 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
21470 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65  elease(&m);.  re
21480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21490 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
214a0 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  if database corr
214b0 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
214c0 65 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62  ed after m has b
214d0 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  een.  ** allocat
214e0 65 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20  ed.  Free the m 
214f0 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72  object and retur
21500 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
21510 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63  . */.idx_rowid_c
21520 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73  orruption:.  tes
21530 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f  tcase( m.szMallo
21540 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c!=0 );.  sqlite
21550 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
21560 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
21570 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
21580 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  T;.}../*.** Comp
21590 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74  are the key of t
215a0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74  he index entry t
215b0 68 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73  hat cursor pC is
215c0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61   pointing to aga
215d0 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20  inst.** the key 
215e0 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63  string in pUnpac
215f0 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f  ked.  Write into
21600 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a   *pRes a number.
21610 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74  ** that is negat
21620 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
21630 73 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20  sitive if pC is 
21640 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
21650 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74   to,.** or great
21660 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65  er than pUnpacke
21670 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  d.  Return SQLIT
21680 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
21690 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64  .**.** pUnpacked
216a0 20 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74   is either creat
216b0 65 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77  ed without a row
216c0 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74  id or is truncat
216d0 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a  ed so that it.**
216e0 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64   omits the rowid
216f0 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68   at the end.  Th
21700 65 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65  e rowid at the e
21710 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
21720 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f  entry.** is igno
21730 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65  red as well.  He
21740 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  nce, this routin
21750 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20  e only compares 
21760 74 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a  the prefixes .**
21770 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69   of the keys pri
21780 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20  or to the final 
21790 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65  rowid, not the e
217a0 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  ntire key..*/.in
217b0 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78  t sqlite3VdbeIdx
217c0 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71  KeyCompare(.  sq
217d0 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
217e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
217f0 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
21800 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43  ction */.  VdbeC
21810 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20  ursor *pC,      
21820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
21830 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d  he cursor to com
21840 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a  pare against */.
21850 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
21860 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20   *pUnpacked,    
21870 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76     /* Unpacked v
21880 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f  ersion of key */
21890 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20  .  int *res     
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
218b0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
218c0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75   comparison resu
218d0 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  lt here */.){.  
218e0 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30  i64 nCellKey = 0
218f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  ;.  int rc;.  Bt
21900 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20  Cursor *pCur;.  
21910 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74  Mem m;..  assert
21920 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d  ( pC->eCurType==
21930 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
21940 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63  .  pCur = pC->uc
21950 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65  .pCursor;.  asse
21960 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  rt( sqlite3Btree
21970 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43  CursorIsValid(pC
21980 75 72 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ur) );.  VVA_ONL
21990 59 28 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42  Y(rc =) sqlite3B
219a0 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72  treeKeySize(pCur
219b0 2c 20 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  , &nCellKey);.  
219c0 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
219d0 54 45 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70  TE_OK );    /* p
219e0 43 75 72 20 69 73 20 61 6c 77 61 79 73 20 76 61  Cur is always va
219f0 6c 69 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63  lid so KeySize c
21a00 61 6e 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20  annot fail */.  
21a10 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c  /* nCellKey will
21a20 20 61 6c 77 61 79 73 20 62 65 20 62 65 74 77 65   always be betwe
21a30 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66 66 66  en 0 and 0xfffff
21a40 66 66 66 20 62 65 63 61 75 73 65 20 6f 66 20 74  fff because of t
21a50 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74  he way.  ** that
21a60 20 62 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50   btreeParseCellP
21a70 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33  tr() and sqlite3
21a80 47 65 74 56 61 72 69 6e 74 33 32 28 29 20 61 72  GetVarint32() ar
21a90 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f  e implemented */
21aa0 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c  .  if( nCellKey<
21ab0 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30  =0 || nCellKey>0
21ac0 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  x7fffffff ){.   
21ad0 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72   *res = 0;.    r
21ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
21af0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
21b00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
21b10 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
21b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
21b30 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
21b40 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
21b50 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
21b60 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21b70 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
21b80 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64  *res = sqlite3Vd
21b90 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
21ba0 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63  m.n, m.z, pUnpac
21bb0 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ked);.  sqlite3V
21bc0 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
21bd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21be0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21bf0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
21c00 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62  s the value to b
21c10 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 75  e returned by su
21c20 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
21c30 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61  o.** sqlite3_cha
21c40 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61  nges() on the da
21c50 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64  tabase handle 'd
21c60 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  b'. .*/.void sql
21c70 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67  ite3VdbeSetChang
21c80 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  es(sqlite3 *db, 
21c90 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20  int nChange){.  
21ca0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21cb0 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
21cc0 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e  utex) );.  db->n
21cd0 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65  Change = nChange
21ce0 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68  ;.  db->nTotalCh
21cf0 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b  ange += nChange;
21d00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20  .}../*.** Set a 
21d10 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64 62 65  flag in the vdbe
21d20 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20 63   to update the c
21d30 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68  hange counter wh
21d40 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73  en it is finalis
21d50 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a  ed.** or reset..
21d60 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
21d70 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28  dbeCountChanges(
21d80 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63  Vdbe *v){.  v->c
21d90 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a  hangeCntOn = 1;.
21da0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76  }../*.** Mark ev
21db0 65 72 79 20 70 72 65 70 61 72 65 64 20 73 74 61  ery prepared sta
21dc0 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65  tement associate
21dd0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
21de0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
21df0 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a  as expired..**.*
21e00 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73 74 61  * An expired sta
21e10 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61  tement means tha
21e20 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20  t recompilation 
21e30 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  of the statement
21e40 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64   is.** recommend
21e50 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78  .  Statements ex
21e60 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73  pire when things
21e70 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b   happen that mak
21e80 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72  e their.** progr
21e90 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52  ams obsolete.  R
21ea0 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66  emoving user-def
21eb0 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f  ined functions o
21ec0 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  r collating.** s
21ed0 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61  equences, or cha
21ee0 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69  nging an authori
21ef0 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  zation function 
21f00 61 72 65 20 74 68 65 20 74 79 70 65 73 20 6f 66  are the types of
21f10 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20  .** things that 
21f20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20 73 74  make prepared st
21f30 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74  atements obsolet
21f40 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
21f50 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
21f60 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74  Statements(sqlit
21f70 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
21f80 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62  *p;.  for(p = db
21f90 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d  ->pVdbe; p; p=p-
21fa0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e  >pNext){.    p->
21fb0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
21fc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
21fd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
21fe0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
21ff0 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74  e Vdbe..*/.sqlit
22000 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44  e3 *sqlite3VdbeD
22010 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65  b(Vdbe *v){.  re
22020 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f  turn v->db;.}../
22030 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
22040 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69  inter to an sqli
22050 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74  te3_value struct
22060 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ure containing t
22070 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a  he value bound.*
22080 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56 61 72  * parameter iVar
22090 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74   of VM v. Except
220a0 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 69  , if the value i
220b0 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72  s an SQL NULL, r
220c0 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74  eturn .** 0 inst
220d0 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69  ead. Unless it i
220e0 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66  s NULL, apply af
220f0 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20  finity aff (one 
22100 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46  of the SQLITE_AF
22110 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73  F_*.** constants
22120 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62  ) to the value b
22130 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
22140 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  it..**.** The re
22150 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73  turned value mus
22160 74 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68  t be freed by th
22170 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73  e caller using s
22180 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
22190 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61  )..*/.sqlite3_va
221a0 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65  lue *sqlite3Vdbe
221b0 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64  GetBoundValue(Vd
221c0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c  be *v, int iVar,
221d0 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65   u8 aff){.  asse
221e0 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20  rt( iVar>0 );.  
221f0 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d  if( v ){.    Mem
22200 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61   *pMem = &v->aVa
22210 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69  r[iVar-1];.    i
22220 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61  f( 0==(pMem->fla
22230 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29  gs & MEM_Null) )
22240 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22250 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71  value *pRet = sq
22260 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d  lite3ValueNew(v-
22270 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >db);.      if( 
22280 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20  pRet ){.        
22290 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f  sqlite3VdbeMemCo
222a0 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20  py((Mem *)pRet, 
222b0 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73  pMem);.        s
222c0 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79  qlite3ValueApply
222d0 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61  Affinity(pRet, a
222e0 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  ff, SQLITE_UTF8)
222f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22300 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20  return pRet;.   
22310 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
22320 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  0;.}../*.** Conf
22330 69 67 75 72 65 20 53 51 4c 20 76 61 72 69 61 62  igure SQL variab
22340 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61 74 20  le iVar so that 
22350 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61  binding a new va
22360 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c  lue to it signal
22370 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f  s.** to sqlite3_
22380 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61  reoptimize() tha
22390 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74  t re-preparing t
223a0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79  he statement may
223b0 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20   result.** in a 
223c0 62 65 74 74 65 72 20 71 75 65 72 79 20 70 6c 61  better query pla
223d0 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
223e0 65 33 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b  e3VdbeSetVarmask
223f0 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56  (Vdbe *v, int iV
22400 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69  ar){.  assert( i
22410 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69  Var>0 );.  if( i
22420 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d  Var>32 ){.    v-
22430 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66  >expmask = 0xfff
22440 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fffff;.  }else{.
22450 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c      v->expmask |
22460 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56  = ((u32)1 << (iV
22470 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  ar-1));.  }.}..#
22480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
22490 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
224a0 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65  /*.** Transfer e
224b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
224c0 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65  t from an sqlite
224d0 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28  3_vtab.zErrMsg (
224e0 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69  text stored.** i
224f0 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
22500 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
22510 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64  alloc) into a Vd
22520 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74  be.zErrMsg (text
22530 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65   stored.** in me
22540 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
22550 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c  om sqlite3DbMall
22560 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  oc)..*/.void sql
22570 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72  ite3VtabImportEr
22580 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71  rmsg(Vdbe *p, sq
22590 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61  lite3_vtab *pVta
225a0 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  b){.  sqlite3 *d
225b0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c  b = p->db;.  sql
225c0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
225d0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d  ->zErrMsg);.  p-
225e0 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
225f0 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
22600 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
22610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
22620 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
22630 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67    pVtab->zErrMsg
22640 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   = 0;.}.#endif /
22650 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
22660 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a        RTUALTABLE */.