/ Hex Artifact Content
Login

Artifact 66b546a1da82dfa6e67985ae0442ba5fd9efe0ff:


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 69 6e 74 20  .  int j;.  int 
2300: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2310: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50  beAddOp3(p, OP_P
2320: 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c  arseSchema, iDb,
2330: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
2340: 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c  3VdbeChangeP4(p,
2350: 20 61 64 64 72 2c 20 7a 57 68 65 72 65 2c 20 50   addr, zWhere, P
2360: 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f  4_DYNAMIC);.  fo
2370: 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e  r(j=0; j<p->db->
2380: 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65  nDb; j++) sqlite
2390: 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70  3VdbeUsesBtree(p
23a0: 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  , j);.}../*.** A
23b0: 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61  dd an opcode tha
23c0: 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70  t includes the p
23d0: 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e  4 value as an in
23e0: 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  teger..*/.int sq
23f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49  lite3VdbeAddOp4I
2400: 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  nt(.  Vdbe *p,  
2410: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
2420: 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74   the opcode to t
2430: 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20  his VM */.  int 
2440: 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  op,             
2450: 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64  /* The new opcod
2460: 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20  e */.  int p1,  
2470: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2480: 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P1 operand */.
2490: 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20    int p2,       
24a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20        /* The P2 
24b0: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
24c0: 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20   p3,            
24d0: 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61   /* The P3 opera
24e0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20  nd */.  int p4  
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2500: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73  he P4 operand as
2510: 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29   an integer */.)
2520: 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73  {.  int addr = s
2530: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
2540: 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20  (p, op, p1, p2, 
2550: 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  p3);.  sqlite3Vd
2560: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
2570: 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  dr, SQLITE_INT_T
2580: 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e  O_PTR(p4), P4_IN
2590: 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  T32);.  return a
25a0: 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  ddr;.}../*.** Cr
25b0: 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f  eate a new symbo
25c0: 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e  lic label for an
25d0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61   instruction tha
25e0: 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a  t has yet to be.
25f0: 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73  ** coded.  The s
2600: 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73  ymbolic label is
2610: 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e   really just a n
2620: 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20  egative number. 
2630: 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61   The.** label ca
2640: 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68 65  n be used as the
2650: 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20   P2 value of an 
2660: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65  operation.  Late
2670: 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c  r, when.** the l
2680: 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64  abel is resolved
2690: 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20 61   to a specific a
26a0: 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42 45  ddress, the VDBE
26b0: 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68   will scan.** th
26c0: 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61 74  rough its operat
26d0: 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61  ion list and cha
26e0: 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f  nge all values o
26f0: 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63 68  f P2 which match
2700: 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e  .** the label in
2710: 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20  to the resolved 
2720: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  address..**.** T
2730: 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68  he VDBE knows th
2740: 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69 73  at a P2 value is
2750: 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65   a label because
2760: 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61   labels are.** a
2770: 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20 61  lways negative a
2780: 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72 65  nd P2 values are
2790: 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e   suppose to be n
27a0: 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  on-negative..** 
27b0: 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76  Hence, a negativ
27c0: 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  e P2 value is a 
27d0: 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20 79  label that has y
27e0: 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65  et to be resolve
27f0: 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73  d..**.** Zero is
2800: 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d   returned if a m
2810: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a  alloc() fails..*
2820: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2830: 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20  eMakeLabel(Vdbe 
2840: 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20  *v){.  Parse *p 
2850: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
2860: 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c  nt i = p->nLabel
2870: 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  ++;.  assert( v-
2880: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2890: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28  IC_INIT );.  if(
28a0: 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20   (i & (i-1))==0 
28b0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c  ){.    p->aLabel
28c0: 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c   = sqlite3DbReal
28d0: 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c  locOrFree(p->db,
28e0: 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20   p->aLabel, .   
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65      (i*2+1)*size
2920: 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29  of(p->aLabel[0])
2930: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
2940: 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d  aLabel ){.    p-
2950: 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b  >aLabel[i] = -1;
2960: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44  .  }.  return AD
2970: 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  DR(i);.}../*.** 
2980: 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78  Resolve label "x
2990: 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64 72  " to be the addr
29a0: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20  ess of the next 
29b0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a  instruction to.*
29c0: 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20  * be inserted.  
29d0: 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22 78  The parameter "x
29e0: 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  " must have been
29f0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
2a00: 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  * a prior call t
2a10: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  o sqlite3VdbeMak
2a20: 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69  eLabel()..*/.voi
2a30: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
2a40: 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a  olveLabel(Vdbe *
2a50: 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72  v, int x){.  Par
2a60: 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73  se *p = v->pPars
2a70: 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44  e;.  int j = ADD
2a80: 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  R(x);.  assert( 
2a90: 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  v->magic==VDBE_M
2aa0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
2ab0: 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62  ssert( j<p->nLab
2ac0: 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  el );.  assert( 
2ad0: 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  j>=0 );.  if( p-
2ae0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2af0: 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d  ->aLabel[j] = v-
2b00: 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69  >nOp;.  }.  p->i
2b10: 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70  FixedOp = v->nOp
2b20: 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   - 1;.}../*.** M
2b30: 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73 20  ark the VDBE as 
2b40: 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  one that can onl
2b50: 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d  y be run one tim
2b60: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
2b70: 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63  e3VdbeRunOnlyOnc
2b80: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  e(Vdbe *p){.  p-
2b90: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31  >runOnlyOnce = 1
2ba0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2bb0: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69  TE_DEBUG /* sqli
2bc0: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2bd0: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a  t() logic */../*
2be0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2bf0: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
2c00: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
2c10: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2c20: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
2c30: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
2c40: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
2c50: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
2c60: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
2c70: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
2c80: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
2c90: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
2ca0: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
2cb0: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
2cc0: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
2cd0: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
2ce0: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
2cf0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2d00: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
2d10: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
2d40: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
2d50: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2d60: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2d70: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
2d80: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
2d90: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
2da0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2db0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2dc0: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
2dd0: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
2de0: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
2df0: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
2e00: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
2e30: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
2e40: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
2e50: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
2e60: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
2e70: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
2e80: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
2e90: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
2ea0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2eb0: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
2ec0: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
2ed0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
2ee0: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
2ef0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
2f00: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
2f10: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
2f30: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
2f40: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
2f50: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
2f60: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
2f70: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
2f80: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
2f90: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
2fa0: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
2fb0: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
2fc0: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
2fd0: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
2fe0: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
2ff0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
3000: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
3010: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
3020: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
3030: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
3040: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
3050: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
3060: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
3070: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3080: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
3090: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
30a0: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
30b0: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
30c0: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
30d0: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
30e0: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
30f0: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
3100: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
3110: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
3120: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
3130: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
3140: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
3150: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
3160: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3170: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
3180: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
3190: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
31a0: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
31b0: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
31c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31d0: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
31e0: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
31f0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
3200: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
3210: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
3220: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3230: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
3240: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
3250: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3260: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
3270: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
3280: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3290: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
32a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
32b0: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
32c0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
32d0: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
32e0: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
32f0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
3300: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
3310: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
3320: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
3330: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
3340: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e   not entire tran
3350: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  saction.** to be
3360: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54   rolled back). T
3370: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
3380: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69   true if the mai
3390: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79  n program or any
33a0: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  .** sub-programs
33b0: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66   contains any of
33c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
33d0: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
33e0: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
33f0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
3400: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
3410: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e     *  OP_HaltIfN
3420: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49  ull with P1=SQLI
3430: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
3440: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3450: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
3460: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
3470: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
3480: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20  VRename.**   *  
3490: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74  OP_FkCounter wit
34a0: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61  h P2==0 (immedia
34b0: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
34c0: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20  onstraint).**   
34d0: 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  *  OP_CreateTabl
34e0: 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  e and OP_InitCor
34f0: 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41  outine (for CREA
3500: 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45  TE TABLE AS SELE
3510: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
3520: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
3530: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
3540: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
3550: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
3560: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
3570: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3580: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
3590: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
35a0: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
35b0: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
35c0: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
35d0: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
35e0: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
35f0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
3600: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
3610: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
3620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
3630: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
3640: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
3650: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
3660: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
3670: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
3680: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
3690: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
36a0: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
36b0: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  rt = 0;.  int ha
36c0: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  sFkCounter = 0;.
36d0: 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54    int hasCreateT
36e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  able = 0;.  int 
36f0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
3700: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b   = 0;.  Op *pOp;
3710: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49  .  VdbeOpIter sI
3720: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ter;.  memset(&s
3730: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
3740: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72  sIter));.  sIter
3750: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65  .v = v;..  while
3760: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
3770: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20  ext(&sIter))!=0 
3780: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64  ){.    int opcod
3790: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
37a0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
37b0: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f  =OP_Destroy || o
37c0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
37d0: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
37e0: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c  VRename .     ||
37f0: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
3800: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
3810: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
3820: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
3830: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
3840: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
3850: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
3860: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
3870: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
3880: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3890: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
38a0: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20  P_CreateTable ) 
38b0: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
38c0: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
38d0: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
38e0: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
38f0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
3900: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3910: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3920: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3930: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3940: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3950: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3960: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3970: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3980: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3990: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
39a0: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
39b0: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
39c0: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
39d0: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
39e0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
39f0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
3a00: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
3a10: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
3a20: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3a30: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3a40: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3a50: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3a60: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3a70: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3a80: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3a90: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3aa0: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3ab0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3ac0: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3ad0: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3ae0: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3af0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
3b00: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
3b10: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3b30: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3b40: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3b50: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3b60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3b70: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3b80: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3b90: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3ba0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3bb0: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3bc0: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3bd0: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3be0: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3bf0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3c00: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3c10: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
3c20: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
3c30: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
3c40: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
3c50: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
3c60: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
3c70: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
3c80: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
3c90: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
3ca0: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
3cb0: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3cc0: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
3cd0: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
3ce0: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
3cf0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
3d00: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
3d10: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
3d20: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
3d30: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
3d40: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
3d50: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
3d60: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
3d70: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
3d80: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
3d90: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
3da0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3db0: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
3dc0: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
3dd0: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
3de0: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
3df0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3e00: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
3e10: 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  abels..*/.static
3e20: 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32 56   void resolveP2V
3e30: 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20 69  alues(Vdbe *p, i
3e40: 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  nt *pMaxFuncArgs
3e50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
3e60: 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d  t nMaxArgs = *pM
3e70: 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70  axFuncArgs;.  Op
3e80: 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a   *pOp;.  Parse *
3e90: 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72  pParse = p->pPar
3ea0: 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65  se;.  int *aLabe
3eb0: 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  l = pParse->aLab
3ec0: 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c  el;.  p->readOnl
3ed0: 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52  y = 1;.  p->bIsR
3ee0: 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f 72  eader = 0;.  for
3ef0: 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d 70  (pOp=p->aOp, i=p
3f00: 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20 69  ->nOp-1; i>=0; i
3f10: 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20  --, pOp++){.    
3f20: 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70 2d  u8 opcode = pOp-
3f30: 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f 2a  >opcode;..    /*
3f40: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
3f50: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
3f60: 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64 69  eh.awk when addi
3f70: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
3f80: 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d     ** cases from
3f90: 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f   this switch! */
3fa0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70 63  .    switch( opc
3fb0: 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61 73  ode ){.      cas
3fc0: 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e  e OP_Transaction
3fd0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
3fe0: 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e  pOp->p2!=0 ) p->
3ff0: 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20  readOnly = 0;.  
4000: 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68        /* fall th
4010: 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ru */.      }.  
4020: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
4030: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63 61  Commit:.      ca
4040: 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 3a  se OP_Savepoint:
4050: 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62 49   {.        p->bI
4060: 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20  sReader = 1;.   
4070: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4080: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
4090: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20  TE_OMIT_WAL.    
40a0: 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b 70    case OP_Checkp
40b0: 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20  oint:.#endif.   
40c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75     case OP_Vacuu
40d0: 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  m:.      case OP
40e0: 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a  _JournalMode: {.
40f0: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
4100: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4110: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20   p->bIsReader = 
4120: 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  1;.        break
4130: 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65  ;.      }.#ifnde
4140: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
4150: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
4160: 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65   case OP_VUpdate
4170: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  : {.        if( 
4180: 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73  pOp->p2>nMaxArgs
4190: 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f   ) nMaxArgs = pO
41a0: 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20 62  p->p2;.        b
41b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
41c0: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
41d0: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 69  ter: {.        i
41e0: 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61 73  nt n;.        as
41f0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20 69  sert( p->nOp - i
4200: 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20   >= 3 );.       
4210: 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d   assert( pOp[-1]
4220: 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65  .opcode==OP_Inte
4230: 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20 6e  ger );.        n
4240: 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20   = pOp[-1].p1;. 
4250: 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61         if( n>nMa
4260: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
4270: 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62 72   = n;.        br
4280: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  eak;.      }.#en
4290: 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20 4f  dif.      case O
42a0: 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63 61  P_Next:.      ca
42b0: 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e  se OP_NextIfOpen
42c0: 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f  :.      case OP_
42d0: 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20  SorterNext: {.  
42e0: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41        pOp->p4.xA
42f0: 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33  dvance = sqlite3
4300: 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20 20  BtreeNext;.     
4310: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
4320: 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20   P4_ADVANCE;.   
4330: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4340: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f    }.      case O
4350: 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63 61  P_Prev:.      ca
4360: 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65 6e  se OP_PrevIfOpen
4370: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d  : {.        pOp-
4380: 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20 73  >p4.xAdvance = s
4390: 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
43a0: 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f 70  ous;.        pOp
43b0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44  ->p4type = P4_AD
43c0: 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 62  VANCE;.        b
43d0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
43e0: 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f 70    }..    pOp->op
43f0: 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 4f  flags = sqlite3O
4400: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f 70  pcodeProperty[op
4410: 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20 28  code];.    if( (
4420: 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20 4f  pOp->opflags & O
4430: 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26  PFLG_JUMP)!=0 &&
4440: 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20 20   pOp->p2<0 ){.  
4450: 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44 52      assert( ADDR
4460: 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73 65  (pOp->p2)<pParse
4470: 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20  ->nLabel );.    
4480: 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62    pOp->p2 = aLab
4490: 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29  el[ADDR(pOp->p2)
44a0: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  ];.    }.  }.  s
44b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e  qlite3DbFree(p->
44c0: 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62  db, pParse->aLab
44d0: 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61  el);.  pParse->a
44e0: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61  Label = 0;.  pPa
44f0: 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b  rse->nLabel = 0;
4500: 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  .  *pMaxFuncArgs
4510: 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61   = nMaxArgs;.  a
4520: 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61  ssert( p->bIsRea
4530: 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b  der!=0 || DbMask
4540: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65  AllZero(p->btree
4550: 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mask) );.}../*.*
4560: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
4570: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4580: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4590: 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a  be inserted..*/.
45a0: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43  int sqlite3VdbeC
45b0: 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65 20  urrentAddr(Vdbe 
45c0: 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  *p){.  assert( p
45d0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
45e0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65  GIC_INIT );.  re
45f0: 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a  turn p->nOp;.}..
4600: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
4610: 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
4620: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72  inter to the arr
4630: 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73  ay of opcodes as
4640: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a  sociated with.**
4650: 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
4660: 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
4670: 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68  gument. It is th
4680: 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e  e callers respon
4690: 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61  sibility.** to a
46a0: 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72  rrange for the r
46b0: 65 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f  eturned array to
46c0: 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66   be eventually f
46d0: 72 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a  reed using the .
46e0: 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  ** vdbeFreeOpArr
46f0: 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  ay() function..*
4700: 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75  *.** Before retu
4710: 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20  rning, *pnOp is 
4720: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
4730: 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
4740: 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20  the returned.** 
4750: 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e  array. Also, *pn
4760: 4d 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f  MaxArg is set to
4770: 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69   the larger of i
4780: 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  ts current value
4790: 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d   and .** the num
47a0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
47b0: 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67  n the Vdbe.apArg
47c0: 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65  [] array require
47d0: 64 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65  d to execute the
47e0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72   .** returned pr
47f0: 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70  ogram..*/.VdbeOp
4800: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b   *sqlite3VdbeTak
4810: 65 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70  eOpArray(Vdbe *p
4820: 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74  , int *pnOp, int
4830: 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56   *pnMaxArg){.  V
4840: 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e  dbeOp *aOp = p->
4850: 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61  aOp;.  assert( a
4860: 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61  Op && !p->db->ma
4870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20  llocFailed );.. 
4880: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73   /* Check that s
4890: 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74  qlite3VdbeUsesBt
48a0: 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61  ree() was not ca
48b0: 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20  lled on this VM 
48c0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d  */.  assert( DbM
48d0: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74  askAllZero(p->bt
48e0: 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72  reeMask) );..  r
48f0: 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70  esolveP2Values(p
4900: 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a  , pnMaxArg);.  *
4910: 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20  pnOp = p->nOp;. 
4920: 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72   p->aOp = 0;.  r
4930: 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a  eturn aOp;.}../*
4940: 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20  .** Add a whole 
4950: 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f  list of operatio
4960: 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74  ns to the operat
4970: 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75  ion stack.  Retu
4980: 72 6e 20 74 68 65 0a 2a 2a 20 61 64 64 72 65 73  rn the.** addres
4990: 73 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6f  s of the first o
49a0: 70 65 72 61 74 69 6f 6e 20 61 64 64 65 64 2e 0a  peration added..
49b0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
49c0: 62 65 41 64 64 4f 70 4c 69 73 74 28 56 64 62 65  beAddOpList(Vdbe
49d0: 20 2a 70 2c 20 69 6e 74 20 6e 4f 70 2c 20 56 64   *p, int nOp, Vd
49e0: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
49f0: 61 4f 70 2c 20 69 6e 74 20 69 4c 69 6e 65 6e 6f  aOp, int iLineno
4a00: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 69  ){.  int addr, i
4a10: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74  ;.  VdbeOp *pOut
4a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e  ;.  assert( nOp>
4a30: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
4a40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
4a50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
4a60: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
4a70: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
4a80: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
4a90: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
4aa0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
4ab0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
4ac0: 3b 0a 20 20 70 4f 75 74 20 3d 20 26 70 2d 3e 61  ;.  pOut = &p->a
4ad0: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 6f 72 28  Op[addr];.  for(
4ae0: 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c  i=0; i<nOp; i++,
4af0: 20 61 4f 70 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b   aOp++, pOut++){
4b00: 0a 20 20 20 20 70 4f 75 74 2d 3e 6f 70 63 6f 64  .    pOut->opcod
4b10: 65 20 3d 20 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = aOp->opcode;
4b20: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20  .    pOut->p1 = 
4b30: 61 4f 70 2d 3e 70 31 3b 0a 20 20 20 20 70 4f 75  aOp->p1;.    pOu
4b40: 74 2d 3e 70 32 20 3d 20 61 4f 70 2d 3e 70 32 3b  t->p2 = aOp->p2;
4b50: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 4f 70  .    assert( aOp
4b60: 2d 3e 70 32 3e 3d 30 20 29 3b 0a 20 20 20 20 70  ->p2>=0 );.    p
4b70: 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d 3e 70  Out->p3 = aOp->p
4b80: 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 74  3;.    pOut->p4t
4b90: 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44  ype = P4_NOTUSED
4ba0: 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e 70  ;.    pOut->p4.p
4bb0: 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74 2d 3e   = 0;.    pOut->
4bc0: 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53  p5 = 0;.#ifdef S
4bd0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
4be0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
4bf0: 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65 6e 74    pOut->zComment
4c00: 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66   = 0;.#endif.#if
4c10: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
4c20: 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70 4f 75  COVERAGE.    pOu
4c30: 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  t->iSrcLine = iL
4c40: 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20  ineno+i;.#else. 
4c50: 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f     (void)iLineno
4c60: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
4c70: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
4c80: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67   if( p->db->flag
4c90: 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41  s & SQLITE_VdbeA
4ca0: 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20  ddopTrace ){.   
4cb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72     sqlite3VdbePr
4cc0: 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c  intOp(0, i+addr,
4cd0: 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d   &p->aOp[i+addr]
4ce0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
4cf0: 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20    }.  p->nOp += 
4d00: 6e 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  nOp;.  return ad
4d10: 64 72 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  dr;.}..#if defin
4d20: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
4d30: 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53  _STMT_SCANSTATUS
4d40: 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65  )./*.** Add an e
4d50: 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61  ntry to the arra
4d60: 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61  y of counters ma
4d70: 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33  naged by sqlite3
4d80: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
4d90: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
4da0: 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75  te3VdbeScanStatu
4db0: 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  s(.  Vdbe *p,   
4dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dd0: 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64       /* VM to ad
4de0: 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74  d scanstatus() t
4df0: 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45  o */.  int addrE
4e00: 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20  xplain,         
4e10: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
4e20: 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20  s of OP_Explain 
4e30: 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20  (or 0) */.  int 
4e40: 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20  addrLoop,       
4e50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4e60: 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63  ddress of loop c
4e70: 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74  ounter */ .  int
4e80: 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20   addrVisit,     
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ea0: 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20  Address of rows 
4eb0: 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20  visited counter 
4ec0: 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74  */.  LogEst nEst
4ed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4ee0: 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65       /* Estimate
4ef0: 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70  d number of outp
4f00: 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e  ut rows */.  con
4f10: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20  st char *zName  
4f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4f30: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72  Name of table or
4f40: 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61   index being sca
4f50: 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  nned */.){.  int
4f60: 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63   nByte = (p->nSc
4f70: 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53  an+1) * sizeof(S
4f80: 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63  canStatus);.  Sc
4f90: 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a  anStatus *aNew;.
4fa0: 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74    aNew = (ScanSt
4fb0: 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52  atus*)sqlite3DbR
4fc0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d  ealloc(p->db, p-
4fd0: 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a  >aScan, nByte);.
4fe0: 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20    if( aNew ){.  
4ff0: 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e    ScanStatus *pN
5000: 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53  ew = &aNew[p->nS
5010: 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77  can++];.    pNew
5020: 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20  ->addrExplain = 
5030: 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20  addrExplain;.   
5040: 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20   pNew->addrLoop 
5050: 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20  = addrLoop;.    
5060: 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20  pNew->addrVisit 
5070: 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20  = addrVisit;.   
5080: 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45   pNew->nEst = nE
5090: 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e  st;.    pNew->zN
50a0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53  ame = sqlite3DbS
50b0: 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61  trDup(p->db, zNa
50c0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61  me);.    p->aSca
50d0: 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a  n = aNew;.  }.}.
50e0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43  #endif.../*.** C
50f0: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
5100: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f  of the opcode, o
5110: 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72  r P1, P2, P3, or
5120: 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20   P5 operands.** 
5130: 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69  for a specific i
5140: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  nstruction..*/.v
5150: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5160: 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65  hangeOpcode(Vdbe
5170: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75   *p, u32 addr, u
5180: 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20  8 iNewOpcode){. 
5190: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
51a0: 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64  p(p,addr)->opcod
51b0: 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a  e = iNewOpcode;.
51c0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
51d0: 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20  beChangeP1(Vdbe 
51e0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e  *p, u32 addr, in
51f0: 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65  t val){.  sqlite
5200: 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64  3VdbeGetOp(p,add
5210: 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a  r)->p1 = val;.}.
5220: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5230: 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70  ChangeP2(Vdbe *p
5240: 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20  , u32 addr, int 
5250: 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56  val){.  sqlite3V
5260: 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29  dbeGetOp(p,addr)
5270: 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f  ->p2 = val;.}.vo
5280: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5290: 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20  angeP3(Vdbe *p, 
52a0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
52b0: 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  l){.  sqlite3Vdb
52c0: 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e  eGetOp(p,addr)->
52d0: 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64  p3 = val;.}.void
52e0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
52f0: 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38  geP5(Vdbe *p, u8
5300: 20 70 35 29 7b 0a 20 20 73 71 6c 69 74 65 33 56   p5){.  sqlite3V
5310: 64 62 65 47 65 74 4f 70 28 70 2c 2d 31 29 2d 3e  dbeGetOp(p,-1)->
5320: 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a  p5 = p5;.}../*.*
5330: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20  * Change the P2 
5340: 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72  operand of instr
5350: 75 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74  uction addr so t
5360: 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
5370: 0a 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20  .** the address 
5380: 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74  of the next inst
5390: 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f  ruction to be co
53a0: 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ded..*/.void sql
53b0: 69 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65  ite3VdbeJumpHere
53c0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64  (Vdbe *p, int ad
53d0: 64 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65  dr){.  p->pParse
53e0: 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e  ->iFixedOp = p->
53f0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74  nOp - 1;.  sqlit
5400: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70  e3VdbeChangeP2(p
5410: 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b  , addr, p->nOp);
5420: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  .}.../*.** If th
5430: 65 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20  e input FuncDef 
5440: 73 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68  structure is eph
5450: 65 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65  emeral, then fre
5460: 65 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65  e it.  If.** the
5470: 20 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20   FuncDef is not 
5480: 65 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64  ephermal, then d
5490: 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74  o nothing..*/.st
54a0: 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70  atic void freeEp
54b0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
54c0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
54d0: 63 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69  cDef *pDef){.  i
54e0: 66 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20  f( ALWAYS(pDef) 
54f0: 26 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  && (pDef->funcFl
5500: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
5510: 43 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20  C_EPHEM)!=0 ){. 
5520: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5530: 28 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a  (db, pDef);.  }.
5540: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  }..static void v
5550: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73  dbeFreeOpArray(s
5560: 71 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20  qlite3 *, Op *, 
5570: 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  int);../*.** Del
5580: 65 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69  ete a P4 value i
5590: 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a  f necessary..*/.
55a0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
55b0: 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  P4(sqlite3 *db, 
55c0: 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64  int p4type, void
55d0: 20 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20   *p4){.  if( p4 
55e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
55f0: 62 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28  b );.    switch(
5600: 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20   p4type ){.     
5610: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
5620: 3a 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  : {.        free
5630: 45 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f  EphemeralFunctio
5640: 6e 28 64 62 2c 20 28 28 73 71 6c 69 74 65 33 5f  n(db, ((sqlite3_
5650: 63 6f 6e 74 65 78 74 2a 29 70 34 29 2d 3e 70 46  context*)p4)->pF
5660: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a  unc);.        /*
5670: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
5680: 74 6f 20 74 68 65 20 6e 65 78 74 20 63 61 73 65  to the next case
5690: 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
56a0: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a    case P4_REAL:.
56b0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
56c0: 54 36 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20  T64:.      case 
56d0: 50 34 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20  P4_DYNAMIC:.    
56e0: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52    case P4_INTARR
56f0: 41 59 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71  AY: {.        sq
5700: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
5710: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5720: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5730: 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46    case P4_KEYINF
5740: 4f 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  O: {.        if(
5750: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
5760: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65  d==0 ) sqlite3Ke
5770: 79 49 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49  yInfoUnref((KeyI
5780: 6e 66 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20  nfo*)p4);.      
5790: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
57a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
57b0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
57c0: 54 53 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  TS.      case P4
57d0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 20  _EXPR: {.       
57e0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
57f0: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
5800: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5810: 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
5820: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d  .      case P4_M
5830: 50 52 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20  PRINTF: {.      
5840: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5850: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5860: 74 65 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20  te3_free(p4);.  
5870: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5880: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
5890: 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20  P4_FUNCDEF: {.  
58a0: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
58b0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
58c0: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
58d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
58e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
58f0: 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20   P4_MEM: {.     
5900: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
5910: 65 73 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20  esFreed==0 ){.  
5920: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
5930: 61 6c 75 65 46 72 65 65 28 28 73 71 6c 69 74 65  alueFree((sqlite
5940: 33 5f 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20  3_value*)p4);.  
5950: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5960: 20 20 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20         Mem *p = 
5970: 28 4d 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20  (Mem*)p4;.      
5980: 20 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c      if( p->szMal
5990: 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46  loc ) sqlite3DbF
59a0: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
59b0: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  oc);.          s
59c0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
59d0: 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
59e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
59f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
5a00: 20 50 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20   P4_VTAB : {.   
5a10: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
5a20: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
5a30: 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b  qlite3VtabUnlock
5a40: 28 28 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a  ((VTable *)p4);.
5a50: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74  .}../*.** Free t
5a80: 68 65 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74  he space allocat
5a90: 65 64 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61  ed for aOp and a
5aa0: 6e 79 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c  ny p4 values all
5ab0: 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a  ocated for the.*
5ac0: 2a 20 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69  * opcodes contai
5ad0: 6e 65 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61  ned within. If a
5ae0: 4f 70 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69  Op is not NULL i
5af0: 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20  t is assumed to 
5b00: 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20  contain .** nOp 
5b10: 65 6e 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61  entries. .*/.sta
5b20: 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72 65  tic void vdbeFre
5b30: 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74 65 33  eOpArray(sqlite3
5b40: 20 2a 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69   *db, Op *aOp, i
5b50: 6e 74 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61  nt nOp){.  if( a
5b60: 4f 70 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f  Op ){.    Op *pO
5b70: 70 3b 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61  p;.    for(pOp=a
5b80: 4f 70 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70  Op; pOp<&aOp[nOp
5b90: 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20  ]; pOp++){.     
5ba0: 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d   freeP4(db, pOp-
5bb0: 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34  >p4type, pOp->p4
5bc0: 2e 70 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  .p);.#ifdef SQLI
5bd0: 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49  TE_ENABLE_EXPLAI
5be0: 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20  N_COMMENTS.     
5bf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
5c00: 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  b, pOp->zComment
5c10: 29 3b 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20  );.#endif     . 
5c20: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
5c30: 65 33 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70  e3DbFree(db, aOp
5c40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b  );.}../*.** Link
5c50: 20 74 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20   the SubProgram 
5c60: 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73  object passed as
5c70: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
5c80: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69  ment into the li
5c90: 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20  nked.** list at 
5ca0: 56 64 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d  Vdbe.pSubProgram
5cb0: 2e 20 54 68 69 73 20 6c 69 73 74 20 69 73 20 75  . This list is u
5cc0: 73 65 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c  sed to delete al
5cd0: 6c 20 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a  l sub-program.**
5ce0: 20 6f 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68   objects when th
5cf0: 65 20 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65  e VM is no longe
5d00: 72 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76  r required..*/.v
5d10: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
5d20: 69 6e 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64  inkSubProgram(Vd
5d30: 62 65 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72  be *pVdbe, SubPr
5d40: 6f 67 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e  ogram *p){.  p->
5d50: 70 4e 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70  pNext = pVdbe->p
5d60: 50 72 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65  Program;.  pVdbe
5d70: 2d 3e 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a  ->pProgram = p;.
5d80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
5d90: 74 68 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64  the opcode at ad
5da0: 64 72 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a  dr into OP_Noop.
5db0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5dc0: 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28  dbeChangeToNoop(
5dd0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5de0: 72 29 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70  r){.  if( addr<p
5df0: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62  ->nOp ){.    Vdb
5e00: 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61  eOp *pOp = &p->a
5e10: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71  Op[addr];.    sq
5e20: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
5e30: 62 3b 0a 20 20 20 20 66 72 65 65 50 34 28 64 62  b;.    freeP4(db
5e40: 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70  , pOp->p4type, p
5e50: 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d  Op->p4.p);.    m
5e60: 65 6d 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69  emset(pOp, 0, si
5e70: 7a 65 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20  zeof(pOp[0]));. 
5e80: 20 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d     pOp->opcode =
5e90: 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 7d 0a 7d 0a   OP_Noop;.  }.}.
5ea0: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61  ./*.** If the la
5eb0: 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70  st opcode is "op
5ec0: 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20  " and it is not 
5ed0: 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  a jump destinati
5ee0: 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f  on,.** then remo
5ef0: 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74  ve it.  Return t
5f00: 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20  rue if and only 
5f10: 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73  if an opcode was
5f20: 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74   removed..*/.int
5f30: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
5f40: 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64  tePriorOpcode(Vd
5f50: 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20  be *p, u8 op){. 
5f60: 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e   if( (p->nOp-1)>
5f70: 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78  (p->pParse->iFix
5f80: 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b  edOp) && p->aOp[
5f90: 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65  p->nOp-1].opcode
5fa0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69  ==op ){.    sqli
5fb0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
5fc0: 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29  oop(p, p->nOp-1)
5fd0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
5fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
5ff0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 0;.  }.}../*
6000: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
6010: 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f  alue of the P4 o
6020: 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65  perand for a spe
6030: 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f  cific instructio
6040: 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  n..** This routi
6050: 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65  ne is useful whe
6060: 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61  n a large progra
6070: 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d  m is loaded from
6080: 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72   a.** static arr
6090: 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ay using sqlite3
60a0: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75  VdbeAddOpList bu
60b0: 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b  t we want to mak
60c0: 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72  e a.** few minor
60d0: 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
60e0: 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49  program..**.** I
60f0: 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20  f n>=0 then the 
6100: 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79  P4 operand is dy
6110: 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74  namic, meaning t
6120: 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a  hat a copy of.**
6130: 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d   the string is m
6140: 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ade into memory 
6150: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
6160: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
6170: 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d  ** A value of n=
6180: 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79  =0 means copy by
6190: 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f  tes of zP4 up to
61a0: 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74   and including t
61b0: 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c  he.** first null
61c0: 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74   byte.  If n>0 t
61d0: 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74  hen copy n+1 byt
61e0: 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a  es of zP4..** .*
61f0: 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f  * Other values o
6200: 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20  f n (P4_STATIC, 
6210: 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29  P4_COLLSEQ etc.)
6220: 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a   indicate that z
6230: 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  P4 points.** to 
6240: 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75  a string or stru
6250: 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75  cture that is gu
6260: 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73  aranteed to exis
6270: 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69  t for the lifeti
6280: 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62  me of.** the Vdb
6290: 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  e. In these case
62a0: 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f  s we can just co
62b0: 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a  py the pointer..
62c0: 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20  **.** If addr<0 
62d0: 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f  then change P4 o
62e0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
62f0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73  tly inserted ins
6300: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  truction..*/.voi
6310: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
6320: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
6330: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
6340: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
6350: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
6360: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
6370: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
6380: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
6390: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
63a0: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
63b0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 3d  );.  if( p->aOp=
63c0: 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  =0 || db->malloc
63d0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
63e0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b 0a  ( n!=P4_VTAB ){.
63f0: 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c        freeP4(db,
6400: 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68 61   n, (void*)*(cha
6410: 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20 7d  r**)&zP4);.    }
6420: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6430: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
6440: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
6450: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
6460: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
6470: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
6480: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
6490: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
64a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70 2d  ;.  assert( pOp-
64b0: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54 55  >p4type==P4_NOTU
64c0: 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  SED.       || pO
64d0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49 4e  p->p4type==P4_IN
64e0: 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70 4f  T32.       || pO
64f0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b 45  p->p4type==P4_KE
6500: 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65 50  YINFO );.  freeP
6510: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
6520: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
6530: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a   pOp->p4.p = 0;.
6540: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
6550: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
6560: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
6570: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
6580: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
6590: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
65a0: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
65b0: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
65c0: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
65d0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
65e0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
65f0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6600: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
6610: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d 3d   }else if( zP4==
6620: 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34  0 ){.    pOp->p4
6630: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  .p = 0;.    pOp-
6640: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
6650: 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  USED;.  }else if
6660: 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20  ( n==P4_KEYINFO 
6670: 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  ){.    pOp->p4.p
6680: 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20   = (void*)zP4;. 
6690: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
66a0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 23 69 66   P4_KEYINFO;.#if
66b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
66c0: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 0a 20  E_CURSOR_HINTS. 
66d0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34   }else if( n==P4
66e0: 5f 45 58 50 52 20 29 7b 0a 20 20 20 20 2f 2a 20  _EXPR ){.    /* 
66f0: 52 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 66  Responsibility f
6700: 6f 72 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  or deleting the 
6710: 45 78 70 72 20 74 72 65 65 20 69 73 20 68 61 6e  Expr tree is han
6720: 64 65 64 20 6f 76 65 72 20 74 6f 20 74 68 65 0a  ded over to the.
6730: 20 20 20 20 2a 2a 20 56 44 42 45 20 62 79 20 74      ** VDBE by t
6740: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  his operation.  
6750: 54 68 65 20 63 61 6c 6c 65 72 20 73 68 6f 75 6c  The caller shoul
6760: 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 69  d have already i
6770: 6e 76 6f 6b 65 64 0a 20 20 20 20 2a 2a 20 73 71  nvoked.    ** sq
6780: 6c 69 74 65 33 45 78 70 72 44 75 70 28 29 20 6f  lite3ExprDup() o
6790: 72 20 77 68 61 74 65 76 65 72 20 6f 74 68 65 72  r whatever other
67a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 65 64   routine is need
67b0: 65 64 20 74 6f 20 6d 61 6b 65 20 61 20 0a 20 20  ed to make a .  
67c0: 20 20 2a 2a 20 70 72 69 76 61 74 65 20 63 6f 70    ** private cop
67d0: 79 20 6f 66 20 74 68 65 20 74 72 65 65 2e 20 2a  y of the tree. *
67e0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 45  /.    pOp->p4.pE
67f0: 78 70 72 20 3d 20 28 45 78 70 72 2a 29 7a 50 34  xpr = (Expr*)zP4
6800: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6810: 65 20 3d 20 50 34 5f 45 58 50 52 3b 0a 23 65 6e  e = P4_EXPR;.#en
6820: 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  dif.  }else if( 
6830: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
6840: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6850: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6860: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
6870: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
6880: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
6890: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
68a0: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
68b0: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
68c0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
68d0: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
68e0: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
68f0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
6900: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
6910: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
6920: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
6930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6940: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
6950: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
6960: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
6970: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
6980: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
6990: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
69a0: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
69b0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
69c0: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
69d0: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
69e0: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
69f0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
6a00: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
6a10: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
6a20: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
6a30: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
6a40: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6a50: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6a60: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
6a70: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
6a80: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6a90: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
6aa0: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
6ab0: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
6ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ad0: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
6ae0: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
6af0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
6b00: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
6b10: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
6b20: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
6b30: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
6b40: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
6b50: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
6b60: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
6b70: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
6b80: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
6b90: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
6ba0: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
6bb0: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
6bc0: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
6bd0: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
6be0: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
6bf0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
6c00: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
6c10: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
6c20: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
6c30: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
6c40: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6c50: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
6c60: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6c70: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
6c80: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6c90: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
6ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6cb0: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
6cc0: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6cd0: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
6ce0: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
6cf0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6d00: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
6d10: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
6d20: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
6d30: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
6d40: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6d50: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6d60: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
6d70: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6d80: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6d90: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6da0: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
6db0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
6dc0: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
6dd0: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6de0: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
6df0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
6e00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
6e10: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
6e20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
6e30: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
6e40: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6e50: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
6e60: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
6e70: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
6e80: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6e90: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6ea0: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6eb0: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6ec0: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
6ed0: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
6ee0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
6ef0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
6f00: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
6f10: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
6f20: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
6f30: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
6f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6f50: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6f60: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
6f70: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
6f80: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6f90: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
6fa0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
6fb0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6fc0: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6fd0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
6fe0: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
6ff0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
7000: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
7010: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
7020: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
7030: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
7040: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
7050: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
7060: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
7070: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
7080: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
7090: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
70a0: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
70b0: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
70c0: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
70d0: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
70e0: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
70f0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
7100: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
7110: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
7120: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
7130: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
7140: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
7150: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
7160: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
7170: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
7180: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
7190: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
71a0: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
71b0: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
71c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
71d0: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
71e0: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
71f0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
7200: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
7210: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
7220: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
7230: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
7240: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
7250: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
7260: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
7270: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
7280: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
7290: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
72a0: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
72b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
72c0: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
72d0: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
72e0: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
72f0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
7300: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
7310: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
7320: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
7330: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
7340: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
7350: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
7360: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
7370: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
7380: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
7390: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
73a0: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
73b0: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
73c0: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
73d0: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
73e0: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
73f0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
7400: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
7410: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7420: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
7430: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
7440: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
7450: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
7460: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
7470: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
7480: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
7490: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
74a0: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
74b0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
74c0: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
74d0: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
74e0: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
74f0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
7500: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
7510: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
7520: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
7530: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
7540: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
7550: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
7560: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
7570: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
7580: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
7590: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
75a0: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
75b0: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
75c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
75d0: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
75e0: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
75f0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
7600: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
7610: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
7620: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
7630: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
7640: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
7650: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
7660: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
7670: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
7680: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
7690: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
76a0: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
76b0: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
76c0: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
76d0: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
76e0: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
76f0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
7700: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
7710: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
7720: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
7730: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
7740: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
7750: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
7760: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
7770: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
7780: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
7790: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
77a0: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
77b0: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
77c0: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
77d0: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
77e0: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
77f0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
7800: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
7810: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
7820: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
7830: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
7840: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
7850: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
7860: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
7870: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
7880: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
7890: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
78a0: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
78b0: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
78c0: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
78d0: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
78e0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
78f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
7900: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
7910: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
7920: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
7930: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
7940: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
7950: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
7960: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7970: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
7980: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
7990: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
79a0: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
79b0: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
79c0: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
79d0: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
79e0: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
79f0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
7a00: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
7a10: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
7a20: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
7a30: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
7a40: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
7a50: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
7a60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7a70: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7a80: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7a90: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
7aa0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7ab0: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
7ac0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ad0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7ae0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
7af0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
7b00: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
7b10: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
7b20: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7b30: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
7b40: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
7b50: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
7b60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7b70: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7b80: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7b90: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
7ba0: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7bb0: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7bc0: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
7bd0: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7be0: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
7bf0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
7c00: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
7c10: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
7c20: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
7c30: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
7c40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7c50: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7c60: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
7c70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7c80: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
7c90: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7cb0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
7cc0: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
7cd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7ce0: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7cf0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
7d00: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
7d10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7d20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
7d30: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
7d40: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
7d50: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
7d60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7d70: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
7d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7d90: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7da0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7db0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
7dc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7dd0: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
7de0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7df0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
7e00: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
7e10: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
7e20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
7e30: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
7e40: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
7e50: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7e60: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
7e70: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7e80: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
7e90: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
7ea0: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
7eb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
7ec0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7ed0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7ee0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7ef0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
7f00: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
7f10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7f20: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
7f30: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
7f40: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
7f50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
7f60: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7f70: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69  ITE_DEBUG */..#i
7f80: 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  f VDBE_DISPLAY_P
7f90: 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  4 && defined(SQL
7fa0: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
7fb0: 52 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54  R_HINTS)./*.** T
7fc0: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e  ranslate the P4.
7fd0: 70 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20  pExpr value for 
7fe0: 61 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74  an OP_CursorHint
7ff0: 20 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78   opcode into tex
8000: 74 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65  t.** that can be
8010: 20 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68   displayed in th
8020: 65 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45  e P4 column of E
8030: 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a  XPLAIN output..*
8040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
8050: 70 6c 61 79 50 34 45 78 70 72 28 69 6e 74 20 6e  playP4Expr(int n
8060: 54 65 6d 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d  Temp, char *zTem
8070: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
8080: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8090: 4f 70 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 3b  Op = 0;.  int n;
80a0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
80b0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
80c0: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
80d0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
80e0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
80f0: 20 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e   "%Q", pExpr->u.
8100: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
8110: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8120: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20  K_INTEGER:.     
8130: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8140: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
8150: 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69  "%d", pExpr->u.i
8160: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 62 72  Value);.      br
8170: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8180: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c  _NULL:.      sql
8190: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
81a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
81b0: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
81c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
81d0: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
81e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
81f0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8200: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
8210: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
8220: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8230: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
8240: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8250: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
8260: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
8270: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
8280: 54 65 6d 70 2c 20 22 72 6f 77 69 64 22 29 3b 0a  Temp, "rowid");.
8290: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
82a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
82b0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
82c0: 6d 70 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29  mp, "c%d", (int)
82d0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
82e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
82f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8300: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
8310: 20 7a 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20   zOp = "LT";    
8320: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8330: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f  e TK_LE:      zO
8340: 70 20 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62  p = "LE";      b
8350: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8360: 4b 5f 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_GT:      zOp =
8370: 20 22 47 54 22 3b 20 20 20 20 20 20 62 72 65 61   "GT";      brea
8380: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
8390: 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47  E:      zOp = "G
83a0: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
83b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
83c0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b       zOp = "NE";
83d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
83e0: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20   case TK_EQ:    
83f0: 20 20 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20    zOp = "EQ";   
8400: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8410: 73 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a  se TK_IS:      z
8420: 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20  Op = "IS";      
8430: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8440: 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20  TK_ISNOT:   zOp 
8450: 3d 20 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65  = "ISNOT";   bre
8460: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8470: 41 4e 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22  AND:     zOp = "
8480: 41 4e 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  AND";     break;
8490: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
84a0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22        zOp = "OR"
84b0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
84c0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
84d0: 20 20 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20     zOp = "ADD"; 
84e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
84f0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
8500: 7a 4f 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20  zOp = "MUL";    
8510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8520: 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70   TK_MINUS:   zOp
8530: 20 3d 20 22 53 55 42 22 3b 20 20 20 20 20 62 72   = "SUB";     br
8540: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8550: 5f 52 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _REM:     zOp = 
8560: 22 52 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b  "REM";     break
8570: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8580: 54 41 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49  TAND:  zOp = "BI
8590: 54 41 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20  TAND";  break;. 
85a0: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
85b0: 3a 20 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52  :   zOp = "BITOR
85c0: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
85d0: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20  case TK_SLASH:  
85e0: 20 7a 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20   zOp = "DIV";   
85f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8600: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f  e TK_LSHIFT:  zO
8610: 70 20 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62  p = "LSHIFT";  b
8620: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8630: 4b 5f 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d  K_RSHIFT:  zOp =
8640: 20 22 52 53 48 49 46 54 22 3b 20 20 62 72 65 61   "RSHIFT";  brea
8650: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  k;.    case TK_C
8660: 4f 4e 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43  ONCAT:  zOp = "C
8670: 4f 4e 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ONCAT";  break;.
8680: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
8690: 55 53 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55  US:  zOp = "MINU
86a0: 53 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  S";   break;.   
86b0: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
86c0: 20 20 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20    zOp = "PLUS"; 
86d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
86e0: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
86f0: 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20  Op = "BITNOT";  
8700: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8710: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20  TK_NOT:     zOp 
8720: 3d 20 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65  = "NOT";     bre
8730: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8740: 49 53 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22  ISNULL:  zOp = "
8750: 49 53 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b  ISNULL";  break;
8760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
8770: 4e 55 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54  NULL: zOp = "NOT
8780: 4e 55 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20  NULL"; break;.. 
8790: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
87a0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
87b0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
87c0: 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b 0a   "%s", "expr");.
87d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
87e0: 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a 20  ..  if( zOp ){. 
87f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8800: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8810: 2c 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20  , "%s(", zOp);. 
8820: 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74     n = sqlite3St
8830: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8840: 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c 61 79 50     n += displayP
8850: 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e 2c 20 7a  4Expr(nTemp-n, z
8860: 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72 2d 3e 70  Temp+n, pExpr->p
8870: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Left);.    if( n
8880: 3c 6e 54 65 6d 70 2d 31 20 26 26 20 70 45 78 70  <nTemp-1 && pExp
8890: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
88a0: 20 20 20 7a 54 65 6d 70 5b 6e 2b 2b 5d 20 3d 20     zTemp[n++] = 
88b0: 27 2c 27 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  ',';.      n += 
88c0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54  displayP4Expr(nT
88d0: 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20  emp-n, zTemp+n, 
88e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
88f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8900: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8910: 2d 6e 2c 20 7a 54 65 6d 70 2b 6e 2c 20 22 29 22  -n, zTemp+n, ")"
8920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
8930: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8940: 7a 54 65 6d 70 29 3b 0a 7d 0a 23 65 6e 64 69 66  zTemp);.}.#endif
8950: 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59   /* VDBE_DISPLAY
8960: 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53  _P4 && defined(S
8970: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8980: 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a  SOR_HINTS) */...
8990: 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59  #if VDBE_DISPLAY
89a0: 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74  _P4./*.** Comput
89b0: 65 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  e a string that 
89c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34  describes the P4
89d0: 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61   parameter for a
89e0: 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65  n opcode..** Use
89f0: 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72   zTemp for any r
8a00: 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72  equired temporar
8a10: 79 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a  y buffer space..
8a20: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
8a30: 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f  displayP4(Op *pO
8a40: 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20  p, char *zTemp, 
8a50: 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68  int nTemp){.  ch
8a60: 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b  ar *zP4 = zTemp;
8a70: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
8a80: 3e 3d 32 30 20 29 3b 0a 20 20 73 77 69 74 63 68  >=20 );.  switch
8a90: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b  ( pOp->p4type ){
8aa0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59  .    case P4_KEY
8ab0: 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INFO: {.      in
8ac0: 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 4b 65  t i, j;.      Ke
8ad0: 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
8ae0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49 6e  = pOp->p4.pKeyIn
8af0: 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  fo;.      assert
8b00: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
8b10: 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 20  tOrder!=0 );.   
8b20: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8b30: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
8b40: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
8b50: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
8b60: 20 20 20 69 20 3d 20 73 71 6c 69 74 65 33 53 74     i = sqlite3St
8b70: 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a 20  rlen30(zTemp);. 
8b80: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
8b90: 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
8ba0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
8bb0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
8bc0: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
8bd0: 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  [j];.        con
8be0: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d  st char *zColl =
8bf0: 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e   pColl ? pColl->
8c00: 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c 22 3b 0a 20  zName : "nil";. 
8c10: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73         int n = s
8c20: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
8c30: 43 6f 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  Coll);.        i
8c40: 66 28 20 6e 3d 3d 36 20 26 26 20 6d 65 6d 63 6d  f( n==6 && memcm
8c50: 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e 41 52 59 22  p(zColl,"BINARY"
8c60: 2c 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,6)==0 ){.      
8c70: 20 20 20 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b      zColl = "B";
8c80: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 31  .          n = 1
8c90: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8ca0: 20 20 20 20 69 66 28 20 69 2b 6e 3e 6e 54 65 6d      if( i+n>nTem
8cb0: 70 2d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p-7 ){.         
8cc0: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
8cd0: 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b 0a 20 20 20  ],",...",4);.   
8ce0: 20 20 20 20 20 20 20 69 20 2b 3d 20 34 3b 0a 20         i += 4;. 
8cf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8d00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8d10: 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27    zTemp[i++] = '
8d20: 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ,';.        if( 
8d30: 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
8d40: 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20 20 20  rder[j] ){.     
8d50: 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20       zTemp[i++] 
8d60: 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 20 7d  = '-';.        }
8d70: 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
8d80: 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f 6c 6c  &zTemp[i], zColl
8d90: 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , n+1);.        
8da0: 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a  i += n;.      }.
8db0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d        zTemp[i++]
8dc0: 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20 7a 54   = ')';.      zT
8dd0: 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  emp[i] = 0;.    
8de0: 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54 65 6d    assert( i<nTem
8df0: 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p );.      break
8e00: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
8e10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
8e20: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
8e30: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
8e40: 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78 70      displayP4Exp
8e50: 72 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  r(nTemp, zTemp, 
8e60: 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a  pOp->p4.pExpr);.
8e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8e80: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
8e90: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
8ea0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
8eb0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
8ec0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
8ed0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8ee0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e  emp, zTemp, "(%.
8ef0: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
8f00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
8f10: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8f20: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
8f30: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
8f40: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
8f50: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
8f60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8f70: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
8f80: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
8f90: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
8fa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8fb0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
8fc0: 45 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34  EBUG.    case P4
8fd0: 5f 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20  _FUNCCTX: {.    
8fe0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20    FuncDef *pDef 
8ff0: 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e  = pOp->p4.pCtx->
9000: 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c  pFunc;.      sql
9010: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9020: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28  emp, zTemp, "%s(
9030: 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d  %d)", pDef->zNam
9040: 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a  e, pDef->nArg);.
9050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9060: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
9070: 73 65 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20  se P4_INT64: {. 
9080: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9090: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
90a0: 6d 70 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70  mp, "%lld", *pOp
90b0: 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20  ->p4.pI64);.    
90c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
90d0: 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32     case P4_INT32
90e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
90f0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
9100: 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c 20 70  , zTemp, "%d", p
9110: 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20  Op->p4.i);.     
9120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9130: 20 20 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 20    case P4_REAL: 
9140: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
9150: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
9160: 7a 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20  zTemp, "%.16g", 
9170: 2a 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b  *pOp->p4.pReal);
9180: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9190: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
91a0: 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d  MEM: {.      Mem
91b0: 20 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34   *pMem = pOp->p4
91c0: 2e 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28  .pMem;.      if(
91d0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
91e0: 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20  EM_Str ){.      
91f0: 20 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b    zP4 = pMem->z;
9200: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
9210: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d   pMem->flags & M
9220: 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20  EM_Int ){.      
9230: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9240: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9250: 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75   "%lld", pMem->u
9260: 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .i);.      }else
9270: 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73   if( pMem->flags
9280: 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20   & MEM_Real ){. 
9290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
92a0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
92b0: 54 65 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 70  Temp, "%.16g", p
92c0: 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  Mem->u.r);.     
92d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
92e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c  >flags & MEM_Nul
92f0: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  l ){.        sql
9300: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
9310: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c  emp, zTemp, "NUL
9320: 4c 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  L");.      }else
9330: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
9340: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
9350: 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20  MEM_Blob );.    
9360: 20 20 20 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62      zP4 = "(blob
9370: 29 22 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  )";.      }.    
9380: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
9390: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
93a0: 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
93b0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
93c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
93d0: 33 5f 76 74 61 62 20 2a 70 56 74 61 62 20 3d 20  3_vtab *pVtab = 
93e0: 70 4f 70 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70  pOp->p4.pVtab->p
93f0: 56 74 61 62 3b 0a 20 20 20 20 20 20 73 71 6c 69  Vtab;.      sqli
9400: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
9410: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 76 74 61 62  mp, zTemp, "vtab
9420: 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20 20  :%p", pVtab);.  
9430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9440: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
9450: 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a   P4_INTARRAY: {.
9460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
9470: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
9480: 65 6d 70 2c 20 22 69 6e 74 61 72 72 61 79 22 29  emp, "intarray")
9490: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
94a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
94b0: 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20  _SUBPROGRAM: {. 
94c0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
94d0: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
94e0: 6d 70 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a  mp, "program");.
94f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9500: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41   }.    case P4_A
9510: 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20  DVANCE: {.      
9520: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
9530: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9540: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
9550: 20 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d        zP4 = pOp-
9560: 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28  >p4.z;.      if(
9570: 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20   zP4==0 ){.     
9580: 20 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a     zP4 = zTemp;.
9590: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d          zTemp[0]
95a0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
95b0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
95c0: 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72 65  ( zP4!=0 );.  re
95d0: 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64  turn zP4;.}.#end
95e0: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
95f0: 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  AY_P4 */../*.** 
9600: 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20 56  Declare to the V
9610: 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54 72  dbe that the BTr
9620: 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62 2d  ee object at db-
9630: 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64 2e  >aDb[i] is used.
9640: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70 61  .**.** The prepa
9650: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 6e  red statements n
9660: 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20 61  eed to know in a
9670: 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70 6c  dvance the compl
9680: 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61 74  ete set of.** at
9690: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
96a0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73   that will be us
96b0: 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74 68  e.  A mask of th
96c0: 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a 2a  ese databases.**
96d0: 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20 69   is maintained i
96e0: 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e 20  n p->btreeMask. 
96f0: 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b   The p->lockMask
9700: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 75   value is the su
9710: 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74  bset of.** p->bt
9720: 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61 62  reeMask of datab
9730: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 72  ases that will r
9740: 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a  equire a lock..*
9750: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9760: 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62 65  beUsesBtree(Vdbe
9770: 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20 61   *p, int i){.  a
9780: 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69  ssert( i>=0 && i
9790: 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20 69  <p->db->nDb && i
97a0: 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44 62  <(int)sizeof(yDb
97b0: 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73 73  Mask)*8 );.  ass
97c0: 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a 65  ert( i<(int)size
97d0: 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29  of(p->btreeMask)
97e0: 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53 65  *8 );.  DbMaskSe
97f0: 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c 20  t(p->btreeMask, 
9800: 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20 26  i);.  if( i!=1 &
9810: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 68  & sqlite3BtreeSh
9820: 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61 44  arable(p->db->aD
9830: 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20 20  b[i].pBt) ){.   
9840: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c 6f   DbMaskSet(p->lo
9850: 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a  ckMask, i);.  }.
9860: 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  }..#if !defined(
9870: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
9880: 45 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c  ED_CACHE) && SQL
9890: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
98a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65  ./*.** If SQLite
98b0: 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74 6f 20   is compiled to 
98c0: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
98d0: 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20 74 6f  ache mode and to
98e0: 20 62 65 20 74 68 72 65 61 64 73 61 66 65 2c 0a   be threadsafe,.
98f0: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9900: 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75 74 65  obtains the mute
9910: 78 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  x associated wit
9920: 68 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  h each BtShared 
9930: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74 68 61  structure.** tha
9940: 74 20 6d 61 79 20 62 65 20 61 63 63 65 73 73 65  t may be accesse
9950: 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73  d by the VM pass
9960: 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ed as an argumen
9970: 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f 20 69  t. In doing so i
9980: 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73 20 74  t also.** sets t
9990: 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 6d  he BtShared.db m
99a0: 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20 6f 66  ember of each of
99b0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 74   the BtShared st
99c0: 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75 72 69  ructures, ensuri
99d0: 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  ng.** that the c
99e0: 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61 6e 64  orrect busy-hand
99f0: 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 20  ler callback is 
9a00: 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71 75 69  invoked if requi
9a10: 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  red..**.** If SQ
9a20: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
9a30: 61 64 73 61 66 65 20 62 75 74 20 64 6f 65 73 20  adsafe but does 
9a40: 73 75 70 70 6f 72 74 20 73 68 61 72 65 64 2d 63  support shared-c
9a50: 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65 6e 0a  ache mode, then.
9a60: 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  ** sqlite3BtreeE
9a70: 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f 6b 65  nter() is invoke
9a80: 64 20 74 6f 20 73 65 74 20 74 68 65 20 42 74 53  d to set the BtS
9a90: 68 61 72 65 64 2e 64 62 20 76 61 72 69 61 62 6c  hared.db variabl
9aa0: 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20  es.** of all of 
9ab0: 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75  BtShared structu
9ac0: 72 65 73 20 61 63 63 65 73 73 69 62 6c 65 20 76  res accessible v
9ad0: 69 61 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ia the database 
9ae0: 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73 6f 63  handle .** assoc
9af0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
9b00: 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  M..**.** If SQLi
9b10: 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65 61 64  te is not thread
9b20: 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  safe and does no
9b30: 74 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  t support shared
9b40: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 69  -cache mode, thi
9b50: 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73  s.** function is
9b60: 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
9b70: 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  The p->btreeMask
9b80: 20 66 69 65 6c 64 20 69 73 20 61 20 62 69 74 6d   field is a bitm
9b90: 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72 65 65  ask of all btree
9ba0: 73 20 74 68 61 74 20 74 68 65 20 70 72 65 70 61  s that the prepa
9bb0: 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  red .** statemen
9bc0: 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20 75 73  t p will ever us
9bd0: 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74 68 65  e.  Let N be the
9be0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
9bf0: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 0a  in p->btreeMask.
9c00: 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
9c10: 20 74 6f 20 62 74 72 65 65 73 20 74 68 61 74 20   to btrees that 
9c20: 75 73 65 20 73 68 61 72 65 64 20 63 61 63 68 65  use shared cache
9c30: 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75 6e 74  .  Then the runt
9c40: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73 20 72  ime of.** this r
9c50: 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e 20 20  outine is N*N.  
9c60: 42 75 74 20 61 73 20 4e 20 69 73 20 72 61 72 65  But as N is rare
9c70: 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31 2c 20  ly more than 1, 
9c80: 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  this should not.
9c90: 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ** be a problem.
9ca0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9cb0: 56 64 62 65 45 6e 74 65 72 28 56 64 62 65 20 2a  VdbeEnter(Vdbe *
9cc0: 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  p){.  int i;.  s
9cd0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62  qlite3 *db;.  Db
9ce0: 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62   *aDb;.  int nDb
9cf0: 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c  ;.  if( DbMaskAl
9d00: 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73  lZero(p->lockMas
9d10: 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a  k) ) return;  /*
9d20: 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   The common case
9d30: 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62   */.  db = p->db
9d40: 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44  ;.  aDb = db->aD
9d50: 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e  b;.  nDb = db->n
9d60: 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  Db;.  for(i=0; i
9d70: 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <nDb; i++){.    
9d80: 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61  if( i!=1 && DbMa
9d90: 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61  skTest(p->lockMa
9da0: 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28  sk,i) && ALWAYS(
9db0: 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29  aDb[i].pBt!=0) )
9dc0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
9dd0: 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b 69 5d  treeEnter(aDb[i]
9de0: 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  .pBt);.    }.  }
9df0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21  .}.#endif..#if !
9e00: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9e10: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9e20: 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45  ) && SQLITE_THRE
9e30: 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 55  ADSAFE>0./*.** U
9e40: 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74 68 65  nlock all of the
9e50: 20 62 74 72 65 65 73 20 70 72 65 76 69 6f 75 73   btrees previous
9e60: 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61 20 63  ly locked by a c
9e70: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
9e80: 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a 73 74  beEnter()..*/.st
9e90: 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e  atic SQLITE_NOIN
9ea0: 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65 4c 65  LINE void vdbeLe
9eb0: 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ave(Vdbe *p){.  
9ec0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
9ed0: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
9ee0: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 64 62  .  int nDb;.  db
9ef0: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20   = p->db;.  aDb 
9f00: 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62  = db->aDb;.  nDb
9f10: 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f   = db->nDb;.  fo
9f20: 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b  r(i=0; i<nDb; i+
9f30: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31  +){.    if( i!=1
9f40: 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70   && DbMaskTest(p
9f50: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26  ->lockMask,i) &&
9f60: 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70   ALWAYS(aDb[i].p
9f70: 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  Bt!=0) ){.      
9f80: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
9f90: 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20  e(aDb[i].pBt);. 
9fa0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20     }.  }.}.void 
9fb0: 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65  sqlite3VdbeLeave
9fc0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
9fd0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
9fe0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65  ->lockMask) ) re
9ff0: 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f  turn;  /* The co
a000: 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 76  mmon case */.  v
a010: 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d 0a 23  dbeLeave(p);.}.#
a020: 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
a030: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
a040: 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
a050: 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20  TE_DEBUG)./*.** 
a060: 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65 20 6f  Print a single o
a070: 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75  pcode.  This rou
a080: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
a090: 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e   debugging only.
a0a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
a0b0: 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49 4c 45  VdbePrintOp(FILE
a0c0: 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63 2c 20   *pOut, int pc, 
a0d0: 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68 61 72  Op *pOp){.  char
a0e0: 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20 7a 50   *zP4;.  char zP
a0f0: 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72 20 7a  tr[50];.  char z
a100: 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74 61 74  Com[100];.  stat
a110: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
a120: 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64 20 25  Format1 = "%4d %
a130: 2d 31 33 73 20 25 34 64 20 25 34 64 20 25 34 64  -13s %4d %4d %4d
a140: 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73 5c 6e   %-13s %.2X %s\n
a150: 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d 3d 30  ";.  if( pOut==0
a160: 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f 75 74   ) pOut = stdout
a170: 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61  ;.  zP4 = displa
a180: 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c 20 73  yP4(pOp, zPtr, s
a190: 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a 23 69  izeof(zPtr));.#i
a1a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a1b0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
a1c0: 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43 6f 6d  NTS.  displayCom
a1d0: 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20 7a  ment(pOp, zP4, z
a1e0: 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43 6f 6d  Com, sizeof(zCom
a1f0: 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43 6f 6d  ));.#else.  zCom
a200: 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  [0] = 0;.#endif.
a210: 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20 73 71    /* NB:  The sq
a220: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
a230: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d  ) function is im
a240: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 6f 64  plemented by cod
a250: 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a 20 62  e created.  ** b
a260: 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  y the mkopcodeh.
a270: 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f 64 65  awk and mkopcode
a280: 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20 77 68  c.awk scripts wh
a290: 69 63 68 20 65 78 74 72 61 63 74 20 74 68 65 0a  ich extract the.
a2a0: 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
a2b0: 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65 2e 63   from the vdbe.c
a2c0: 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a 2f 0a   source text */.
a2d0: 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74 2c 20    fprintf(pOut, 
a2e0: 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20 0a 20  zFormat1, pc, . 
a2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 63 6f       sqlite3Opco
a300: 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f  deName(pOp->opco
a310: 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20 70 4f  de), pOp->p1, pO
a320: 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33 2c 20  p->p2, pOp->p3, 
a330: 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a 20 20  zP4, pOp->p5,.  
a340: 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a 20 20      zCom.  );.  
a350: 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a 7d 0a  fflush(pOut);.}.
a360: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
a370: 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79 20 6f  lease an array o
a380: 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e 74 73  f N Mem elements
a390: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a3a0: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
a3b0: 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  Mem *p, int N){.
a3c0: 20 20 69 66 28 20 70 20 26 26 20 4e 20 29 7b 0a    if( p && N ){.
a3d0: 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20 3d 20      Mem *pEnd = 
a3e0: 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c 69 74  &p[N];.    sqlit
a3f0: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
a400: 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f 66 61      u8 malloc_fa
a410: 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c 6c 6f  iled = db->mallo
a420: 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69 66 28  cFailed;.    if(
a430: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
a440: 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  d ){.      do{. 
a450: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73 7a         if( p->sz
a460: 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65 33  Malloc ) sqlite3
a470: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d  DbFree(db, p->zM
a480: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d 77  alloc);.      }w
a490: 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64  hile( (++p)<pEnd
a4a0: 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
a4b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a  ;.    }.    do{.
a4c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 26        assert( (&
a4d0: 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20 70  p[1])==pEnd || p
a4e0: 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62 20  [0].db==p[1].db 
a4f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a500: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
a510: 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28 70  kMemInvariants(p
a520: 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 54  ) );..      /* T
a530: 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65 61  his block is rea
a540: 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20 76  lly an inlined v
a550: 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  ersion of sqlite
a560: 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
a570: 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  ).      ** that 
a580: 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65 20  takes advantage 
a590: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
a5a0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   the memory cell
a5b0: 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20 20   value is .     
a5c0: 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74 6f   ** being set to
a5d0: 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c 65   NULL after rele
a5e0: 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d 69  asing any dynami
a5f0: 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 20  c resources..   
a600: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
a610: 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f 6e  he justification
a620: 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e 67   for duplicating
a630: 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61 63   code is that ac
a640: 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20 20  cording to .    
a650: 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c 20    ** callgrind, 
a660: 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63 65  this causes a ce
a670: 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65 20  rtain test case 
a680: 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20 34  to hit the CPU 4
a690: 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65 72  .7 .      ** per
a6a0: 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20 6c  cent less (x86 l
a6b0: 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69 6f  inux, gcc versio
a6c0: 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74 68  n 4.1.2, -O6) th
a6d0: 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a 20  an if .      ** 
a6e0: 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61 73  sqlite3MemReleas
a6f0: 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64 20  e() were called 
a700: 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68 20  from here. With 
a710: 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73 0a  -O2, this jumps.
a720: 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36 20        ** to 6.6 
a730: 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65 73  percent. The tes
a740: 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72 74  t case is insert
a750: 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69 6e  ing 1000 rows in
a760: 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20 20  to a table .    
a770: 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e 64    ** with no ind
a780: 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69 6e  exes using a sin
a790: 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e 53  gle prepared INS
a7a0: 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20 62  ERT statement, b
a7b0: 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ind() .      ** 
a7c0: 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e 73  and reset(). Ins
a7d0: 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65 64  erts are grouped
a7e0: 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63 74   into a transact
a7f0: 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
a800: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
a810: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67 67  >flags & MEM_Agg
a820: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
a830: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
a840: 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20 20  EM_Dyn );.      
a850: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
a860: 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20 29  gs & MEM_Frame )
a870: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
a880: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
a890: 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20 20  _RowSet );.     
a8a0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28 4d   if( p->flags&(M
a8b0: 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d  EM_Agg|MEM_Dyn|M
a8c0: 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77  EM_Frame|MEM_Row
a8d0: 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Set) ){.        
a8e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
a8f0: 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20 20  lease(p);.      
a900: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a 4d  }else if( p->szM
a910: 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 20  alloc ){.       
a920: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
a930: 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a  b, p->zMalloc);.
a940: 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 6c          p->szMal
a950: 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  loc = 0;.      }
a960: 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67 73  ..      p->flags
a970: 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64   = MEM_Undefined
a980: 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28 2b  ;.    }while( (+
a990: 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20  +p)<pEnd );.    
a9a0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a9b0: 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64   = malloc_failed
a9c0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  ;.  }.}../*.** D
a9d0: 65 6c 65 74 65 20 61 20 56 64 62 65 46 72 61 6d  elete a VdbeFram
a9e0: 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69 74 73  e object and its
a9f0: 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62 65 46   contents. VdbeF
aa00: 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61 72 65  rame objects are
aa10: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
aa20: 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61 6d 20   the OP_Program 
aa30: 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69 74 65  opcode in sqlite
aa40: 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a 2f 0a  3VdbeExec()..*/.
aa50: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
aa60: 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64 62 65  FrameDelete(Vdbe
aa70: 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Frame *p){.  int
aa80: 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65 6d 20   i;.  Mem *aMem 
aa90: 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d 28 70  = VdbeFrameMem(p
aaa0: 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  );.  VdbeCursor 
aab0: 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62 65 43  **apCsr = (VdbeC
aac0: 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d 5b 70  ursor **)&aMem[p
aad0: 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a 20 20  ->nChildMem];.  
aae0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43  for(i=0; i<p->nC
aaf0: 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b 0a 20  hildCsr; i++){. 
ab00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
ab10: 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c 20 61  eeCursor(p->v, a
ab20: 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  pCsr[i]);.  }.  
ab30: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
ab40: 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c 64 4d  aMem, p->nChildM
ab50: 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  em);.  sqlite3Db
ab60: 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70  Free(p->v->db, p
ab70: 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
ab80: 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49  LITE_OMIT_EXPLAI
ab90: 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c  N./*.** Give a l
aba0: 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72  isting of the pr
abb0: 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72  ogram in the vir
abc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a  tual machine..**
abd0: 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63  .** The interfac
abe0: 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  e is the same as
abf0: 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63   sqlite3VdbeExec
ac00: 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64  ().  But instead
ac10: 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74   of.** running t
ac20: 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f  he code, it invo
ac30: 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  kes the callback
ac40: 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69   once for each i
ac50: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54  nstruction..** T
ac60: 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20 75  his feature is u
ac70: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
ac80: 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a   "EXPLAIN"..**.*
ac90: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
aca0: 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72  n==1, each instr
acb0: 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64  uction is listed
acc0: 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78  .  When.** p->ex
acd0: 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f  plain==2, only O
ace0: 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75  P_Explain instru
acf0: 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65  ctions are liste
ad00: 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61  d and these.** a
ad10: 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69  re shown in a di
ad20: 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20  fferent format. 
ad30: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69   p->explain==2 i
ad40: 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  s used to implem
ad50: 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51  ent.** EXPLAIN Q
ad60: 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a  UERY PLAN..**.**
ad70: 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e   When p->explain
ad80: 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d  ==1, first the m
ad90: 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c  ain program is l
ada0: 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68  isted, then each
adb0: 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67   of.** the trigg
adc0: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
add0: 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79  re listed one by
ade0: 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   one..*/.int sql
adf0: 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20  ite3VdbeList(.  
ae00: 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20 20  Vdbe *p         
ae10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
ae20: 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e   VDBE */.){.  in
ae30: 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20  t nRow;         
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20     /* Stop when 
ae60: 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65  row count reache
ae70: 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20  s this */.  int 
ae80: 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  nSub = 0;       
ae90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aea0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75   /* Number of su
aeb0: 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20  b-vdbes seen so 
aec0: 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67  far */.  SubProg
aed0: 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b  ram **apSub = 0;
aee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aef0: 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64   Array of sub-vd
af00: 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53  bes */.  Mem *pS
af10: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af30: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c   Memory cell hol
af40: 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  d array of subpr
af50: 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ogs */.  sqlite3
af60: 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20   *db = p->db;   
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af80: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
af90: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
afa0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
afb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afc0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
afd0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  er */.  int rc =
afe0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b000: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
b010: 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d   Mem *pMem = &p-
b020: 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20  >aMem[1];       
b030: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d        /* First M
b040: 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74  em of result set
b050: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
b060: 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61  ->explain );.  a
b070: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
b080: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
b090: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b0a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
b0b0: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42   p->rc==SQLITE_B
b0c0: 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  USY || p->rc==SQ
b0d0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20  LITE_NOMEM );.. 
b0e0: 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20   /* Even though 
b0f0: 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73  this opcode does
b100: 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63   not use dynamic
b110: 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a   strings for.  *
b120: 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65  * the result, re
b130: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79  sult columns may
b140: 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20   become dynamic 
b150: 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c  if the user call
b160: 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63  s.  ** sqlite3_c
b170: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20  olumn_text16(), 
b180: 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c  causing a transl
b190: 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20  ation to UTF-16 
b1a0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20  encoding..  */. 
b1b0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
b1c0: 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e  (pMem, 8);.  p->
b1d0: 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a  pResultSet = 0;.
b1e0: 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51  .  if( p->rc==SQ
b1f0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
b200: 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
b210: 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  s if a malloc() 
b220: 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20 74 6f  inside a call to
b230: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b240: 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20 2a 2a  text() or.    **
b250: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
b260: 74 65 78 74 31 36 28 29 20 66 61 69 6c 65 64 2e  text16() failed.
b270: 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c    */.    db->mal
b280: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  locFailed = 1;. 
b290: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
b2a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f  _ERROR;.  }..  /
b2b0: 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
b2c0: 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73  r of output rows
b2d0: 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c 20 74   reaches nRow, t
b2e0: 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a 20 20  hat means the.  
b2f0: 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73 20 66  ** listing has f
b300: 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71 6c 69  inished and sqli
b310: 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f 75 6c  te3_step() shoul
b320: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
b330: 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f 77 20  DONE..  ** nRow 
b340: 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  is the sum of th
b350: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
b360: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   in the main pro
b370: 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a 2a 20  gram, plus.  ** 
b380: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 6e  the sum of the n
b390: 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e  umber of rows in
b3a0: 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73 75 62   all trigger sub
b3b0: 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75 6e 74  programs encount
b3c0: 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66 61 72  ered.  ** so far
b3d0: 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61 6c 75  .  The nRow valu
b3e0: 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73 65 20  e will increase 
b3f0: 61 73 20 6e 65 77 20 74 72 69 67 67 65 72 20 73  as new trigger s
b400: 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65 0a 20  ubprograms are. 
b410: 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   ** encountered,
b420: 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c 6c 20   but p->pc will 
b430: 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74 63 68  eventually catch
b440: 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20 20 2a   up to nRow..  *
b450: 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e 6e 4f  /.  nRow = p->nO
b460: 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  p;.  if( p->expl
b470: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 2f 2a  ain==1 ){.    /*
b480: 20 54 68 65 20 66 69 72 73 74 20 38 20 6d 65 6d   The first 8 mem
b490: 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20 75 73  ory cells are us
b4a0: 65 64 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c  ed for the resul
b4b0: 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20 77 69  t set.  So we wi
b4c0: 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  ll.    ** comman
b4d0: 64 65 65 72 20 74 68 65 20 39 74 68 20 63 65 6c  deer the 9th cel
b4e0: 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74 6f 72  l to use as stor
b4f0: 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72 61 79  age for an array
b500: 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20 20 20   of pointers.   
b510: 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72 20 73   ** to trigger s
b520: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54 68 65  ubprograms.  The
b530: 20 56 44 42 45 20 69 73 20 67 75 61 72 61 6e 74   VDBE is guarant
b540: 65 65 64 20 74 6f 20 68 61 76 65 20 61 74 20 6c  eed to have at l
b550: 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20 63 65  east 9.    ** ce
b560: 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61 73 73  lls.  */.    ass
b570: 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39 20 29  ert( p->nMem>9 )
b580: 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26 70 2d  ;.    pSub = &p-
b590: 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20 69 66  >aMem[9];.    if
b5a0: 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26 4d 45  ( pSub->flags&ME
b5b0: 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20  M_Blob ){.      
b5c0: 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20  /* On the first 
b5d0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
b5e0: 73 74 65 70 28 29 2c 20 70 53 75 62 20 77 69 6c  step(), pSub wil
b5f0: 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e 20 20  l hold a NULL.  
b600: 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 69  It is.      ** i
b610: 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20  nitialized to a 
b620: 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34 5f 53  BLOB by the P4_S
b630: 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63 65 73  UBPROGRAM proces
b640: 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c 6f 77  sing logic below
b650: 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62 20 3d   */.      nSub =
b660: 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f 66 28   pSub->n/sizeof(
b670: 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20 61 70  Vdbe*);.      ap
b680: 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61  Sub = (SubProgra
b690: 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20  m **)pSub->z;.  
b6a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
b6b0: 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b 0a 20   i<nSub; i++){. 
b6c0: 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61 70 53       nRow += apS
b6d0: 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20  ub[i]->nOp;.    
b6e0: 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20  }.  }..  do{.   
b6f0: 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a 20 20   i = p->pc++;.  
b700: 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77 20 26  }while( i<nRow &
b710: 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20  & p->explain==2 
b720: 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  && p->aOp[i].opc
b730: 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69 6e 20  ode!=OP_Explain 
b740: 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52 6f 77  );.  if( i>=nRow
b750: 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
b760: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
b770: 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
b780: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64 62 2d  .  }else if( db-
b790: 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65  >u1.isInterrupte
b7a0: 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d  d ){.    p->rc =
b7b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
b7c0: 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  T;.    rc = SQLI
b7d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
b7e0: 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72 28 70  lite3VdbeError(p
b7f0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
b800: 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c 73 65  p->rc));.  }else
b810: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 34 3b  {.    char *zP4;
b820: 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  .    Op *pOp;.  
b830: 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70 20 29    if( i<p->nOp )
b840: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  {.      /* The o
b850: 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d 62 65  utput line numbe
b860: 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  r is small enoug
b870: 68 20 74 68 61 74 20 77 65 20 61 72 65 20 73 74  h that we are st
b880: 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ill in the.     
b890: 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d   ** main program
b8a0: 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70 20 3d  . */.      pOp =
b8b0: 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20   &p->aOp[i];.   
b8c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
b8d0: 20 57 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c   We are currentl
b8e0: 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70 72 6f  y listing subpro
b8f0: 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65 20 6f  grams.  Figure o
b900: 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61 6e 64  ut which one and
b910: 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b 20 75  .      ** pick u
b920: 70 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74  p the appropriat
b930: 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20 20 20  e opcode. */.   
b940: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
b950: 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20  i -= p->nOp;.   
b960: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e 3d 61     for(j=0; i>=a
b970: 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20 6a 2b  pSub[j]->nOp; j+
b980: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2d 3d  +){.        i -=
b990: 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 0a   apSub[j]->nOp;.
b9a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f        }.      pO
b9b0: 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d 3e 61  p = &apSub[j]->a
b9c0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  Op[i];.    }.   
b9d0: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
b9e0: 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d 65 6d  =1 ){.      pMem
b9f0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
ba00: 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  t;.      pMem->u
ba10: 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20 20 20  .i = i;         
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba30: 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67 72 61         /* Progra
ba40: 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  m counter */.   
ba50: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 20 20     pMem++;.  .  
ba60: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ba70: 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d 45 4d  = MEM_Static|MEM
ba80: 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20  _Str|MEM_Term;. 
ba90: 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28       pMem->z = (
baa0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f 70 63  char*)sqlite3Opc
bab0: 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63  odeName(pOp->opc
bac0: 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64 65 20  ode); /* Opcode 
bad0: 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
bae0: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
baf0: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
bb00: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
bb10: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
bb20: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
bb30: 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70 4d  E_UTF8;.      pM
bb40: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  em++;..      /* 
bb50: 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f 67 72  When an OP_Progr
bb60: 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65 6e 63  am opcode is enc
bb70: 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e 6c 79  ounter (the only
bb80: 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68 61 73   opcode that has
bb90: 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34 5f 53  .      ** a P4_S
bba0: 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75 6d 65  UBPROGRAM argume
bbb0: 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68 65 20  nt), expand the 
bbc0: 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61  size of the arra
bbd0: 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d 73  y of subprograms
bbe0: 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74 20 69  .      ** kept i
bbf0: 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a 20 74  n p->aMem[9].z t
bc00: 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 70  o hold the new p
bc10: 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d 69 6e  rogram - assumin
bc20: 67 20 74 68 69 73 20 73 75 62 70 72 6f 67 72 61  g this subprogra
bc30: 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 6e  m.      ** has n
bc40: 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ot already been 
bc50: 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  seen..      */. 
bc60: 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 34       if( pOp->p4
bc70: 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52 4f 47  type==P4_SUBPROG
bc80: 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  RAM ){.        i
bc90: 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53 75 62  nt nByte = (nSub
bca0: 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62 50 72  +1)*sizeof(SubPr
bcb0: 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20  ogram*);.       
bcc0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
bcd0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75 62 3b  for(j=0; j<nSub;
bce0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
bcf0: 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d 3d 70   if( apSub[j]==p
bd00: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20  Op->p4.pProgram 
bd10: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
bd20: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a   }.        if( j
bd30: 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49 54 45  ==nSub && SQLITE
bd40: 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64 62 65  _OK==sqlite3Vdbe
bd50: 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20 6e 42  MemGrow(pSub, nB
bd60: 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20 29 7b  yte, nSub!=0) ){
bd70: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
bd80: 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d 20 2a   = (SubProgram *
bd90: 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 20  *)pSub->z;.     
bda0: 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75 62 2b       apSub[nSub+
bdb0: 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 50 72  +] = pOp->p4.pPr
bdc0: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 20  ogram;.         
bdd0: 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c 3d 20   pSub->flags |= 
bde0: 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20 20 20  MEM_Blob;.      
bdf0: 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20 6e 53      pSub->n = nS
be00: 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50 72 6f  ub*sizeof(SubPro
be10: 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20 20 20  gram*);.        
be20: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
be30: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
be40: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
be50: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
be60: 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p1;            
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be80: 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P1 */.    pMem+
be90: 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  +;..    pMem->fl
bea0: 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
beb0: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70     pMem->u.i = p
bec0: 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20 20 20  Op->p2;         
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bee0: 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20 70 4d   /* P2 */.    pM
bef0: 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d  em++;..    pMem-
bf00: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
bf10: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
bf20: 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20 20 20  = pOp->p3;      
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf40: 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20 20 20      /* P3 */.   
bf50: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66   pMem++;..    if
bf60: 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  ( sqlite3VdbeMem
bf70: 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70  ClearAndResize(p
bf80: 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f 2a 20  Mem, 100) ){ /* 
bf90: 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  P4 */.      asse
bfa0: 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  rt( p->db->mallo
bfb0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
bfc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
bfd0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
bfe0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bff0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
c000: 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70 6c 61      zP4 = displa
c010: 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d 3e 7a  yP4(pOp, pMem->z
c020: 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63  , pMem->szMalloc
c030: 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34 21 3d  );.    if( zP4!=
c040: 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 20  pMem->z ){.     
c050: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
c060: 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50 34 2c  etStr(pMem, zP4,
c070: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
c080: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
c090: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
c0a0: 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 20  Mem->z!=0 );.   
c0b0: 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c     pMem->n = sql
c0c0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 4d 65  ite3Strlen30(pMe
c0d0: 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70 4d 65  m->z);.      pMe
c0e0: 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f  m->enc = SQLITE_
c0f0: 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20 20 20  UTF8;.    }.    
c100: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69 66 28  pMem++;..    if(
c110: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29   p->explain==1 )
c120: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
c130: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
c140: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 34  ndResize(pMem, 4
c150: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
c160: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
c170: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
c180: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c190: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
c1a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c1b0: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
c1c0: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
c1d0: 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20 20 20  m->n = 2;.      
c1e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
c1f0: 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e  (3, pMem->z, "%.
c200: 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b 20 20  2x", pOp->p5);  
c210: 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20 20 20   /* P5 */.      
c220: 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49  pMem->enc = SQLI
c230: 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20 70  TE_UTF8;.      p
c240: 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64 65 66  Mem++;.  .#ifdef
c250: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
c260: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
c270: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c280: 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64  3VdbeMemClearAnd
c290: 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35 30 30  Resize(pMem, 500
c2a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  ) ){.        ass
c2b0: 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  ert( p->db->mall
c2c0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
c2d0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
c2e0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
c2f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
c300: 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  gs = MEM_Str|MEM
c310: 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65  _Term;.      pMe
c320: 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79 43 6f  m->n = displayCo
c330: 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c 20  mment(pOp, zP4, 
c340: 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20  pMem->z, 500);. 
c350: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
c360: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
c370: 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  lse.      pMem->
c380: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
c390: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c3a0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 65          /* Comme
c3b0: 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 20  nt */.#endif.   
c3c0: 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65 73 43   }..    p->nResC
c3d0: 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a 28 70  olumn = 8 - 4*(p
c3e0: 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a 20 20  ->explain-1);.  
c3f0: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
c400: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20  = &p->aMem[1];. 
c410: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
c420: 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53  E_OK;.    rc = S
c430: 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20  QLITE_ROW;.  }. 
c440: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
c450: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
c460: 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
c470: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
c480: 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  BUG./*.** Print 
c490: 74 68 65 20 53 51 4c 20 74 68 61 74 20 77 61 73  the SQL that was
c4a0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
c4b0: 65 20 61 20 56 44 42 45 20 70 72 6f 67 72 61 6d  e a VDBE program
c4c0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
c4d0: 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28 56 64  3VdbePrintSql(Vd
c4e0: 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73 74 20  be *p){.  const 
c4f0: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 69  char *z = 0;.  i
c500: 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20  f( p->zSql ){.  
c510: 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20    z = p->zSql;. 
c520: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6e 4f   }else if( p->nO
c530: 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73  p>=1 ){.    cons
c540: 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20  t VdbeOp *pOp = 
c550: 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 20 20  &p->aOp[0];.    
c560: 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d  if( pOp->opcode=
c570: 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d  =OP_Init && pOp-
c580: 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20  >p4.z!=0 ){.    
c590: 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b    z = pOp->p4.z;
c5a0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
c5b0: 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a 7a 29  lite3Isspace(*z)
c5c0: 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   ) z++;.    }.  
c5d0: 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72 69 6e  }.  if( z ) prin
c5e0: 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  tf("SQL: [%s]\n"
c5f0: 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  , z);.}.#endif..
c600: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
c610: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
c620: 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
c630: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
c640: 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e  )./*.** Print an
c650: 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61 67 65   IOTRACE message
c660: 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63 6f 6e   showing SQL con
c670: 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tent..*/.void sq
c680: 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61 63 65  lite3VdbeIOTrace
c690: 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  Sql(Vdbe *p){.  
c6a0: 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70  int nOp = p->nOp
c6b0: 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b  ;.  VdbeOp *pOp;
c6c0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 6f  .  if( sqlite3Io
c6d0: 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74 75 72  Trace==0 ) retur
c6e0: 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31 20 29  n;.  if( nOp<1 )
c6f0: 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70 20 3d   return;.  pOp =
c700: 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69   &p->aOp[0];.  i
c710: 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d  f( pOp->opcode==
c720: 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e  OP_Init && pOp->
c730: 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20 20 69  p4.z!=0 ){.    i
c740: 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63 68 61  nt i, j;.    cha
c750: 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20 20 73  r z[1000];.    s
c760: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
c770: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
c780: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a  s", pOp->p4.z);.
c790: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73 71 6c      for(i=0; sql
c7a0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
c7b0: 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f  ); i++){}.    fo
c7c0: 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(j=0; z[i]; i++
c7d0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
c7e0: 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b 69 5d  ite3Isspace(z[i]
c7f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
c800: 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29 7b 0a   z[i-1]!=' ' ){.
c810: 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d            z[j++]
c820: 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20 20 20   = ' ';.        
c830: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
c840: 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20         z[j++] = 
c850: 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  z[i];.      }.  
c860: 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 30    }.    z[j] = 0
c870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54  ;.    sqlite3IoT
c880: 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e 22 2c  race("SQL %s\n",
c890: 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69   z);.  }.}.#endi
c8a0: 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49  f /* !SQLITE_OMI
c8b0: 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c 49 54  T_TRACE && SQLIT
c8c0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
c8d0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63   */../*.** Alloc
c8e0: 61 74 65 20 73 70 61 63 65 20 66 72 6f 6d 20 61  ate space from a
c8f0: 20 66 69 78 65 64 20 73 69 7a 65 20 62 75 66 66   fixed size buff
c900: 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  er and return a 
c910: 70 6f 69 6e 74 65 72 20 74 6f 0a 2a 2a 20 74 68  pointer to.** th
c920: 61 74 20 73 70 61 63 65 2e 20 20 49 66 20 69 6e  at space.  If in
c930: 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65  sufficient space
c940: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72   is available, r
c950: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  eturn NULL..**.*
c960: 2a 20 54 68 65 20 70 42 75 66 20 70 61 72 61 6d  * The pBuf param
c970: 65 74 65 72 20 69 73 20 74 68 65 20 69 6e 69 74  eter is the init
c980: 69 61 6c 20 76 61 6c 75 65 20 6f 66 20 61 20 70  ial value of a p
c990: 6f 69 6e 74 65 72 20 77 68 69 63 68 20 77 69 6c  ointer which wil
c9a0: 6c 0a 2a 2a 20 72 65 63 65 69 76 65 20 74 68 65  l.** receive the
c9b0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 70 42   new memory.  pB
c9c0: 75 66 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e  uf is normally N
c9d0: 55 4c 4c 2e 20 20 49 66 20 70 42 75 66 20 69 73  ULL.  If pBuf is
c9e0: 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74   not.** NULL, it
c9f0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6d 65 6d 6f   means that memo
ca00: 72 79 20 73 70 61 63 65 20 68 61 73 20 61 6c 72  ry space has alr
ca10: 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61  eady been alloca
ca20: 74 65 64 20 61 6e 64 20 74 68 61 74 0a 2a 2a 20  ted and that.** 
ca30: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  this routine sho
ca40: 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65  uld not allocate
ca50: 20 61 6e 79 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   any new memory.
ca60: 20 20 57 68 65 6e 20 70 42 75 66 20 69 73 20 6e    When pBuf is n
ca70: 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c  ot.** NULL simpl
ca80: 79 20 72 65 74 75 72 6e 20 70 42 75 66 2e 20 20  y return pBuf.  
ca90: 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74 65 20 6e 65  Only allocate ne
caa0: 77 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 77  w memory space w
cab0: 68 65 6e 20 70 42 75 66 0a 2a 2a 20 69 73 20 4e  hen pBuf.** is N
cac0: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65  ULL..**.** nByte
cad0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
cae0: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
caf0: 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 70   needed..**.** p
cb00: 46 72 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 2a  From points to *
cb10: 70 6e 46 72 6f 6d 20 62 79 74 65 73 20 6f 66 20  pnFrom bytes of 
cb20: 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e  available space.
cb30: 20 20 4e 65 77 20 73 70 61 63 65 20 69 73 20 61    New space is a
cb40: 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 72 6f 6d  llocated.** from
cb50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
cb60: 70 46 72 6f 6d 20 62 75 66 66 65 72 20 61 6e 64  pFrom buffer and
cb70: 20 2a 70 6e 46 72 6f 6d 20 69 73 20 64 65 63 72   *pnFrom is decr
cb80: 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a  emented..**.** *
cb90: 70 6e 4e 65 65 64 65 64 20 69 73 20 61 20 63 6f  pnNeeded is a co
cba0: 75 6e 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d  unter of the num
cbb0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20  ber of bytes of 
cbc0: 73 70 61 63 65 20 74 68 61 74 20 68 61 76 65 20  space that have 
cbd0: 66 61 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c  failed.** to all
cbe0: 6f 63 61 74 65 2e 20 20 49 66 20 74 68 65 72 65  ocate.  If there
cbf0: 20 69 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74   is insufficient
cc00: 20 73 70 61 63 65 20 69 6e 20 70 46 72 6f 6d 20   space in pFrom 
cc10: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
cc20: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
cc30: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 4e 65 65  increment *pnNee
cc40: 64 65 64 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  ded by the amoun
cc50: 74 20 6f 66 20 74 68 65 20 72 65 71 75 65 73 74  t of the request
cc60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cc70: 20 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20   *allocSpace(.  
cc80: 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
cc90: 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65       /* Where re
cca0: 74 75 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c  turn pointer wil
ccb0: 6c 20 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20  l be stored */. 
ccc0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20   int nByte,     
ccd0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
cce0: 6f 66 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f  of bytes to allo
ccf0: 63 61 74 65 20 2a 2f 0a 20 20 75 38 20 2a 70 46  cate */.  u8 *pF
cd00: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 20 20 2f  rom,           /
cd10: 2a 20 4d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62  * Memory availab
cd20: 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f  le for allocatio
cd30: 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 46 72  n */.  int *pnFr
cd40: 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49  om,         /* I
cd50: 4e 2f 4f 55 54 3a 20 53 70 61 63 65 20 61 76 61  N/OUT: Space ava
cd60: 69 6c 61 62 6c 65 20 61 74 20 70 46 72 6f 6d 20  ilable at pFrom 
cd70: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4e 65 65 64  */.  int *pnNeed
cd80: 65 64 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ed        /* If 
cd90: 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 61 6e 6e 6f  allocation canno
cda0: 74 20 62 65 20 6d 61 64 65 2c 20 69 6e 63 72 65  t be made, incre
cdb0: 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 2a 2f 0a  ment *pnByte */.
cdc0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  ){.  assert( EIG
cdd0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
cde0: 54 28 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66  T(pFrom) );.  if
cdf0: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
ce00: 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38 28   nByte = ROUND8(
ce10: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
ce20: 6e 42 79 74 65 20 3c 3d 20 2a 70 6e 46 72 6f 6d  nByte <= *pnFrom
ce30: 20 29 7b 0a 20 20 20 20 20 20 2a 70 6e 46 72 6f   ){.      *pnFro
ce40: 6d 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20  m -= nByte;.    
ce50: 20 20 70 42 75 66 20 3d 20 26 70 46 72 6f 6d 5b    pBuf = &pFrom[
ce60: 2a 70 6e 46 72 6f 6d 5d 3b 0a 20 20 20 20 7d 65  *pnFrom];.    }e
ce70: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 6e 4e 65  lse{.      *pnNe
ce80: 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a 20  eded += nByte;. 
ce90: 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
cea0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
ceb0: 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29 3b  IGNMENT(pBuf) );
cec0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
ced0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
cee0: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
cef0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
cf00: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
cf10: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
cf20: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
cf30: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
cf40: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
cf50: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
cf60: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
cf70: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
cf80: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
cf90: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
cfa0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
cfb0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
cfc0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
cfd0: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
cfe0: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
cff0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
d000: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
d010: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
d020: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
d030: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
d040: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
d050: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
d060: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
d070: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
d080: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
d090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
d0a0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
d0b0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
d0c0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
d0d0: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
d0e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
d0f0: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
d100: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
d110: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
d120: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
d130: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
d140: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
d150: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
d160: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
d170: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
d180: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
d190: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
d1a0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
d1b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
d1c0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
d1d0: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
d1e0: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
d1f0: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
d200: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
d210: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
d220: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
d230: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
d240: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
d250: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
d260: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
d270: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
d280: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
d290: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
d2a0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
d2b0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
d2c0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
d2d0: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
d2e0: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
d2f0: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
d300: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
d310: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
d320: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
d330: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
d340: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
d350: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
d360: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
d370: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
d380: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
d390: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
d3a0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
d3b0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
d3c0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
d3d0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
d3e0: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
d3f0: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
d400: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
d410: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
d420: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
d430: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
d440: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
d450: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
d460: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
d470: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
d480: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
d490: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
d4a0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
d4b0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
d4c0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
d4d0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
d4e0: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
d4f0: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
d500: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
d510: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
d520: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
d530: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
d540: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
d550: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
d560: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
d570: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
d580: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d590: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
d5a0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
d5b0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
d5c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
d5d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
d5e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
d5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d600: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
d610: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d620: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
d630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d640: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
d650: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
d660: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
d670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d680: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
d690: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
d6a0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
d6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d6c0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
d6d0: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
d6e0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d700: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
d710: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
d720: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
d730: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
d740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d750: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
d760: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
d770: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
d780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d790: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
d7a0: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  ter */.  int nFr
d7b0: 65 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ee;             
d7c0: 20 20 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c          /* Avail
d7d0: 61 62 6c 65 20 66 72 65 65 20 73 70 61 63 65 20  able free space 
d7e0: 2a 2f 0a 20 20 75 38 20 2a 7a 43 73 72 3b 20 20  */.  u8 *zCsr;  
d7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d800: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76      /* Memory av
d810: 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f  ailable for allo
d820: 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  cation */.  int 
d830: 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20  nByte;          
d840: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f             /* Ho
d850: 77 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d  w much extra mem
d860: 6f 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f  ory is needed */
d870: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
d880: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
d890: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
d8a0: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
d8b0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
d8c0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
d8d0: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
d8e0: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
d8f0: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
d900: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
d910: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
d920: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
d930: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
d940: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
d950: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
d960: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
d970: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
d980: 4d 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20  MaxArg;.  nOnce 
d990: 3d 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b  = pParse->nOnce;
d9a0: 0a 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20  .  if( nOnce==0 
d9b0: 29 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20  ) nOnce = 1; /* 
d9c0: 45 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20  Ensure at least 
d9d0: 6f 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61  one byte in p->a
d9e0: 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20  OnceFlag[] */.  
d9f0: 0a 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63  .  /* For each c
da00: 75 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20  ursor required, 
da10: 61 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20  also allocate a 
da20: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d  memory cell. Mem
da30: 6f 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28  ory.  ** cells (
da40: 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e  nMem+1-nCursor).
da50: 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65  .nMem, inclusive
da60: 2c 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20  , will never be 
da70: 75 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65  used by.  ** the
da80: 20 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49   vdbe program. I
da90: 6e 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20  nstead they are 
daa0: 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65  used to allocate
dab0: 20 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20   space for.  ** 
dac0: 56 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72  VdbeCursor/BtCur
dad0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20  sor structures. 
dae0: 54 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f  The blob of memo
daf0: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
db00: 74 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20  th .  ** cursor 
db10: 30 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d  0 is stored in m
db20: 65 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e  emory cell nMem.
db30: 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d   Memory cell (nM
db40: 65 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65  em-1).  ** store
db50: 73 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65  s the blob of me
db60: 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
db70: 77 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65  with cursor 1, e
db80: 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65  tc..  **.  ** Se
db90: 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65  e also: allocate
dba0: 43 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20  Cursor()..  */. 
dbb0: 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72   nMem += nCursor
dbc0: 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
dbd0: 20 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72   space for memor
dbe0: 79 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c  y registers, SQL
dbf0: 20 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45   variables, VDBE
dc00: 20 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20   cursors and .  
dc10: 2a 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d  ** an array to m
dc20: 61 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74  arshal SQL funct
dc30: 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  ion arguments in
dc40: 2e 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20  ..  */.  zCsr = 
dc50: 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 20 2b 20  ((u8*)p->aOp) + 
dc60: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70  ROUND8(sizeof(Op
dc70: 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20  )*p->nOp);      
dc80: 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 70 61  /* Available spa
dc90: 63 65 20 2a 2f 0a 20 20 6e 46 72 65 65 20 3d 20  ce */.  nFree = 
dca0: 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f  pParse->szOpAllo
dcb0: 63 20 2d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  c - ROUND8(sizeo
dcc0: 66 28 4f 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 2f  f(Op)*p->nOp); /
dcd0: 2a 20 53 69 7a 65 20 6f 66 20 7a 43 73 72 20 2a  * Size of zCsr *
dce0: 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  /..  resolveP2Va
dcf0: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
dd00: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
dd10: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
dd20: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
dd30: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
dd40: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
dd50: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
dd60: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
dd70: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
dd80: 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20  memset(zCsr, 0, 
dd90: 6e 46 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  nFree);.  assert
dda0: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
ddb0: 47 4e 4d 45 4e 54 28 26 7a 43 73 72 5b 6e 46 72  GNMENT(&zCsr[nFr
ddc0: 65 65 5d 29 20 29 3b 0a 20 20 70 2d 3e 65 78 70  ee]) );.  p->exp
ddd0: 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ired = 0;..  /* 
dde0: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
ddf0: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
de00: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
de10: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  s allocated in t
de20: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
de30: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
de40: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
de50: 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65  use unused space
de60: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
de70: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
de80: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
de90: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
dea0: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
deb0: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
dec0: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
ded0: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
dee0: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
def0: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
df00: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
df10: 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68  st using a fresh
df20: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
df30: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
df40: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
df50: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
df60: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
df70: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
df80: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70   the leftover sp
df90: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
dfa0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
dfb0: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  ay can significa
dfc0: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
dfd0: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
dfe0: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
dff0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
e000: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  nt..  */.  do {.
e010: 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20      nByte = 0;. 
e020: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
e030: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c  ocSpace(p->aMem,
e040: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
e050: 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65 2c  ), zCsr, &nFree,
e060: 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d   &nByte);.    p-
e070: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
e080: 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72  ce(p->aVar, nVar
e090: 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a 43  *sizeof(Mem), zC
e0a0: 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79  sr, &nFree, &nBy
e0b0: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72  te);.    p->apAr
e0c0: 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  g = allocSpace(p
e0d0: 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69  ->apArg, nArg*si
e0e0: 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 7a 43 73 72  zeof(Mem*), zCsr
e0f0: 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65  , &nFree, &nByte
e100: 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72 20  );.    p->azVar 
e110: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
e120: 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  azVar, nVar*size
e130: 6f 66 28 63 68 61 72 2a 29 2c 20 7a 43 73 72 2c  of(char*), zCsr,
e140: 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65 29   &nFree, &nByte)
e150: 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20 3d  ;.    p->apCsr =
e160: 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61   allocSpace(p->a
e170: 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73 69  pCsr, nCursor*si
e180: 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72 2a  zeof(VdbeCursor*
e190: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 73               zCs
e1b0: 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74  r, &nFree, &nByt
e1c0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63 65  e);.    p->aOnce
e1d0: 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63  Flag = allocSpac
e1e0: 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  e(p->aOnceFlag, 
e1f0: 6e 4f 6e 63 65 2c 20 7a 43 73 72 2c 20 26 6e 46  nOnce, zCsr, &nF
e200: 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 23 69  ree, &nByte);.#i
e210: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e220: 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
e230: 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63  US.    p->anExec
e240: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
e250: 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70 2a  >anExec, p->nOp*
e260: 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 7a 43 73  sizeof(i64), zCs
e270: 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74  r, &nFree, &nByt
e280: 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 69  e);.#endif.    i
e290: 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  f( nByte ){.    
e2a0: 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71 6c    p->pFree = sql
e2b0: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
e2c0: 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20 20  (db, nByte);.   
e2d0: 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70 2d   }.    zCsr = p-
e2e0: 3e 70 46 72 65 65 3b 0a 20 20 20 20 6e 46 72 65  >pFree;.    nFre
e2f0: 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 77 68  e = nByte;.  }wh
e300: 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64  ile( nByte && !d
e310: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e320: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
e330: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d   = nCursor;.  p-
e340: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
e350: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
e360: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
e370: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
e380: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
e390: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
e3a0: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
e3b0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
e3c0: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
e3d0: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
e3e0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72  }.  if( p->azVar
e3f0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   && pParse->nzVa
e400: 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a  r>0 ){.    p->nz
e410: 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a  Var = pParse->nz
e420: 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  Var;.    memcpy(
e430: 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65  p->azVar, pParse
e440: 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61  ->azVar, p->nzVa
e450: 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61  r*sizeof(p->azVa
e460: 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73  r[0]));.    mems
e470: 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  et(pParse->azVar
e480: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56  , 0, pParse->nzV
e490: 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  ar*sizeof(pParse
e4a0: 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20  ->azVar[0]));.  
e4b0: 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  }.  if( p->aMem 
e4c0: 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d  ){.    p->aMem--
e4d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
e4e0: 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d         /* aMem[]
e4f0: 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d   goes from 1..nM
e500: 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65  em */.    p->nMe
e510: 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20  m = nMem;       
e520: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20            /*    
e530: 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e     not from 0..n
e540: 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72  Mem-1 */.    for
e550: 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e  (n=1; n<=nMem; n
e560: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ++){.      p->aM
e570: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
e580: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
e590: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
e5a0: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
e5b0: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
e5c0: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
e5d0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
e5e0: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
e5f0: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
e600: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
e610: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
e620: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
e630: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
e640: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
e650: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
e660: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
e670: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
e680: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
e690: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
e6a0: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
e6b0: 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
e6c0: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
e6d0: 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
e6e0: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
e6f0: 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
e700: 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
e710: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
e720: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
e730: 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
e740: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
e750: 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
e760: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
e770: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  x->pBt ){.      
e780: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e790: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
e7a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
e7b0: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
e7c0: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
e7d0: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
e7e0: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
e7f0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
e800: 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
e810: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
e820: 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
e830: 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
e840: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
e850: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
e860: 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
e870: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e880: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
e890: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
e8a0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
e8b0: 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
e8c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
e8d0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
e8e0: 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
e8f0: 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
e900: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
e910: 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
e920: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
e930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
e940: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
e950: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
e960: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
e970: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
e980: 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
e990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e9a0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
e9b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
e9c0: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
e9d0: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
e9e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
e9f0: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
ea00: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
ea10: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
ea20: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
ea30: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
ea40: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
ea50: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
ea60: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
ea70: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
ea80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ea90: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
eaa0: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
eab0: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
eac0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
ead0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
eae0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
eaf0: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
eb00: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
eb10: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
eb20: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
eb30: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
eb40: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
eb50: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
eb60: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
eb70: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
eb80: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
eb90: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
eba0: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
ebb0: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
ebc0: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
ebd0: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
ebe0: 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
ebf0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
ec00: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
ec10: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
ec20: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
ec30: 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  if.  v->aOnceFla
ec40: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
ec50: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
ec60: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
ec70: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
ec80: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
ec90: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
eca0: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
ecb0: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
ecc0: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
ecd0: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
ece0: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
ecf0: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
ed00: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
ed10: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
ed20: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
ed30: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
ed40: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
ed50: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
ed60: 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
ed70: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
ed80: 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75 72  bChange;.  retur
ed90: 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a  n pFrame->pc;.}.
eda0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
edb0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20   cursors..**.** 
edc0: 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79  Also release any
edd0: 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20   dynamic memory 
ede0: 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69  held by the VM i
edf0: 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20  n the Vdbe.aMem 
ee00: 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20  memory .** cell 
ee10: 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e  array. This is n
ee20: 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20  ecessary as the 
ee30: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61  memory cell arra
ee40: 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a  y may contain.**
ee50: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62   pointers to Vdb
ee60: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20  eFrame objects, 
ee70: 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72  which may in tur
ee80: 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65  n contain pointe
ee90: 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75  rs to.** open cu
eea0: 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rsors..*/.static
eeb0: 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75   void closeAllCu
eec0: 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a  rsors(Vdbe *p){.
eed0: 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20    if( p->pFrame 
eee0: 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65  ){.    VdbeFrame
eef0: 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f   *pFrame;.    fo
ef00: 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61  r(pFrame=p->pFra
ef10: 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72  me; pFrame->pPar
ef20: 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61  ent; pFrame=pFra
ef30: 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20  me->pParent);.  
ef40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
ef50: 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65  meRestore(pFrame
ef60: 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65  );.    p->pFrame
ef70: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72   = 0;.    p->nFr
ef80: 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ame = 0;.  }.  a
ef90: 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65  ssert( p->nFrame
efa0: 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75  ==0 );.  closeCu
efb0: 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b  rsorsInFrame(p);
efc0: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
efd0: 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d  {.    releaseMem
efe0: 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b 31  Array(&p->aMem[1
eff0: 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d  ], p->nMem);.  }
f000: 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65  .  while( p->pDe
f010: 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64  lFrame ){.    Vd
f020: 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20  beFrame *pDel = 
f030: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20  p->pDelFrame;.  
f040: 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d    p->pDelFrame =
f050: 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a   pDel->pParent;.
f060: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f070: 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29  rameDelete(pDel)
f080: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65  ;.  }..  /* Dele
f090: 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61  te any auxdata a
f0a0: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20  llocations made 
f0b0: 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69  by the VM */.  i
f0c0: 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29  f( p->pAuxData )
f0d0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
f0e0: 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31 2c  teAuxData(p, -1,
f0f0: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
f100: 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
f110: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
f120: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
f130: 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f  a single run..*/
f140: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
f150: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
f160: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f170: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
f180: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
f190: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
f1a0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
f1b0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
f1c0: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
f1d0: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
f1e0: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
f1f0: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
f200: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
f210: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
f220: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
f230: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
f240: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
f250: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
f260: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
f270: 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e 6e  for(i=1; i<=p->n
f280: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
f290: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
f2a0: 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  gs==MEM_Undefine
f2b0: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
f2c0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f2d0: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f2e0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
f2f0: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
f300: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
f310: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
f320: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
f330: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
f340: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
f350: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
f360: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
f370: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
f380: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
f390: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
f3a0: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
f3b0: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
f3c0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
f3d0: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
f3e0: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
f3f0: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
f400: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
f410: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
f420: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f430: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
f440: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
f450: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
f460: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
f470: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
f480: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f490: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
f4a0: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f4b0: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
f4c0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
f4d0: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
f4e0: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
f4f0: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
f500: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
f510: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
f520: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
f530: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
f540: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f550: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
f560: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
f570: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
f580: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
f590: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
f5a0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
f5b0: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
f5c0: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
f5d0: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
f5e0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
f5f0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
f600: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
f610: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
f620: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
f630: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
f640: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
f650: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
f660: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
f670: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
f680: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
f690: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
f6a0: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
f6b0: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
f6c0: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
f6d0: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
f6e0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
f6f0: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
f700: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
f710: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
f720: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
f730: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
f740: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
f750: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
f760: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
f770: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
f780: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
f790: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f7a0: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
f7b0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f7d0: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
f7e0: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
f7f0: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
f800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f810: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
f820: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
f830: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
f840: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
f850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
f860: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
f870: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
f880: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f890: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
f8a0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f8b0: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
f8c0: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
f8d0: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
f8e0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
f8f0: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
f900: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
f910: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
f920: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
f930: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
f940: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
f950: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
f960: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
f970: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
f980: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f990: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
f9a0: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
f9b0: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
f9c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
f9d0: 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73 65  OMEM;.  }.  asse
f9e0: 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21  rt( p->aColName!
f9f0: 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65  =0 );.  pColName
fa00: 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65   = &(p->aColName
fa10: 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73  [idx+var*p->nRes
fa20: 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d  Column]);.  rc =
fa30: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
fa40: 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20  etStr(pColName, 
fa50: 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  zName, -1, SQLIT
fa60: 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20  E_UTF8, xDel);. 
fa70: 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20 7c   assert( rc!=0 |
fa80: 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f  | !zName || (pCo
fa90: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d  lName->flags&MEM
faa0: 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72  _Term)!=0 );.  r
fab0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
fac0: 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72 69  ** A read or wri
fad0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te transaction m
fae0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
faf0: 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61 62   active on datab
fb00: 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
fb10: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
fb20: 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63 6f  on is active, co
fb30: 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65 72  mmit it. If ther
fb40: 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d  e is a.** write-
fb50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e  transaction span
fb60: 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ning more than o
fb70: 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
fb80: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
fb90: 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66 20  * takes care of 
fba0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fbb0: 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a  al trickery..*/.
fbc0: 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43  static int vdbeC
fbd0: 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64  ommit(sqlite3 *d
fbe0: 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  b, Vdbe *p){.  i
fbf0: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61  nt i;.  int nTra
fc00: 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62  ns = 0;  /* Numb
fc10: 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  er of databases 
fc20: 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20 77  with an active w
fc30: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
fc40: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
fc50: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
fc60: 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b  needXcommit = 0;
fc70: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
fc80: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
fc90: 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73  E.  /* With this
fca0: 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33   option, sqlite3
fcb0: 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65  VtabSync() is de
fcc0: 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70  fined to be simp
fcd0: 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  ly .  ** SQLITE_
fce0: 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75  OK so p is not u
fcf0: 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55  sed. .  */.  UNU
fd00: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29  SED_PARAMETER(p)
fd10: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42  ;.#endif..  /* B
fd20: 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74  efore doing anyt
fd30: 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20  hing else, call 
fd40: 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c  the xSync() call
fd50: 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a  back for any.  *
fd60: 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65  * virtual module
fd70: 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20   tables written 
fd80: 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  in this transact
fd90: 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f  ion. This has to
fda0: 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65  .  ** be done be
fdb0: 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67  fore determining
fdc0: 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65   whether a maste
fdd0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
fde0: 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64  s .  ** required
fdf0: 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20  , as an xSync() 
fe00: 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64  callback may add
fe10: 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74   an attached dat
fe20: 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68  abase.  ** to th
fe30: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  e transaction.. 
fe40: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
fe50: 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70  e3VtabSync(db, p
fe60: 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  );..  /* This lo
fe70: 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61  op determines (a
fe80: 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  ) if the commit 
fe90: 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69  hook should be i
fea0: 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20  nvoked and.  ** 
feb0: 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74  (b) how many dat
fec0: 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65  abase files have
fed0: 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
fee0: 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20  sactions, not . 
fef0: 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68   ** including th
ff00: 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e  e temp database.
ff10: 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e   (b) is importan
ff20: 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72  t because if mor
ff30: 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65  e than .  ** one
ff40: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
ff50: 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65  as an open write
ff60: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
ff70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20  master journal. 
ff80: 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75   ** file is requ
ff90: 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d  ired for an atom
ffa0: 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20  ic commit..  */ 
ffb0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d  .  for(i=0; rc==
ffc0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ffd0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
ffe0: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
fff0: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10000 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
10010 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42  treeIsInTrans(pB
10020 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65 64  t) ){.      need
10030 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
10040 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e 54     if( i!=1 ) nT
10050 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73 71  rans++;.      sq
10060 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10070 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  pBt);.      rc =
10080 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78 63   sqlite3PagerExc
10090 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69 74  lusiveLock(sqlit
100a0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
100b0 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
100c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 29  3BtreeLeave(pBt)
100d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
100e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
100f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
10100 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
10110 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72 69  here are any wri
10120 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  te-transactions 
10130 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74  at all, invoke t
10140 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a  he commit hook *
10150 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f 6d  /.  if( needXcom
10160 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d  mit && db->xComm
10170 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  itCallback ){.  
10180 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d    rc = db->xComm
10190 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  itCallback(db->p
101a0 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20 20  CommitArg);.    
101b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
101c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
101d0 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
101e0 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  OOK;.    }.  }..
101f0 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65 20    /* The simple 
10200 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74  case - no more t
10210 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
10220 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74   file (not count
10230 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d  ing the.  ** TEM
10240 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73 20  P database) has 
10250 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63  a transaction ac
10260 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69 73  tive.   There is
10270 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68 65   no need for the
10280 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75  .  ** master-jou
10290 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rnal..  **.  ** 
102a0 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  If the return va
102b0 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42 74  lue of sqlite3Bt
102c0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 29  reeGetFilename()
102d0 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74   is a zero lengt
102e0 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69  h.  ** string, i
102f0 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69 6e  t means the main
10300 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d 65   database is :me
10310 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70 20  mory: or a temp 
10320 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20  file.  In .  ** 
10330 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f 20  that case we do 
10340 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f 6d  not support atom
10350 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f  ic multi-file co
10360 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74 68  mmits, so use th
10370 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63  e .  ** simple c
10380 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20  ase then too..  
10390 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c 69  */.  if( 0==sqli
103a0 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c 69  te3Strlen30(sqli
103b0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
103c0 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
103d0 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e  Bt)).   || nTran
103e0 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f  s<=1.  ){.    fo
103f0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10400 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10410 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10420 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10430 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10440 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10450 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10460 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10470 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20 20  eOne(pBt, 0);.  
10480 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10490 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69   /* Do the commi
104a0 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61  t only if all da
104b0 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73 66  tabases successf
104c0 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70 68  ully complete ph
104d0 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49  ase 1. .    ** I
104e0 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74 72  f one of the Btr
104f0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
10500 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20  () calls fails, 
10510 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 61  this indicates a
10520 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f  n.    ** IO erro
10530 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e 67  r while deleting
10540 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 61   or truncating a
10550 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
10560 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20  t is unlikely,. 
10570 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20     ** but could 
10580 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73 20  happen. In this 
10590 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f  case abandon pro
105a0 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74 75  cessing and retu
105b0 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  rn the error..  
105c0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
105d0 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
105e0 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  && i<db->nDb; i+
105f0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
10600 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
10610 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
10620 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
10630 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
10640 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
10650 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  pBt, 0);.      }
10660 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
10670 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10680 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74 61        sqlite3Vta
10690 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20  bCommit(db);.   
106a0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65   }.  }..  /* The
106b0 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d 20   complex case - 
106c0 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74 69  There is a multi
106d0 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61 6e  -file write-tran
106e0 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a  saction active..
106f0 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69 72    ** This requir
10700 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  es a master jour
10710 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73 75  nal file to ensu
10720 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  re the transacti
10730 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69  on is.  ** commi
10740 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e  tted atomically.
10750 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  .  */.#ifndef SQ
10760 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
10770 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c  .  else{.    sql
10780 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
10790 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69   db->pVfs;.    i
107a0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
107b0 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  .    char *zMast
107c0 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c  er = 0;   /* Fil
107d0 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d  e-name for the m
107e0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f  aster journal */
107f0 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20  .    char const 
10800 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c  *zMainFile = sql
10810 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
10820 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
10830 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
10840 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20  3_file *pMaster 
10850 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  = 0;.    i64 off
10860 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  set = 0;.    int
10870 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65   res;.    int re
10880 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20  tryCount = 0;.  
10890 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b    int nMainFile;
108a0 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20  ..    /* Select 
108b0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
108c0 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20   file name */.  
108d0 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71    nMainFile = sq
108e0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d  lite3Strlen30(zM
108f0 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d  ainFile);.    zM
10900 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d  aster = sqlite3M
10910 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d  Printf(db, "%s-m
10920 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d  jXXXXXX9XXz", zM
10930 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  ainFile);.    if
10940 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72  ( zMaster==0 ) r
10950 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
10960 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20  EM;.    do {.   
10970 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b 0a     u32 iRandom;.
10980 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43        if( retryC
10990 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ount ){.        
109a0 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e 31  if( retryCount>1
109b0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  00 ){.          
109c0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
109d0 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c  TE_FULL, "MJ del
109e0 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ete: %s", zMaste
109f0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
10a00 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
10a10 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
10a20 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
10a30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
10a40 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d 3d  if( retryCount==
10a50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  1 ){.          s
10a60 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
10a70 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c  E_FULL, "MJ coll
10a80 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74 65  ide: %s", zMaste
10a90 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
10aa0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 72      }.      retr
10ab0 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20 20  yCount++;.      
10ac0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
10ad0 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64 6f  ss(sizeof(iRando
10ae0 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a 20  m), &iRandom);. 
10af0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
10b00 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73 74  rintf(13, &zMast
10b10 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20 22  er[nMainFile], "
10b20 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a 20  -mj%06X9%02X",. 
10b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
10b50 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66 66  Random>>8)&0xfff
10b60 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78 66  fff, iRandom&0xf
10b70 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  f);.      /* The
10b80 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74 65   antipenultimate
10b90 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74 68   character of th
10ba0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10bb0 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20 20   name must.     
10bc0 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61 76   ** be "9" to av
10bd0 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73 69  oid name collisi
10be0 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20 38  ons when using 8
10bf0 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f  +3 filenames. */
10c00 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
10c10 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53 74  Master[sqlite3St
10c20 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29 2d  rlen30(zMaster)-
10c30 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20 20  3]=='9' );.     
10c40 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66   sqlite3FileSuff
10c50 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a  ix3(zMainFile, z
10c60 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72  Master);.      r
10c70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
10c80 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ess(pVfs, zMaste
10c90 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  r, SQLITE_ACCESS
10ca0 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b 0a  _EXISTS, &res);.
10cb0 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
10cc0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65 73  SQLITE_OK && res
10cd0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
10ce0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10cf0 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d     /* Open the m
10d00 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a  aster journal. *
10d10 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
10d20 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63  ite3OsOpenMalloc
10d30 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
10d40 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20 20  &pMaster, .     
10d50 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
10d60 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
10d70 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20  E_OPEN_CREATE|. 
10d80 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
10d90 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53  OPEN_EXCLUSIVE|S
10da0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
10db0 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20 20  R_JOURNAL, 0.   
10dc0 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20     );.    }.    
10dd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10de0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10df0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
10e00 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
10e10 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 0a  urn rc;.    }. .
10e20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
10e30 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64 61   name of each da
10e40 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 74  tabase file in t
10e50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
10e60 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20 20  nto the new.    
10e70 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
10e80 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65 72  l file. If an er
10e90 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74 68  ror occurs at th
10ea0 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a 20  is point close. 
10eb0 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74 65     ** and delete
10ec0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10ed0 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74 68  nal file. All th
10ee0 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  e individual jou
10ef0 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20 2a  rnal files.    *
10f00 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e 75  * still have 'nu
10f10 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74 65  ll' as the maste
10f20 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
10f30 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c 20  r, so they will 
10f40 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63 6b  roll.    ** back
10f50 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20 69   independently i
10f60 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75  f a failure occu
10f70 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  rs..    */.    f
10f80 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10f90 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10fa0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10fb0 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10fc0 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
10fd0 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74 29  eeIsInTrans(pBt)
10fe0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
10ff0 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d 20   const *zFile = 
11000 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a  sqlite3BtreeGetJ
11010 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29 3b  ournalname(pBt);
11020 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
11030 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
11040 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a     continue;  /*
11050 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e 64   Ignore TEMP and
11060 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62 61   :memory: databa
11070 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ses */.        }
11080 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11090 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a   zFile[0]!=0 );.
110a0 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65 65          if( !nee
110b0 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74 65  dSync && !sqlite
110c0 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c  3BtreeSyncDisabl
110d0 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ed(pBt) ){.     
110e0 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20       needSync = 
110f0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
11100 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11110 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72  3OsWrite(pMaster
11120 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33  , zFile, sqlite3
11130 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
11140 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  1, offset);.    
11150 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71      offset += sq
11160 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
11170 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20  ile)+1;.        
11180 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11190 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
111a0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
111b0 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
111c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
111d0 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
111e0 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
111f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11200 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11210 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11220 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11230 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11240 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73   /* Sync the mas
11250 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11260 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53  . If the IOCAP_S
11270 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65  EQUENTIAL device
11280 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20  .    ** flag is 
11290 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20  set this is not 
112a0 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
112b0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
112c0 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28 73  c .     && 0==(s
112d0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
112e0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 4d  aracteristics(pM
112f0 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49 4f  aster)&SQLITE_IO
11300 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a  CAP_SEQUENTIAL).
11310 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f       && SQLITE_O
11320 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
11330 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c 20  OsSync(pMaster, 
11340 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
11350 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  AL)).    ){.    
11360 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11370 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
11380 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
11390 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
113a0 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  er, 0);.      sq
113b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
113c0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
113d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
113e0 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c  ..    /* Sync al
113f0 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20 69  l the db files i
11400 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 74  nvolved in the t
11410 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65 20  ransaction. The 
11420 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  same call.    **
11430 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65 72   sets the master
11440 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72   journal pointer
11450 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69 64   in each individ
11460 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ual journal. If.
11470 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20      ** an error 
11480 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f 20  occurs here, do 
11490 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d  not delete the m
114a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
114b0 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  le..    **.    *
114c0 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20 6f  * If the error o
114d0 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65  ccurs during the
114e0 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20   first call to. 
114f0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74 72     ** sqlite3Btr
11500 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
11510 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20 69  (), then there i
11520 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74 20  s a chance that 
11530 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  the.    ** maste
11540 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  r journal file w
11550 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64 2e  ill be orphaned.
11560 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20 64   But we cannot d
11570 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a  elete it,.    **
11580 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61 73   in case the mas
11590 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
115a0 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74 65   name was writte
115b0 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
115c0 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 62  al.    ** file b
115d0 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75 72  efore the failur
115e0 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20 20  e occurred..    
115f0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
11600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
11610 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
11620 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  { .      Btree *
11630 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
11640 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
11650 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pBt ){.        r
11660 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11670 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
11680 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  Bt, zMaster);.  
11690 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
116a0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
116b0 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
116c0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
116d0 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20 20  ITE_BUSY );.    
116e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
116f0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11700 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11710 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11720 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11730 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68 65     /* Delete the
11740 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11750 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69  file. This commi
11760 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ts the transacti
11770 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a 2a  on. After.    **
11780 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65 20   doing this the 
11790 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79 6e  directory is syn
117a0 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72 65  ced again before
117b0 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c 0a   any individual.
117c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
117d0 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65 6c  on files are del
117e0 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eted..    */.   
117f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
11800 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11810 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b 0a  ter, needSync);.
11820 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11830 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11840 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b      zMaster = 0;
11850 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
11860 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11870 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
11880 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65  l files and dire
11890 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72  ctories have alr
118a0 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
118b0 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69  , so the followi
118c0 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20  ng.    ** calls 
118d0 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  to sqlite3BtreeC
118e0 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20  ommitPhaseTwo() 
118f0 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67  are only closing
11900 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a   files and.    *
11910 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72  * deleting or tr
11920 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c  uncating journal
11930 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20  s. If something 
11940 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65  goes wrong while
11950 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
11960 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e  happening we don
11970 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20  't really care. 
11980 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  The integrity of
11990 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
119a0 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
119b0 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62  dy guaranteed, b
119c0 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63  ut some stray 'c
119d0 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20  old' journals.  
119e0 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e    ** may be lyin
119f0 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e  g around. Return
11a00 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ing an error cod
11a10 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74  e won't help mat
11a20 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ters..    */.   
11a30 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
11a40 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
11a50 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
11a60 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
11a70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
11a80 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
11a90 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
11aa0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
11ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
11ac0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
11ad0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11ae0 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20  seTwo(pBt, 1);. 
11af0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11b00 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
11b10 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65  nMalloc();.    e
11b20 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  nable_simulated_
11b30 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20  io_errors();..  
11b40 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
11b50 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  mit(db);.  }.#en
11b60 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63  dif..  return rc
11b70 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73  ;.}../* .** This
11b80 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
11b90 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33  that the sqlite3
11ba0 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f 75  .nVdbeActive cou
11bb0 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d  nt variable.** m
11bc0 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65  atches the numbe
11bd0 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74  r of vdbe's in t
11be0 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e  he list sqlite3.
11bf0 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a  pVdbe that are.*
11c00 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69  * currently acti
11c10 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e  ve. An assertion
11c20 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74 77   fails if the tw
11c30 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20  o counts do not 
11c40 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69  match..** This i
11c50 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65  s an internal se
11c60 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20  lf-check only - 
11c70 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73  it is not an ess
11c80 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e  ential processin
11c90 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a  g.** step..**.**
11ca0 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
11cb0 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64 65   if NDEBUG is de
11cc0 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65  fined..*/.#ifnde
11cd0 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20  f NDEBUG.static 
11ce0 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76 65  void checkActive
11cf0 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20  VdbeCnt(sqlite3 
11d00 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
11d10 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  .  int cnt = 0;.
11d20 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30    int nWrite = 0
11d30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20  ;.  int nRead = 
11d40 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64  0;.  p = db->pVd
11d50 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29  be;.  while( p )
11d60 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
11d70 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c  3_stmt_busy((sql
11d80 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b  ite3_stmt*)p) ){
11d90 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
11da0 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f      if( p->readO
11db0 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b  nly==0 ) nWrite+
11dc0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
11dd0 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65 61  bIsReader ) nRea
11de0 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  d++;.    }.    p
11df0 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
11e00 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d  .  assert( cnt==
11e10 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
11e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72  );.  assert( nWr
11e30 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ite==db->nVdbeWr
11e40 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ite );.  assert(
11e50 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62   nRead==db->nVdb
11e60 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65  eRead );.}.#else
11e70 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63  .#define checkAc
11e80 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23  tiveVdbeCnt(x).#
11e90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  endif../*.** If 
11ea0 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
11eb0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
11ec0 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73  ument opened a s
11ed0 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63  tatement-transac
11ee0 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69  tion,.** close i
11ef0 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20  t now. Argument 
11f00 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74 68  eOp must be eith
11f10 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  er SAVEPOINT_ROL
11f20 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45  LBACK or.** SAVE
11f30 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49  POINT_RELEASE. I
11f40 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e  f it is SAVEPOIN
11f50 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e  T_ROLLBACK, then
11f60 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a   the statement.*
11f70 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
11f80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66   rolled back. If
11f90 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e   eOp is SAVEPOIN
11fa0 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20  T_RELEASE, then 
11fb0 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e  the .** statemen
11fc0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
11fd0 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
11fe0 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
11ff0 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49   occurs, an SQLI
12000 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72  TE_IOERR_XXX err
12010 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
12020 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69  ned. .** Otherwi
12030 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
12040 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
12050 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56  CloseStatement(V
12060 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29  dbe *p, int eOp)
12070 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e  {.  sqlite3 *con
12080 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  st db = p->db;. 
12090 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
120a0 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d  _OK;..  /* If p-
120b0 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67  >iStatement is g
120c0 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
120d0 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62 65  , then this Vdbe
120e0 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20   opened a .  ** 
120f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12100 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c  ction that shoul
12110 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65  d be closed here
12120 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70  . The only excep
12130 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61  tion.  ** is tha
12140 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61  t an IO error ma
12150 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c  y have occurred,
12160 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72   causing an emer
12170 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a  gency rollback..
12180 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73    ** In this cas
12190 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  e (db->nStatemen
121a0 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65  t==0), and there
121b0 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64   is nothing to d
121c0 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62  o..  */.  if( db
121d0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20  ->nStatement && 
121e0 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b  p->iStatement ){
121f0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
12200 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70  const int iSavep
12210 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65  oint = p->iState
12220 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73  ment-1;..    ass
12230 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f  ert( eOp==SAVEPO
12240 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20  INT_ROLLBACK || 
12250 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12260 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73  ELEASE);.    ass
12270 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d  ert( db->nStatem
12280 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ent>0 );.    ass
12290 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65  ert( p->iStateme
122a0 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d  nt==(db->nStatem
122b0 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69  ent+db->nSavepoi
122c0 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28  nt) );..    for(
122d0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
122e0 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74  i++){ .      int
122f0 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b   rc2 = SQLITE_OK
12300 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  ;.      Btree *p
12310 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
12320 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
12330 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  Bt ){.        if
12340 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12350 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12360 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
12370 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f 69  ite3BtreeSavepoi
12380 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e  nt(pBt, SAVEPOIN
12390 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76  T_ROLLBACK, iSav
123a0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  epoint);.       
123b0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
123c0 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2==SQLITE_OK ){
123d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d  .          rc2 =
123e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76   sqlite3BtreeSav
123f0 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45  epoint(pBt, SAVE
12400 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
12410 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12420 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12430 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12440 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
12450 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d  = rc2;.        }
12460 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12470 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e     db->nStatemen
12480 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61  t--;.    p->iSta
12490 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20  tement = 0;..   
124a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
124b0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
124c0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
124d0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
124e0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
124f0 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
12500 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12510 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ACK, iSavepoint)
12520 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
12530 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12540 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
12550 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76  = sqlite3VtabSav
12560 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50  epoint(db, SAVEP
12570 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53  OINT_RELEASE, iS
12580 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
12590 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
125a0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
125b0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  t transaction is
125c0 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61   being rolled ba
125d0 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65  ck, also restore
125e0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
125f0 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65  abase handles de
12600 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e  ferred constrain
12610 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65  t counter to the
12620 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77 68   value it had wh
12630 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73  en .    ** the s
12640 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12650 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
12660 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70    */.    if( eOp
12670 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  ==SAVEPOINT_ROLL
12680 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62  BACK ){.      db
12690 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
126a0 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e  = p->nStmtDefCon
126b0 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65  s;.      db->nDe
126c0 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20  ferredImmCons = 
126d0 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f  p->nStmtDefImmCo
126e0 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ns;.    }.  }.  
126f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12700 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
12710 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e  n is called when
12720 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f   a transaction o
12730 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61 74  pened by the dat
12740 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65  abase .** handle
12750 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
12760 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20 61   the VM passed a
12770 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73  s an argument is
12780 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a   about to be .**
12790 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74   committed. If t
127a0 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
127b0 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f  ding deferred fo
127c0 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
127d0 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f  aint.** violatio
127e0 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ns, return SQLIT
127f0 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69  E_ERROR. Otherwi
12800 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  se, SQLITE_OK..*
12810 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72  *.** If there ar
12820 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b  e outstanding FK
12830 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20   violations and 
12840 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
12850 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45  turns .** SQLITE
12860 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20  _ERROR, set the 
12870 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d  result of the VM
12880 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54   to SQLITE_CONST
12890 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
128a0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e  .** and write an
128b0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
128c0 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72  o it. Then retur
128d0 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a  n SQLITE_ERROR..
128e0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
128f0 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
12900 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  EY.int sqlite3Vd
12910 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a  beCheckFk(Vdbe *
12920 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64 29  p, int deferred)
12930 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
12940 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
12950 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62 2d  deferred && (db-
12960 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64  >nDeferredCons+d
12970 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
12980 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28  ons)>0) .   || (
12990 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e  !deferred && p->
129a0 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29  nFkConstraint>0)
129b0 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63   .  ){.    p->rc
129c0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
129d0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
129e0 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  .    p->errorAct
129f0 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
12a00 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45      sqlite3VdbeE
12a10 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e  rror(p, "FOREIGN
12a20 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20   KEY constraint 
12a30 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65  failed");.    re
12a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
12a50 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
12a60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
12a70 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
12a80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
12a90 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44 42  d the when a VDB
12aa0 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e  E tries to halt.
12ab0 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a    If the VDBE.**
12ac0 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65   has made change
12ad0 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f  s and is in auto
12ae0 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65  commit mode, the
12af0 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a  n commit those.*
12b00 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61  * changes.  If a
12b10 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65   rollback is nee
12b20 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65  ded, then do the
12b30 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   rollback..**.**
12b40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12b50 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f   the only way to
12b60 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65 20   move the state 
12b70 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20  of a VM from.** 
12b80 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e  SQLITE_MAGIC_RUN
12b90 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43   to SQLITE_MAGIC
12ba0 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61  _HALT.  It is ha
12bb0 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c  rmless to.** cal
12bc0 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74  l this on a VM t
12bd0 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53 51  hat is in the SQ
12be0 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20  LITE_MAGIC_HALT 
12bf0 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  state..**.** Ret
12c00 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
12c10 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  e.  If the commi
12c20 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70  t could not comp
12c30 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a  lete because of.
12c40 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69  ** lock contenti
12c50 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  on, return SQLIT
12c60 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49  E_BUSY.  If SQLI
12c70 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
12c80 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  ned, it.** means
12c90 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e   the close did n
12ca0 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65  ot happen and ne
12cb0 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61 74  eds to be repeat
12cc0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
12cd0 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65 20  e3VdbeHalt(Vdbe 
12ce0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  *p){.  int rc;  
12cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d00 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
12d10 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e  o store transien
12d20 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a  t return codes *
12d30 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12d40 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54  = p->db;..  /* T
12d50 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e  his function con
12d60 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20  tains the logic 
12d70 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20  that determines 
12d80 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  if a statement o
12d90 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69  r.  ** transacti
12da0 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69  on will be commi
12db0 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12dc0 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20  ack as a result 
12dd0 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63  of the.  ** exec
12de0 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69  ution of this vi
12df0 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a  rtual machine. .
12e00 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79    **.  ** If any
12e10 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
12e20 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a  g errors occur:.
12e30 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51    **.  **     SQ
12e40 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20  LITE_NOMEM.  ** 
12e50 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52      SQLITE_IOERR
12e60 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
12e70 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53  _FULL.  **     S
12e80 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a  QLITE_INTERRUPT.
12e90 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74    **.  ** Then t
12ea0 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68  he internal cach
12eb0 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65 65  e might have bee
12ec0 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  n left in an inc
12ed0 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73  onsistent.  ** s
12ee0 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74  tate.  We need t
12ef0 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73  o rollback the s
12f00 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
12f10 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69  tion, if there i
12f20 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74  s.  ** one, or t
12f30 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e  he complete tran
12f40 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65  saction if there
12f50 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74   is no statement
12f60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
12f70 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d  */..  if( p->db-
12f80 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
12f90 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
12fa0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
12fb0 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c 61   if( p->aOnceFla
12fc0 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61 4f  g ) memset(p->aO
12fd0 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e  nceFlag, 0, p->n
12fe0 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c 6f  OnceFlag);.  clo
12ff0 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b  seAllCursors(p);
13000 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63 21  .  if( p->magic!
13010 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20  =VDBE_MAGIC_RUN 
13020 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
13030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63  LITE_OK;.  }.  c
13040 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
13050 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  t(db);..  /* No 
13060 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61  commit or rollba
13070 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68 65  ck needed if the
13080 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20 73   program never s
13090 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68 65  tarted or if the
130a0 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d  .  ** SQL statem
130b0 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 61  ent does not rea
130c0 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61 74  d or write a dat
130d0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a  abase file.  */.
130e0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26    if( p->pc>=0 &
130f0 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  & p->bIsReader )
13100 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20 20  {.    int mrc;  
13110 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72 6f   /* Primary erro
13120 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72  r code from p->r
13130 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53 74  c */.    int eSt
13140 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20  atementOp = 0;. 
13150 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61 6c     int isSpecial
13160 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20 20  Error;          
13170 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75 65    /* Set to true
13180 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27 20   if a 'special' 
13190 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a  error */..    /*
131a0 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65 73   Lock all btrees
131b0 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74 61   used by the sta
131c0 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71  tement */.    sq
131d0 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 70  lite3VdbeEnter(p
131e0 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  );..    /* Check
131f0 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
13200 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 2a  special errors *
13210 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72  /.    mrc = p->r
13220 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69 73  c & 0xff;.    is
13230 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d  SpecialError = m
13240 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
13250 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13260 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
13270 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 72             || mr
13280 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  c==SQLITE_INTERR
13290 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49  UPT || mrc==SQLI
132a0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28  TE_FULL;.    if(
132b0 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20   isSpecialError 
132c0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
132d0 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65 61  he query was rea
132e0 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20 65  d-only and the e
132f0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
13300 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a  ITE_INTERRUPT, .
13310 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c        ** no roll
13320 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61 72  back is necessar
13330 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 74  y. Otherwise, at
13340 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f 69   least a savepoi
13350 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72 61  nt .      ** tra
13360 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  nsaction must be
13370 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
13380 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
13390 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20 20  base to a .     
133a0 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20 73   ** consistent s
133b0 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  tate..      **. 
133c0 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66 20       ** Even if 
133d0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
133e0 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69   read-only, it i
133f0 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70  s important to p
13400 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20  erform.      ** 
13410 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 74  a statement or t
13420 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
13430 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49  ack operation. I
13440 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20 20  f the error .   
13450 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20 77     ** occurred w
13460 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f 20  hile writing to 
13470 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62  the journal, sub
13480 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74 61  -journal or data
13490 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66 69  base.      ** fi
134a0 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61 6e  le as part of an
134b0 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65 20   effort to free 
134c0 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20 28  up cache space (
134d0 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  see function.   
134e0 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65 73     ** pagerStres
134f0 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29 2c  s() in pager.c),
13500 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73   the rollback is
13510 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65 73   required to res
13520 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20 74  tore .      ** t
13530 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63 6f  he pager to a co
13540 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e 0a  nsistent state..
13550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13560 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
13570 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49  || mrc!=SQLITE_I
13580 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20 20  NTERRUPT ){.    
13590 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53 51      if( (mrc==SQ
135a0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72  LITE_NOMEM || mr
135b0 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20  c==SQLITE_FULL) 
135c0 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f  && p->usesStmtJo
135d0 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  urnal ){.       
135e0 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
135f0 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
13600 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65  BACK;.        }e
13610 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
13620 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64 20  * We are forced 
13630 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65  to roll back the
13640 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63 74   active transact
13650 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e  ion. Before doin
13660 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  g.          ** s
13670 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74 68  o, abort any oth
13680 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  er statements th
13690 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65 6e  is handle curren
136a0 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e 0a  tly has active..
136b0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
136c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
136d0 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
136e0 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
136f0 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ACK);.          
13700 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
13710 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  points(db);.    
13720 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
13730 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
13740 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
13750 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
13760 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
13770 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69 6d   /* Check for im
13780 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
13790 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20  key violations. 
137a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 63  */.    if( p->rc
137b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
137c0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
137d0 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20  CheckFk(p, 0);. 
137e0 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
137f0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
13800 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  t flag is set an
13810 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f 6e  d this is the on
13820 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65 72  ly active writer
13830 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65   .    ** VM, the
13840 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20 61  n we do either a
13850 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
13860 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72 65  ack of the curre
13870 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  nt transaction. 
13880 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e  .    **.    ** N
13890 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20  ote: This block 
138a0 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65  also runs if one
138b0 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20   of the special 
138c0 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a  errors handled .
138d0 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61 73      ** above has
138e0 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20 20   occurred. .    
138f0 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c 69  */.    if( !sqli
13900 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64 62  te3VtabInSync(db
13910 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 61  ) .     && db->a
13920 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20  utoCommit .     
13930 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  && db->nVdbeWrit
13940 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d  e==(p->readOnly=
13950 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  =0) .    ){.    
13960 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
13970 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72  ITE_OK || (p->er
13980 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61  rorAction==OE_Fa
13990 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61 6c  il && !isSpecial
139a0 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  Error) ){.      
139b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
139c0 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b  beCheckFk(p, 1);
139d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
139e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
139f0 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56 45          if( NEVE
13a00 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29  R(p->readOnly) )
13a10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
13a20 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
13a30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
13a40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
13a50 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  OR;.          }.
13a60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
13a70 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
13a80 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20  _FOREIGNKEY;.   
13a90 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20       }else{ .   
13aa0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 75         /* The au
13ab0 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
13ac0 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62 65  s true, the vdbe
13ad0 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75 63   program was suc
13ae0 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20 20  cessful .       
13af0 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20     ** or hit an 
13b00 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74 72  'OR FAIL' constr
13b10 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20 61  aint and there a
13b20 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20 66  re no deferred f
13b30 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20 20  oreign.         
13b40 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61 69   ** key constrai
13b50 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20 74  nts to hold up t
13b60 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
13b70 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d  This means a com
13b80 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 2a  mit .          *
13b90 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 2a  * is required. *
13ba0 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  /.          rc =
13bb0 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20   vdbeCommit(db, 
13bc0 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
13bd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13be0 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d 3e  LITE_BUSY && p->
13bf0 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
13c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13c10 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13c20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13c30 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
13c40 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
13c50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13c60 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
13c70 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13c80 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64  te3RollbackAll(d
13c90 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  b, SQLITE_OK);. 
13ca0 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61           p->nCha
13cb0 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nge = 0;.       
13cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
13cd0 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
13ce0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
13cf0 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13d00 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  ImmCons = 0;.   
13d10 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
13d20 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66 65   &= ~SQLITE_Defe
13d30 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20 20  rFKs;.          
13d40 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74  sqlite3CommitInt
13d50 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62 29  ernalChanges(db)
13d60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13d70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d80 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b   sqlite3Rollback
13d90 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  All(db, SQLITE_O
13da0 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e  K);.        p->n
13db0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
13dc0 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53    }.      db->nS
13dd0 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20  tatement = 0;.  
13de0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
13df0 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20  tementOp==0 ){. 
13e00 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d       if( p->rc==
13e10 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
13e20 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f  errorAction==OE_
13e30 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Fail ){.        
13e40 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
13e50 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
13e60 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
13e70 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e  ( p->errorAction
13e80 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20  ==OE_Abort ){.  
13e90 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74        eStatement
13ea0 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52  Op = SAVEPOINT_R
13eb0 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d  OLLBACK;.      }
13ec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
13ed0 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
13ee0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
13ef0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
13f00 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73       sqlite3Clos
13f10 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b  eSavepoints(db);
13f20 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74  .        db->aut
13f30 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  oCommit = 1;.   
13f40 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13f50 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13f60 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
13f70 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73 20  eStatementOp is 
13f80 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61  non-zero, then a
13f90 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
13fa0 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a  action needs to.
13fb0 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74      ** be commit
13fc0 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61  ted or rolled ba
13fd0 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ck. Call sqlite3
13fe0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
13ff0 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64  nt() to.    ** d
14000 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f 70  o so. If this op
14010 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  eration returns 
14020 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74 68  an error, and th
14030 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
14040 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72  ent.    ** error
14050 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
14060 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e  OK or SQLITE_CON
14070 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70 72  STRAINT, then pr
14080 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a 2a  omote the.    **
14090 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65   current stateme
140a0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20  nt error code.. 
140b0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 53     */.    if( eS
140c0 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20  tatementOp ){.  
140d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
140e0 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65  VdbeCloseStateme
140f0 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e 74  nt(p, eStatement
14100 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Op);.      if( r
14110 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  c ){.        if(
14120 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
14130 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66 66  K || (p->rc&0xff
14140 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  )==SQLITE_CONSTR
14150 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20 20  AINT ){.        
14160 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
14170 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
14180 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
14190 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
141a0 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
141b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
141c0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
141d0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
141e0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
141f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
14200 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73  3CloseSavepoints
14210 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62  (db);.        db
14220 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
14230 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68  ;.        p->nCh
14240 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
14250 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
14260 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61 6e  * If this was an
14270 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20   INSERT, UPDATE 
14280 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f  or DELETE and no
14290 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
142a0 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61  action.    ** ha
142b0 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  s been rolled ba
142c0 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20 64  ck, update the d
142d0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
142e0 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  on change-counte
142f0 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  r. .    */.    i
14300 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  f( p->changeCntO
14310 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65  n ){.      if( e
14320 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56  StatementOp!=SAV
14330 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
14340 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
14350 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
14360 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29  (db, p->nChange)
14370 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14390 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
143a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
143b0 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
143c0 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
143d0 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
143e0 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  ks */.    sqlite
143f0 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14400 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76 65   }..  /* We have
14410 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68 61   successfully ha
14420 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 20  lted and closed 
14430 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64 20  the VM.  Record 
14440 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20  this fact. */.  
14450 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
14460 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63 74      db->nVdbeAct
14470 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21  ive--;.    if( !
14480 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64 62  p->readOnly ) db
14490 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a  ->nVdbeWrite--;.
144a0 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52 65      if( p->bIsRe
144b0 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62 65  ader ) db->nVdbe
144c0 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Read--;.    asse
144d0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
144e0 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65  ive>=db->nVdbeRe
144f0 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ad );.    assert
14500 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e  ( db->nVdbeRead>
14510 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 20  =db->nVdbeWrite 
14520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
14530 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d 30  b->nVdbeWrite>=0
14540 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67   );.  }.  p->mag
14550 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
14560 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63 74  HALT;.  checkAct
14570 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a  iveVdbeCnt(db);.
14580 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
14590 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
145a0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
145b0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  NOMEM;.  }..  /*
145c0 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d   If the auto-com
145d0 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20  mit flag is set 
145e0 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  to true, then an
145f0 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72  y locks that wer
14600 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63  e held.  ** by c
14610 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76  onnection db hav
14620 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61  e now been relea
14630 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  sed. Call sqlite
14640 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63  3ConnectionUnloc
14650 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69  ked() .  ** to i
14660 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72  nvoke any requir
14670 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79  ed unlock-notify
14680 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f   callbacks..  */
14690 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43  .  if( db->autoC
146a0 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  ommit ){.    sql
146b0 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e  ite3ConnectionUn
146c0 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a  locked(db);.  }.
146d0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e  .  assert( db->n
146e0 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20  VdbeActive>0 || 
146f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d  db->autoCommit==
14700 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d  0 || db->nStatem
14710 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ent==0 );.  retu
14720 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54  rn (p->rc==SQLIT
14730 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f  E_BUSY ? SQLITE_
14740 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b  BUSY : SQLITE_OK
14750 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63  );.}.../*.** Eac
14760 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65  h VDBE holds the
14770 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d   result of the m
14780 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
14790 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a  e3_step() call.*
147a0 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69  * in p->rc.  Thi
147b0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
147c0 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20  hat result back 
147d0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  to SQLITE_OK..*/
147e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
147f0 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74  eResetStepResult
14800 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e  (Vdbe *p){.  p->
14810 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14820 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
14830 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64  e error code and
14840 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62   error message b
14850 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
14860 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61  VDBE passed.** a
14870 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
14880 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61  ment to its data
14890 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20  base handle (so 
148a0 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62  that they will b
148b0 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62  e .** returned b
148c0 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  y calls to sqlit
148d0 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64  e3_errcode() and
148e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
148f0 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ))..**.** This f
14900 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74  unction does not
14910 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20   clear the VDBE 
14920 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65  error code or me
14930 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63  ssage, just.** c
14940 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68  opies them to th
14950 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
14960 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
14970 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
14980 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73  or(Vdbe *p){.  s
14990 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
149a0 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70  db;.  int rc = p
149b0 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a  ->rc;.  if( p->z
149c0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75 38  ErrMsg ){.    u8
149d0 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20   mallocFailed = 
149e0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
149f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
14a00 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
14a10 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
14a20 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
14a30 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
14a40 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
14a50 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
14a60 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
14a70 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
14a80 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
14a90 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
14aa0 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
14ab0 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 6d  loc();.    db->m
14ac0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d 61  allocFailed = ma
14ad0 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20  llocFailed;.    
14ae0 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  db->errCode = rc
14af0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
14b00 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
14b10 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rc);.  }.  retur
14b20 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
14b30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
14b40 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  LLOG./*.** If an
14b50 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
14b60 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65  QLLOG hook is re
14b70 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68 65  gistered and the
14b80 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e   VM has been run
14b90 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e  , .** invoke it.
14ba0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
14bb0 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67  vdbeInvokeSqllog
14bc0 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28  (Vdbe *v){.  if(
14bd0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14be0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20  nfig.xSqllog && 
14bf0 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  v->rc==SQLITE_OK
14c00 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76   && v->zSql && v
14c10 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63  ->pc>=0 ){.    c
14c20 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d  har *zExpanded =
14c30 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 61   sqlite3VdbeExpa
14c40 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c  ndSql(v, v->zSql
14c50 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 76  );.    assert( v
14c60 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
14c70 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45  =0 );.    if( zE
14c80 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20  xpanded ){.     
14c90 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14ca0 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20  nfig.xSqllog(.  
14cb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
14cc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
14cd0 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a  logArg, v->db, z
14ce0 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20  Expanded, 1.    
14cf0 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74    );.      sqlit
14d00 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20  e3DbFree(v->db, 
14d10 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20  zExpanded);.    
14d20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20  }.  }.}.#else.# 
14d30 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b  define vdbeInvok
14d40 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69  eSqllog(x).#endi
14d50 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  f../*.** Clean u
14d60 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20 65  p a VDBE after e
14d70 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20  xecution but do 
14d80 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 56  not delete the V
14d90 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a  DBE just yet..**
14da0 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72   Write any error
14db0 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a   messages into *
14dc0 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72  pzErrMsg.  Retur
14dd0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64  n the result cod
14de0 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  e..**.** After t
14df0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72  his routine is r
14e00 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f  un, the VDBE sho
14e10 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f 20  uld be ready to 
14e20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61  be executed.** a
14e30 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c  gain..**.** To l
14e40 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65  ook at it anothe
14e50 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74  r way, this rout
14e60 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20 73  ine resets the s
14e70 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76  tate of the.** v
14e80 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
14e90 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  rom VDBE_MAGIC_R
14ea0 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43  UN or VDBE_MAGIC
14eb0 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a  _HALT back to.**
14ec0 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54   VDBE_MAGIC_INIT
14ed0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14ee0 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20 2a  VdbeReset(Vdbe *
14ef0 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
14f00 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  b;.  db = p->db;
14f10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d  ..  /* If the VM
14f20 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20   did not run to 
14f30 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66  completion or if
14f40 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   it encountered 
14f50 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74  an.  ** error, t
14f60 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74  hen it might not
14f70 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65   have been halte
14f80 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20  d properly.  So 
14f90 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77  halt.  ** it now
14fa0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
14fb0 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20  VdbeHalt(p);..  
14fc0 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20 68  /* If the VDBE h
14fd0 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70  as be run even p
14fe0 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74  artially, then t
14ff0 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f  ransfer the erro
15000 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  r code.  ** and 
15010 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  error message fr
15020 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f  om the VDBE into
15030 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
15040 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20 42  se structure.  B
15050 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56  ut.  ** if the V
15060 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65 65  DBE has just bee
15070 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74  n set to run but
15080 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c   has not actuall
15090 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20  y executed any. 
150a0 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   ** instructions
150b0 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20   yet, leave the 
150c0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65 72  main database er
150d0 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ror information 
150e0 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a  unchanged..  */.
150f0 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29    if( p->pc>=0 )
15100 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65  {.    vdbeInvoke
15110 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73  Sqllog(p);.    s
15120 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73 66  qlite3VdbeTransf
15130 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20  erError(p);.    
15140 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
15150 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
15160 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
15170 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75  0;.    if( p->ru
15180 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65  nOnlyOnce ) p->e
15190 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65  xpired = 1;.  }e
151a0 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26  lse if( p->rc &&
151b0 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20   p->expired ){. 
151c0 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65     /* The expire
151d0 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f  d flag was set o
151e0 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f 72  n the VDBE befor
151f0 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  e the first call
15200 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
15210 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63  e3_step(). For c
15220 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63  onsistency (sinc
15230 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
15240 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c   was.    ** call
15250 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61 74  ed), set the dat
15260 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74  abase error in t
15270 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c  his case as well
15280 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
15290 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67  ite3ErrorWithMsg
152a0 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a  (db, p->rc, p->z
152b0 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20  ErrMsg ? "%s" : 
152c0 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  0, p->zErrMsg);.
152d0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
152e0 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
152f0 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15300 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  g = 0;.  }..  /*
15310 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d   Reclaim all mem
15320 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65 20  ory used by the 
15330 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61  VDBE.  */.  Clea
15340 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61  nup(p);..  /* Sa
15350 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66  ve profiling inf
15360 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
15370 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a  is VDBE run..  *
15380 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52  /.#ifdef VDBE_PR
15390 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49  OFILE.  {.    FI
153a0 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28  LE *out = fopen(
153b0 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75  "vdbe_profile.ou
153c0 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66  t", "a");.    if
153d0 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69  ( out ){.      i
153e0 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69  nt i;.      fpri
153f0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22  ntf(out, "---- "
15400 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
15410 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
15420 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  {.        fprint
15430 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70  f(out, "%02x", p
15440 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29  ->aOp[i].opcode)
15450 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15460 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e  fprintf(out, "\n
15470 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
15480 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20  >zSql ){.       
15490 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b   char c, pc = 0;
154a0 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66  .        fprintf
154b0 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20  (out, "-- ");.  
154c0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
154d0 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21  c = p->zSql[i])!
154e0 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
154f0 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27      if( pc=='\n'
15500 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15510 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20  "-- ");.        
15520 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a    putc(c, out);.
15530 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 63            pc = c
15540 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15550 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27      if( pc!='\n'
15560 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20   ) fprintf(out, 
15570 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
15580 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15590 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
155a0 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b        char zHdr[
155b0 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  100];.        sq
155c0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
155d0 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64  izeof(zHdr), zHd
155e0 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25  r, "%6u %12llu %
155f0 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20  8llu ",.        
15600 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74     p->aOp[i].cnt
15610 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15620 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20  aOp[i].cycles,. 
15630 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70            p->aOp
15640 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61  [i].cnt>0 ? p->a
15650 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e  Op[i].cycles/p->
15660 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20  aOp[i].cnt : 0. 
15670 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
15680 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
15690 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20  %s", zHdr);.    
156a0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 50      sqlite3VdbeP
156b0 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26  rintOp(out, i, &
156c0 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20  p->aOp[i]);.    
156d0 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65    }.      fclose
156e0 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (out);.    }.  }
156f0 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75  .#endif.  p->iCu
15700 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20  rrentTime = 0;. 
15710 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15720 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72  _MAGIC_INIT;.  r
15730 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62  eturn p->rc & db
15740 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f  ->errMask;.}. ./
15750 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e  *.** Clean up an
15760 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45 20  d delete a VDBE 
15770 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e  after execution.
15780 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65    Return an inte
15790 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ger which is.** 
157a0 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
157b0 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f    Write any erro
157c0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 69  r message text i
157d0 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a  nto *pzErrMsg..*
157e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
157f0 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a  eFinalize(Vdbe *
15800 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
15810 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
15820 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
15830 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d  AGIC_RUN || p->m
15840 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
15850 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20  _HALT ){.    rc 
15860 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  = sqlite3VdbeRes
15870 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72  et(p);.    asser
15880 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e  t( (rc & p->db->
15890 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a  errMask)==rc );.
158a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62    }.  sqlite3Vdb
158b0 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65  eDelete(p);.  re
158c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
158d0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 69  * If parameter i
158e0 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  Op is less than 
158f0 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  zero, then invok
15900 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
15910 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69   for.** all auxi
15920 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74  liary data point
15930 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61  ers currently ca
15940 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20 70  ched by the VM p
15950 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20  assed as.** the 
15960 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a  first argument..
15970 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70  **.** Or, if iOp
15980 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
15990 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72   or equal to zer
159a0 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73 74  o, then the dest
159b0 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c  ructor is.** onl
159c0 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68  y invoked for th
159d0 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64 61  ose auxiliary da
159e0 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61  ta pointers crea
159f0 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72 20  ted by the user 
15a00 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  .** function inv
15a10 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46  oked by the OP_F
15a20 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61  unction opcode a
15a30 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f  t instruction iO
15a40 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62  p of .** VM pVdb
15a50 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e  e, and only then
15a60 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20   if:.**.**    * 
15a70 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
15a80 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65  unction paramete
15a90 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72  r is the 32nd or
15aa0 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67   later (counting
15ab0 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65  .**      from le
15ac0 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72  ft to right), or
15ad0 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
15ae0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
15af0 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61  t in argument ma
15b00 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68 65  sk is clear (whe
15b10 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  re the first.** 
15b20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61       function pa
15b30 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f  rameter correspo
15b40 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74 63  nds to bit 0 etc
15b50 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  .)..*/.void sqli
15b60 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
15b70 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62 65  Data(Vdbe *pVdbe
15b80 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20 6d  , int iOp, int m
15b90 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61 20  ask){.  AuxData 
15ba0 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e 70  **pp = &pVdbe->p
15bb0 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c 65  AuxData;.  while
15bc0 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78  ( *pp ){.    Aux
15bd0 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70  Data *pAux = *pp
15be0 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30  ;.    if( (iOp<0
15bf0 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d  ).     || (pAux-
15c00 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41  >iOp==iOp && (pA
15c10 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21  ux->iArg>31 || !
15c20 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33  (mask & MASKBIT3
15c30 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29  2(pAux->iArg))))
15c40 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65  .    ){.      te
15c50 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41  stcase( pAux->iA
15c60 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20  rg==31 );.      
15c70 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74  if( pAux->xDelet
15c80 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75  e ){.        pAu
15c90 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d  x->xDelete(pAux-
15ca0 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a  >pAux);.      }.
15cb0 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78        *pp = pAux
15cc0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73  ->pNext;.      s
15cd0 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56 64  qlite3DbFree(pVd
15ce0 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a 20  be->db, pAux);. 
15cf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15d00 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74  pp= &pAux->pNext
15d10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
15d20 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65  *.** Free all me
15d30 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20  mory associated 
15d40 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61  with the Vdbe pa
15d50 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
15d60 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20  nd argument,.** 
15d70 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63  except for objec
15d80 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20  t itself, which 
15d90 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a  is preserved..**
15da0 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e  .** The differen
15db0 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20  ce between this 
15dc0 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c  function and sql
15dd0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29  ite3VdbeDelete()
15de0 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65   is that.** Vdbe
15df0 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e  Delete() also un
15e00 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66  links the Vdbe f
15e10 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
15e20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  VMs associated w
15e30 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ith.** the datab
15e40 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  ase connection a
15e50 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a  nd frees the obj
15e60 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76  ect itself..*/.v
15e70 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
15e80 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74  learObject(sqlit
15e90 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
15ea0 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a  {.  SubProgram *
15eb0 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  pSub, *pNext;.  
15ec0 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28  int i;.  assert(
15ed0 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e   p->db==0 || p->
15ee0 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65  db==db );.  rele
15ef0 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61  aseMemArray(p->a
15f00 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20  Var, p->nVar);. 
15f10 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
15f20 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d  (p->aColName, p-
15f30 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e  >nResColumn*COLN
15f40 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53  AME_N);.  for(pS
15f50 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20  ub=p->pProgram; 
15f60 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74  pSub; pSub=pNext
15f70 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
15f80 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sub->pNext;.    
15f90 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28  vdbeFreeOpArray(
15fa0 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70  db, pSub->aOp, p
15fb0 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73  Sub->nOp);.    s
15fc0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15fd0 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f   pSub);.  }.  fo
15fe0 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20  r(i=p->nzVar-1; 
15ff0 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74  i>=0; i--) sqlit
16000 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16010 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64 62  azVar[i]);.  vdb
16020 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c  eFreeOpArray(db,
16030 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29   p->aOp, p->nOp)
16040 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16050 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
16060 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46  e);.  sqlite3DbF
16070 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29  ree(db, p->zSql)
16080 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16090 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b  e(db, p->pFree);
160a0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
160b0 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
160c0 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b  TATUS.  for(i=0;
160d0 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b   i<p->nScan; i++
160e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
160f0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61  Free(db, p->aSca
16100 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  n[i].zName);.  }
16110 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
16120 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a  (db, p->aScan);.
16130 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
16140 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
16150 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73   VDBE..*/.void s
16160 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16170 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
16180 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
16190 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72   NEVER(p==0) ) r
161a0 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d  eturn;.  db = p-
161b0 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
161c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
161d0 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
161e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65    sqlite3VdbeCle
161f0 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b  arObject(db, p);
16200 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
16210 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d  ){.    p->pPrev-
16220 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
16230 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  t;.  }else{.    
16240 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62  assert( db->pVdb
16250 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e  e==p );.    db->
16260 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74  pVdbe = p->pNext
16270 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  ;.  }.  if( p->p
16280 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70  Next ){.    p->p
16290 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d  Next->pPrev = p-
162a0 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d  >pPrev;.  }.  p-
162b0 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
162c0 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64  GIC_DEAD;.  p->d
162d0 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
162e0 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d  DbFree(db, p);.}
162f0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73  ../*.** The curs
16300 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65 6e  or "p" has a pen
16310 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74  ding seek operat
16320 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74  ion that has not
16330 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72   yet been.** car
16340 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20  ried out.  Seek 
16350 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20  the cursor now. 
16360 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16370 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74  urs, return.** t
16380 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  he appropriate e
16390 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
163a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
163b0 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44  NOINLINE handleD
163c0 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64  eferredMoveto(Vd
163d0 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
163e0 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66  int res, rc;.#if
163f0 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
16400 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
16410 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
16420 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
16430 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d  rt( p->deferredM
16440 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72  oveto );.  asser
16450 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b  t( p->isTable );
16460 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
16470 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
16480 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20  BTREE );.  rc = 
16490 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
164a0 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63  toUnpacked(p->uc
164b0 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e  .pCursor, 0, p->
164c0 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c  movetoTarget, 0,
164d0 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63   &res);.  if( rc
164e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
164f0 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65 74  if( res!=0 ) ret
16500 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16510 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20  PT_BKPT;.#ifdef 
16520 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
16530 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
16540 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  nt++;.#endif.  p
16550 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
16560 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
16570 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53  Status = CACHE_S
16580 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53  TALE;.  return S
16590 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
165a0 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73  ** Something has
165b0 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70   moved cursor "p
165c0 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20  " out of place. 
165d0 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20 69   Maybe the row i
165e0 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64  t was.** pointed
165f0 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20   to was deleted 
16600 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69  out from under i
16610 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65  t.  Or maybe the
16620 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65   btree was.** re
16630 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65  balanced.  Whate
16640 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
16650 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70  ry to restore "p
16660 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69  " to the place i
16670 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64  t.** is supposed
16680 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e   to be pointing.
16690 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61 73    If the row was
166a0 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
166b0 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63  m under the.** c
166c0 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63  ursor, set the c
166d0 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74  ursor to point t
166e0 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f  o a NULL row..*/
166f0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16700 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64  TE_NOINLINE hand
16710 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64  leMovedCursor(Vd
16720 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20  beCursor *p){.  
16730 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74 52  int isDifferentR
16740 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74  ow, rc;.  assert
16750 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
16760 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
16770 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e    assert( p->uc.
16780 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20  pCursor!=0 );.  
16790 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
167a0 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
167b0 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
167c0 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ) );.  rc = sqli
167d0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52 65  te3BtreeCursorRe
167e0 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72  store(p->uc.pCur
167f0 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
16800 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
16810 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
16820 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
16830 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
16840 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
16850 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16860 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
16870 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
16880 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
16890 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
168a0 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
168b0 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
168c0 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
168d0 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
168e0 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
168f0 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
16900 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
16910 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
16920 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50  eCurType==CURTYP
16930 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28  E_BTREE );.  if(
16940 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
16950 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75  sorHasMoved(p->u
16960 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20  c.pCursor) ){.  
16970 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d    return handleM
16980 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20  ovedCursor(p);. 
16990 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
169a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
169b0 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63 75  Make sure the cu
169c0 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79 20  rsor p is ready 
169d0 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74 65  to read or write
169e0 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63   the row to whic
169f0 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  h it.** was last
16a00 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65   positioned.  Re
16a10 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
16a20 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75  de if an OOM fau
16a30 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a  lt or I/O error.
16a40 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20 66  ** prevents us f
16a50 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  rom positioning 
16a60 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74  the cursor to it
16a70 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69  s correct positi
16a80 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d  on..**.** If a M
16a90 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20  oveTo operation 
16aa0 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68  is pending on th
16ab0 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20  e given cursor, 
16ac0 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20  then do that.** 
16ad0 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20  MoveTo now.  If 
16ae0 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69  no move is pendi
16af0 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65  ng, check to see
16b00 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73 20   if the row has 
16b10 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20  been.** deleted 
16b20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
16b30 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66  he cursor and if
16b40 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68   it has, mark th
16b50 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55  e row as.** a NU
16b60 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66  LL row..**.** If
16b70 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61   the cursor is a
16b80 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
16b90 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 72  to the correct r
16ba0 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20  ow and that row 
16bb0 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20  has.** not been 
16bc0 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d  deleted out from
16bd0 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f   under the curso
16be0 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  r, then this rou
16bf0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
16c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
16c10 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28  dbeCursorMoveto(
16c20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a  VdbeCursor *p){.
16c30 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79 70    if( p->eCurTyp
16c40 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
16c50 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64   ){.    if( p->d
16c60 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b  eferredMoveto ){
16c70 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61  .      return ha
16c80 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
16c90 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  to(p);.    }.   
16ca0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
16cb0 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
16cc0 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
16cd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  {.      return h
16ce0 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
16cf0 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
16d00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16d10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
16d20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
16d30 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
16d40 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
16d50 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
16d60 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
16d70 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
16d80 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
16d90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
16da0 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
16db0 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
16dc0 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
16dd0 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
16de0 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
16df0 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
16e00 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
16e10 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
16e20 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
16e30 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
16e40 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
16e50 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
16e60 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
16e70 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
16e80 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
16e90 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
16ea0 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
16eb0 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
16ec0 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
16ed0 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
16ee0 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
16ef0 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
16f00 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
16f10 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
16f20 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
16f30 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
16f40 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
16f50 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
16f60 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
16f70 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
16f80 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
16f90 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
16fa0 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
16fb0 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
16fc0 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
16fd0 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
16fe0 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
16ff0 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
17000 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
17010 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
17020 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
17030 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
17040 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
17050 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
17060 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
17070 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
17080 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
17090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
170a0 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
170b0 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
170c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
170d0 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
170e0 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
170f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
17100 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
17110 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
17120 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
17130 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
17140 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17150 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
17160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17170 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
17180 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17190 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
171a0 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
171b0 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
171c0 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
171d0 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
171e0 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
171f0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17200 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
17230 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17240 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
17250 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
17260 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
17270 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
17280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17290 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
172a0 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
172b0 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
172d0 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
172e0 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
172f0 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17310 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
17320 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
17330 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
17340 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
17350 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
17360 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
17370 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
17380 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
17390 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
173a0 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
173b0 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
173c0 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
173d0 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
173e0 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
173f0 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
17400 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
17410 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
17420 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
17430 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
17440 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
17450 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
17460 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
17470 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
17480 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70  e_format, u32 *p
17490 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  Len){.  int flag
174a0 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
174b0 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73  .  u32 n;..  ass
174c0 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a  ert( pLen!=0 );.
174d0 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
174e0 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Null ){.    *pLe
174f0 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
17500 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
17510 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
17520 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
17530 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
17540 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
17550 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
17560 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
17570 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
17580 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
17590 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
175a0 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
175b0 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
175c0 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d     u = ~i;.    }
175d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
175e0 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
175f0 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
17600 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26   if( (i&1)==i &&
17610 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
17620 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  ){.        *pLen
17630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
17640 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20  turn 8+(u32)u;. 
17650 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17660 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20      *pLen = 1;. 
17670 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
17680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17690 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
176a0 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65  ){ *pLen = 2; re
176b0 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66  turn 2; }.    if
176c0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20  ( u<=8388607 ){ 
176d0 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72  *pLen = 3; retur
176e0 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 3; }.    if( u
176f0 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20  <=2147483647 ){ 
17700 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72  *pLen = 4; retur
17710 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 4; }.    if( u
17720 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a  <=MAX_6BYTE ){ *
17730 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e  pLen = 6; return
17740 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20   5; }.    *pLen 
17750 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
17760 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
17770 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
17780 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
17790 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
177a0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
177b0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
177c0 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
177d0 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
177e0 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
177f0 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
17800 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
17810 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
17820 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
17830 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
17840 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20  }.  *pLen = n;. 
17850 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
17860 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
17870 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
17880 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
17890 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  for serial types
178a0 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a   less than 128.*
178b0 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
178c0 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
178d0 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
178e0 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20        /*  0   1 
178f0 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20    2   3   4   5 
17900 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20    6   7   8   9 
17910 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20  */   ./*   0 */ 
17920 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
17930 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c    4,  6,  8,  8,
17940 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20    0,  0,./*  10 
17950 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
17960 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20   0,  1,  1,  2, 
17970 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20   2,  3,  3,./*  
17980 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20  20 */   4,  4,  
17990 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20  5,  5,  6,  6,  
179a0 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f  7,  7,  8,  8,./
179b0 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39  *  30 */   9,  9
179c0 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31  , 10, 10, 11, 11
179d0 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33  , 12, 12, 13, 13
179e0 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c  ,./*  40 */  14,
179f0 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c   14, 15, 15, 16,
17a00 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c   16, 17, 17, 18,
17a10 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20   18,./*  50 */  
17a20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20  19, 19, 20, 20, 
17a30 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20  21, 21, 22, 22, 
17a40 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a  23, 23,./*  60 *
17a50 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32  /  24, 24, 25, 2
17a60 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32  5, 26, 26, 27, 2
17a70 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37  7, 28, 28,./*  7
17a80 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30  0 */  29, 29, 30
17a90 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32  , 30, 31, 31, 32
17aa0 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a  , 32, 33, 33,./*
17ab0 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c    80 */  34, 34,
17ac0 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c   35, 35, 36, 36,
17ad0 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c   37, 37, 38, 38,
17ae0 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20  ./*  90 */  39, 
17af0 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20  39, 40, 40, 41, 
17b00 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20  41, 42, 42, 43, 
17b10 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34  43,./* 100 */  4
17b20 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34  4, 44, 45, 45, 4
17b30 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34  6, 46, 47, 47, 4
17b40 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f  8, 48,./* 110 */
17b50 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30    49, 49, 50, 50
17b60 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32  , 51, 51, 52, 52
17b70 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30  , 53, 53,./* 120
17b80 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c   */  54, 54, 55,
17b90 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c   55, 56, 56, 57,
17ba0 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   57.};../*.** Re
17bb0 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
17bc0 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
17bd0 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
17be0 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
17bf0 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
17c00 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17c10 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
17c20 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
17c30 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20  erial_type>=128 
17c40 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
17c50 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
17c60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
17c70 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
17c80 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20  pe<12 .         
17c90 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61     || sqlite3Sma
17ca0 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
17cb0 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61  al_type]==(seria
17cc0 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29  l_type - 12)/2 )
17cd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
17ce0 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
17cf0 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
17d00 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65  .  }.}.u8 sqlite
17d10 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69  3VdbeOneByteSeri
17d20 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72  alTypeLen(u8 ser
17d30 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73  ial_type){.  ass
17d40 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
17d50 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e  <128 );.  return
17d60 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
17d70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
17d80 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pe];  .}../*.** 
17d90 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
17da0 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
17db0 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
17dc0 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
17dd0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
17de0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
17df0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
17e00 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
17e10 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
17e20 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
17e30 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
17e40 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
17e50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
17e60 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
17e70 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
17e80 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
17e90 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
17ea0 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
17eb0 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
17ec0 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
17ed0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
17ee0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
17ef0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
17f00 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
17f10 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
17f20 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
17f30 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
17f40 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
17f50 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
17f60 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
17f70 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
17f80 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
17f90 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
17fa0 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
17fb0 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
17fc0 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
17fd0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
17fe0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
17ff0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
18000 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
18010 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
18020 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
18030 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
18040 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
18050 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
18060 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
18070 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
18080 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
18090 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
180a0 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
180b0 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
180c0 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
180d0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
180e0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
180f0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
18100 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
18110 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
18120 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
18130 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
18140 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
18150 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
18160 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
18170 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
18180 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
18190 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
181a0 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
181b0 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
181c0 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
181d0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
181e0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
181f0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
18200 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
18210 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
18220 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
18230 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
18240 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
18250 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
18260 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
18270 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
18280 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
18290 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
182a0 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
182b0 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
182c0 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
182d0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
182e0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
182f0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
18300 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
18310 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
18320 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
18330 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
18340 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
18350 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
18360 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
18370 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
18380 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
18390 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
183a0 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
183b0 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
183c0 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
183d0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
183e0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
183f0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
18400 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
18410 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
18420 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
18430 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
18440 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
18450 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
18460 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
18470 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
18480 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
18490 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
184a0 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
184b0 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
184c0 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
184d0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
184e0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
184f0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
18500 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
18510 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
18520 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
18530 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
18540 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
18550 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
18560 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
18570 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
18580 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
18590 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
185a0 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
185b0 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
185c0 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
185d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
185e0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
185f0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
18600 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
18610 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
18620 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
18630 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
18640 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
18650 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
18660 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
18670 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
18680 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
18690 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
186a0 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
186b0 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
186c0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
186d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
186e0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
186f0 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
18700 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
18710 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
18720 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
18730 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
18740 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
18750 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
18760 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
18770 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
18780 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18790 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
187a0 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
187b0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
187c0 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
187d0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
187e0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
187f0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
18800 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
18810 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
18820 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
18830 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
18840 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
18850 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
18860 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
18870 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
18880 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
18890 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
188a0 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
188b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
188c0 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
188d0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
188e0 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
188f0 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18900 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ype];.    assert
18910 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
18920 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
18930 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
18940 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
18950 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
18960 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
18970 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
18980 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
18990 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
189a0 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
189b0 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
189c0 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
189d0 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
189e0 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
189f0 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
18a00 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
18a10 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
18a20 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
18a30 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c  em->n;.    if( l
18a40 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75  en>0 ) memcpy(bu
18a50 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
18a60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
18a70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
18a80 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
18a90 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
18aa0 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20   0;.}../* Input 
18ab0 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  "x" is a sequenc
18ac0 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68  e of unsigned ch
18ad0 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65  aracters that re
18ae0 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67  present a.** big
18af0 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
18b00 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75    Return the equ
18b10 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69  ivalent native i
18b20 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  nteger.*/.#defin
18b30 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78  e ONE_BYTE_INT(x
18b40 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d  )    ((i8)(x)[0]
18b50 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59  ).#define TWO_BY
18b60 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35  TE_INT(x)    (25
18b70 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
18b80 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[1]).#define T
18b90 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29  HREE_BYTE_INT(x)
18ba0 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78    (65536*(i8)((x
18bb0 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38  )[0])|((x)[1]<<8
18bc0 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e  )|(x)[2]).#defin
18bd0 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  e FOUR_BYTE_UINT
18be0 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b  (x)  (((u32)(x)[
18bf0 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c  0]<<24)|((x)[1]<
18c00 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
18c10 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65  |(x)[3]).#define
18c20 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78   FOUR_BYTE_INT(x
18c30 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29  ) (16777216*(i8)
18c40 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
18c50 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
18c60 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a  )|(x)[3])../*.**
18c70 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
18c80 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
18c90 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
18ca0 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
18cb0 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
18cc0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
18cd0 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
18ce0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
18cf0 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ytes read..**.**
18d00 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
18d10 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
18d20 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f   two separate ro
18d30 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f  utines for perfo
18d40 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66  rmance..** The f
18d50 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65  ew cases that re
18d60 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69  quire local vari
18d70 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e  ables are broken
18d80 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61   out into a sepa
18d90 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rate.** routine 
18da0 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20  so that in most 
18db0 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65  cases the overhe
18dc0 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65  ad of moving the
18dd0 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a   stack pointer.*
18de0 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f  * is avoided..*/
18df0 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c   .static u32 SQL
18e00 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72  ITE_NOINLINE ser
18e10 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
18e20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
18e30 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
18e40 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
18e50 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
18e60 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
18e70 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
18e80 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
18e90 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
18ea0 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
18eb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
18ec0 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
18ed0 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
18ee0 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55  ){.  u64 x = FOU
18ef0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
18f00 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52  ;.  u32 y = FOUR
18f10 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
18f20 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29  );.  x = (x<<32)
18f30 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69   + y;.  if( seri
18f40 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
18f50 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18f60 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20  : R-29851-52272 
18f70 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
18f80 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20  ndian 64-bit.   
18f90 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
18fa0 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
18fb0 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
18fc0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
18fd0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
18fe0 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
18ff0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
19000 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
19010 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
19020 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61  R-57343-49114 Va
19030 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
19040 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30  ian IEEE 754-200
19050 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  8 64-bit.    ** 
19060 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
19070 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64  umber. */.#if !d
19080 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
19090 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
190a0 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
190b0 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65  POINT).    /* Ve
190c0 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
190d0 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
190e0 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
190f0 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
19100 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
19110 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
19120 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
19130 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
19140 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
19150 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
19160 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
19170 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
19180 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
19190 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
191a0 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
191b0 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
191c0 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63  <<32;.    static
191d0 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
191e0 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20   = 1.0;.    u64 
191f0 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61  t2 = t1;.    swa
19200 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
19210 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72  t(t2);.    asser
19220 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
19230 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
19240 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
19250 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
19260 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
19270 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
19280 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
19290 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  u.r)==8 );.    s
192a0 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
192b0 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
192c0 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26  py(&pMem->u.r, &
192d0 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
192e0 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
192f0 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
19300 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e  em->u.r) ? MEM_N
19310 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
19320 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a    }.  return 8;.
19330 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  }.u32 sqlite3Vdb
19340 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
19350 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19360 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
19370 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
19380 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
19390 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
193b0 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
193c0 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
193d0 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
193f0 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
19400 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
19410 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
19420 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
19430 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
19440 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
19450 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
19460 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
19470 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
19480 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
19490 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c  se 0: {  /* Null
194a0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
194b0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37  DENCE-OF: R-2407
194c0 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73  8-09375 Value is
194d0 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20   a NULL. */.    
194e0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
194f0 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
19500 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19510 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20   case 1: {.     
19520 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19530 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56   R-44885-25196 V
19540 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74  alue is an 8-bit
19550 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19560 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
19570 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
19580 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45  ->u.i = ONE_BYTE
19590 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
195a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
195b0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
195c0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
195d0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
195e0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
195f0 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
19600 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
19610 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
19620 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
19630 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65  9794-35026 Value
19640 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19650 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   16-bit.      **
19660 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19670 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19680 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
19690 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
196a0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
196b0 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
196c0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
196d0 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
196e0 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
196f0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
19700 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
19710 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19720 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19730 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30  OF: R-37839-5430
19740 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  1 Value is a big
19750 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20  -endian 24-bit. 
19760 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19770 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19780 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19790 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45  u.i = THREE_BYTE
197a0 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
197b0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
197c0 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
197d0 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
197e0 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
197f0 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
19800 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
19810 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
19820 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
19830 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
19840 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65  1849-26079 Value
19850 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19860 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   32-bit.      **
19870 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19880 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19890 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
198a0 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  OUR_BYTE_INT(buf
198b0 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63  );.#ifdef __HP_c
198c0 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b  c .      /* Work
198d0 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65   around a sign-e
198e0 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20  xtension bug in 
198f0 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20  the HP compiler 
19900 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20  for HP/UX */.   
19910 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78     if( buf[0]&0x
19920 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c  80 ) pMem->u.i |
19930 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30  = 0xffffffff8000
19940 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20  0000LL;.#endif. 
19950 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
19960 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
19970 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
19980 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
19990 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
199a0 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
199b0 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
199c0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
199d0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
199e0 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56   R-50385-09674 V
199f0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
19a00 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20  dian 48-bit.    
19a10 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19a20 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19a30 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
19a40 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
19a50 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36  T(buf+2) + (((i6
19a60 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
19a70 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
19a80 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19a90 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
19aa0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
19ab0 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
19ac0 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
19ad0 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
19ae0 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
19af0 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
19b00 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
19b10 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
19b20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20  .      /* These 
19b30 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  use local variab
19b40 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20  les, so do them 
19b50 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f  in a separate ro
19b60 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74  utine.      ** t
19b70 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
19b80 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65  o move the frame
19b90 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
19ba0 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
19bb0 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69       return seri
19bc0 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c  alGet(buf,serial
19bd0 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20  _type,pMem);.   
19be0 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
19bf0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
19c00 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
19c10 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
19c20 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19c30 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32  CE-OF: R-12976-2
19c40 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68  2893 Value is th
19c50 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a  e integer 0. */.
19c60 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
19c70 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32  E-OF: R-18143-12
19c80 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65  121 Value is the
19c90 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20   integer 1. */. 
19ca0 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
19cb0 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
19cc0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19cd0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19ce0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
19cf0 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
19d00 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
19d10 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d  NCE-OF: R-14606-
19d20 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61  31564 Value is a
19d30 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e   BLOB that is (N
19d40 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a  -12)/2 bytes in.
19d50 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e        ** length.
19d60 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
19d70 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30  CE-OF: R-28401-0
19d80 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20  0140 Value is a 
19d90 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65  string in the te
19da0 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a  xt encoding and.
19db0 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f        ** (N-13)/
19dc0 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  2 bytes in lengt
19dd0 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  h. */.      stat
19de0 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
19df0 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
19e00 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
19e10 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
19e20 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
19e30 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
19e40 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28       pMem->n = (
19e50 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
19e60 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  2;.      pMem->f
19e70 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72  lags = aFlag[ser
19e80 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20  ial_type&1];.   
19e90 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e     return pMem->
19ea0 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
19eb0 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a  eturn 0;.}./*.**
19ec0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
19ed0 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
19ee0 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
19ef0 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b  ce for an Unpack
19f00 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
19f10 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75  cture large enou
19f20 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  gh to be used wi
19f30 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  th sqlite3VdbeRe
19f40 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a  cordUnpack() if.
19f50 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
19f60 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
19f70 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74  er to KeyInfo st
19f80 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f  ructure pKeyInfo
19f90 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63  ..**.** The spac
19fa0 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f  e is either allo
19fb0 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
19fc0 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29  te3DbMallocRaw()
19fd0 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a   or from within.
19fe0 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  ** the unaligned
19ff0 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76   buffer passed v
1a000 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
1a010 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
1a020 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a  s (presumably.**
1a030 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49   stack space). I
1a040 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
1a050 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  en *ppFree is se
1a060 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  t to a pointer t
1a070 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a080 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
1a090 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a0a0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
1a0b0 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68  ree(). Or, if th
1a0c0 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  e .** allocation
1a0d0 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
1a0e0 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62  pSpace/szSpace b
1a0f0 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69  uffer, *ppFree i
1a100 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1a110 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a120 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
1a130 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
1a140 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1a150 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65  d..*/.UnpackedRe
1a160 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62  cord *sqlite3Vdb
1a170 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
1a180 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20  cord(.  KeyInfo 
1a190 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1a1a0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72          /* Descr
1a1b0 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  iption of the re
1a1c0 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
1a1d0 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
1a1e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
1a1f0 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
1a200 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
1a210 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  szSpace,        
1a220 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a230 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
1a240 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
1a250 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20  ar **ppFree     
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a270 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f   OUT: Caller sho
1a280 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f  uld free this po
1a290 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e  inter */.){.  Un
1a2a0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
1a2b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a2c0 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
1a2d0 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1a2e0 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70  /* Increment pSp
1a310 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61  ace by nOff to a
1a320 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74  lign it */.  int
1a330 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
1a340 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a350 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1a360 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
1a370 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74  */..  /* We want
1a380 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f   to shift the po
1a390 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20  inter pSpace up 
1a3a0 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
1a3b0 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a  8-byte aligned..
1a3c0 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65    ** Thus, we ne
1a3d0 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  ed to calculate 
1a3e0 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62  a value, nOff, b
1a3f0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20  etween 0 and 7, 
1a400 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69  to shift .  ** i
1a410 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65  t by.  If pSpace
1a420 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79   is already 8-by
1a430 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66  te aligned, nOff
1a440 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e   should be zero.
1a450 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28  .  */.  nOff = (
1a460 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  8 - (SQLITE_PTR_
1a470 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26  TO_INT(pSpace) &
1a480 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74   7)) & 7;.  nByt
1a490 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
1a4a0 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1a4b0 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
1a4c0 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
1a4d0 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
1a4e0 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20  te>szSpace+nOff 
1a4f0 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  ){.    p = (Unpa
1a500 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
1a510 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a520 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
1a530 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65  yte);.    *ppFre
1a540 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  e = (char *)p;. 
1a550 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75     if( !p ) retu
1a560 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
1a570 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
1a580 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b  Record*)&pSpace[
1a590 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72  nOff];.    *ppFr
1a5a0 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  ee = 0;.  }..  p
1a5b0 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
1a5c0 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
1a5d0 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1a5e0 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
1a5f0 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1a600 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1a610 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
1a620 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
1a630 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
1a640 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
1a650 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1a660 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
1a670 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
1a680 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
1a690 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
1a6a0 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
1a6b0 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
1a6c0 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1a6d0 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
1a6e0 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
1a6f0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
1a700 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
1a710 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
1a720 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1a730 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1a740 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
1a750 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1a760 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
1a770 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
1a780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a790 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
1a7a0 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
1a7b0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1a7c0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
1a7d0 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1a7e0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1a7f0 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
1a800 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
1a810 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1a820 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
1a830 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1a840 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1a850 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1a860 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
1a870 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
1a880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a890 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
1a8a0 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
1a8b0 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
1a8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a8d0 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1a8e0 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1a8f0 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
1a900 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
1a910 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
1a920 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
1a930 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1a940 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
1a950 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
1a960 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1a970 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
1a980 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
1a990 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1a9a0 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
1a9b0 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1a9c0 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
1a9d0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1a9e0 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
1a9f0 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
1aa00 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1aa10 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
1aa20 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1aa30 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
1aa40 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
1aa50 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1aa60 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
1aa70 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
1aa80 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
1aa90 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c 69  0;.    d += sqli
1aaa0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1aab0 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69 61  (&aKey[d], seria
1aac0 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a 20  l_type, pMem);. 
1aad0 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69     pMem++;.    i
1aae0 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69  f( (++u)>=p->nFi
1aaf0 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d  eld ) break;.  }
1ab00 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70 4b  .  assert( u<=pK
1ab10 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
1ab20 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c   1 );.  p->nFiel
1ab30 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53 51  d = u;.}..#if SQ
1ab40 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a  LITE_DEBUG./*.**
1ab50 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
1ab60 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64 65  ompares two inde
1ab70 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f 72  x or table recor
1ab80 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73 61  d keys in the sa
1ab90 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68 65  me way.** as the
1aba0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1abb0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75 74  rdCompare() rout
1abc0 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62 65  ine. Unlike Vdbe
1abd0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 2c  RecordCompare(),
1abe0 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
1abf0 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 61  n deserializes a
1ac00 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c 75  nd compares valu
1ac10 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20  es using the.** 
1ac20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1ac30 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69 74  lGet() and sqlit
1ac40 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20 66  e3MemCompare() f
1ac50 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73 20  unctions. It is 
1ac60 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65 72  used.** in asser
1ac70 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
1ac80 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
1ac90 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64 65  e optimized code
1aca0 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64   in.** sqlite3Vd
1acb0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1acc0 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c 74  ) returns result
1acd0 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77 6f  s with these two
1ace0 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a   primitives..**.
1acf0 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
1ad00 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  f the result of 
1ad10 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65 71  comparison is eq
1ad20 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73 69  uivalent to desi
1ad30 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52 65  redResult..** Re
1ad40 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74 68  turn false if th
1ad50 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72 65  ere is a disagre
1ad60 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
1ad70 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43   int vdbeRecordC
1ad80 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20 69  ompareDebug(.  i
1ad90 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1ada0 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
1adb0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63 6f  Left key */.  co
1adc0 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  nst UnpackedReco
1add0 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20 52  rd *pPKey2, /* R
1ade0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e  ight key */.  in
1adf0 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 20  t desiredResult 
1ae00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1ae10 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a 2f  orrect answer */
1ae20 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20  .){.  u32 d1;   
1ae30 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1ae40 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1ae50 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1ae60 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  ent */.  u32 idx
1ae70 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  1;          /* O
1ae80 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b  ffset into aKey[
1ae90 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65 72  ] of next header
1aea0 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33   element */.  u3
1aeb0 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20  2 szHdr1;       
1aec0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1aed0 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a 2f  tes in header */
1aee0 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20  .  int i = 0;.  
1aef0 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 6f  int rc = 0;.  co
1af00 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1af10 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  r *aKey1 = (cons
1af20 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1af30 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49 6e  *)pKey1;.  KeyIn
1af40 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  fo *pKeyInfo;.  
1af50 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65  Mem mem1;..  pKe
1af60 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e  yInfo = pPKey2->
1af70 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28 20  pKeyInfo;.  if( 
1af80 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20  pKeyInfo->db==0 
1af90 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d 65  ) return 1;.  me
1afa0 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66  m1.enc = pKeyInf
1afb0 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64  o->enc;.  mem1.d
1afc0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1afd0 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67  ;.  /* mem1.flag
1afe0 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c 20  s = 0;  // Will 
1aff0 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 62  be initialized b
1b000 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  y sqlite3VdbeSer
1b010 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56 56  ialGet() */.  VV
1b020 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d  A_ONLY( mem1.szM
1b030 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a 20  alloc = 0; ) /* 
1b040 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20 61  Only needed by a
1b050 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
1b060 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70  ts */..  /* Comp
1b070 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c 61  ilers may compla
1b080 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e 69  in that mem1.u.i
1b090 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20   is potentially 
1b0a0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  uninitialized.. 
1b0b0 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e 69   ** We could ini
1b0c0 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20 73  tialize it, as s
1b0d0 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73 69  hown here, to si
1b0e0 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d 70  lence those comp
1b0f0 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75 74  laints..  ** But
1b100 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e 75   in fact, mem1.u
1b110 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61 63  .i will never ac
1b120 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20 75  tually be used u
1b130 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61 6e  ninitialized, an
1b140 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74 68  d doing .  ** th
1b150 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69 6e  e unnecessary in
1b160 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61 73  itialization has
1b170 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e 65   a measurable ne
1b180 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61 6e  gative performan
1b190 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c 20  ce.  ** impact, 
1b1a0 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74 69  since this routi
1b1b0 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69 67  ne is a very hig
1b1c0 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20 73  h runner.  And s
1b1d0 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20 2a  o, we choose.  *
1b1e0 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65 20  * to ignore the 
1b1f0 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67  compiler warning
1b200 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69 73  s and leave this
1b210 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69 74   variable uninit
1b220 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
1b230 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20 30  /*  mem1.u.i = 0
1b240 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65 64  ;  // not needed
1b250 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e 63  , here to silenc
1b260 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1b270 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31 20  ng */.  .  idx1 
1b280 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1b290 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20  ey1, szHdr1);.  
1b2a0 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30 37  if( szHdr1>98307
1b2b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
1b2c0 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20 3d  _CORRUPT;.  d1 =
1b2d0 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72   szHdr1;.  asser
1b2e0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  t( pKeyInfo->nFi
1b2f0 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58  eld+pKeyInfo->nX
1b300 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e  Field>=pPKey2->n
1b310 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54  Field || CORRUPT
1b320 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
1b330 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1b340 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Order!=0 );.  as
1b350 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1b360 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73  nField>0 );.  as
1b370 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64  sert( idx1<=szHd
1b380 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42  r1 || CORRUPT_DB
1b390 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33   );.  do{.    u3
1b3a0 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a  2 serial_type1;.
1b3b0 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
1b3c0 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f   serial types fo
1b3d0 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65  r the next eleme
1b3e0 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20  nt in each key. 
1b3f0 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67  */.    idx1 += g
1b400 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79  etVarint32( aKey
1b410 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74  1+idx1, serial_t
1b420 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  ype1 );..    /* 
1b430 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 72  Verify that ther
1b440 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20  e is enough key 
1b450 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20  space remaining 
1b460 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20  to avoid.    ** 
1b470 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65 61  a buffer overrea
1b480 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72 69  d.  The "d1+seri
1b490 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65  al_type1+2" sube
1b4a0 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20  xpression will. 
1b4b0 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20     ** always be 
1b4c0 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
1b4d0 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f  equal to the amo
1b4e0 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64 20  unt of required 
1b4f0 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a  key space..    *
1b500 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72 6f  * Use that appro
1b510 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69  ximation to avoi
1b520 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e  d the more expen
1b530 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20  sive call to.   
1b540 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53   ** sqlite3VdbeS
1b550 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69  erialTypeLen() i
1b560 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
1b570 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
1b580 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65  ( d1+serial_type
1b590 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20  1+2>(u32)nKey1. 
1b5a0 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65      && d1+sqlite
1b5b0 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1b5c0 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29  en(serial_type1)
1b5d0 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20  >(u32)nKey1 .   
1b5e0 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
1b5f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45  .    }..    /* E
1b600 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75 65  xtract the value
1b610 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64  s to be compared
1b620 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20  ..    */.    d1 
1b630 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1b640 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1b650 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  1], serial_type1
1b660 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f  , &mem1);..    /
1b670 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69  * Do the compari
1b680 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  son.    */.    r
1b690 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  c = sqlite3MemCo
1b6a0 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50  mpare(&mem1, &pP
1b6b0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70  Key2->aMem[i], p
1b6c0 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69  KeyInfo->aColl[i
1b6d0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  ]);.    if( rc!=
1b6e0 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1b6f0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1b700 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63  ==0 );  /* See c
1b710 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a  omment below */.
1b720 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1b730 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1b740 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1b750 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72  = -rc;  /* Inver
1b760 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72  t the result for
1b770 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72   DESC sort order
1b780 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  . */.      }.   
1b790 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d     goto debugCom
1b7a0 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20  pareEnd;.    }. 
1b7b0 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65     i++;.  }while
1b7c0 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26  ( idx1<szHdr1 &&
1b7d0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1b7e0 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65  d );..  /* No me
1b7f0 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
1b800 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20  is ever used on 
1b810 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69  mem1.  Prove thi
1b820 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65  s using.  ** the
1b830 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
1b840 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73  t().  If the ass
1b850 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20  ert() fails, it 
1b860 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a  indicates a.  **
1b870 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64   memory leak and
1b880 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20   a need to call 
1b890 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1b8a0 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20  lease(&mem1)..  
1b8b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d  */.  assert( mem
1b8c0 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b  1.szMalloc==0 );
1b8d0 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72  ..  /* rc==0 her
1b8e0 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65  e means that one
1b8f0 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e   of the keys ran
1b900 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61   out of fields a
1b910 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20  nd.  ** all the 
1b920 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61  fields up to tha
1b930 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75  t point were equ
1b940 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64  al. Return the d
1b950 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76  efault_rc.  ** v
1b960 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  alue.  */.  rc =
1b970 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74   pPKey2->default
1b980 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61  _rc;..debugCompa
1b990 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73  reEnd:.  if( des
1b9a0 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26  iredResult==0 &&
1b9b0 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   rc==0 ) return 
1b9c0 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  1;.  if( desired
1b9d0 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30  Result<0 && rc<0
1b9e0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1b9f0 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  f( desiredResult
1ba00 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65 74  >0 && rc>0 ) ret
1ba10 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52  urn 1;.  if( COR
1ba20 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e  RUPT_DB ) return
1ba30 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e   1;.  if( pKeyIn
1ba40 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  fo->db->mallocFa
1ba50 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b  iled ) return 1;
1ba60 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
1ba70 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
1ba80 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f  E_DEBUG./*.** Co
1ba90 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
1baa0 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e  f fields (a.k.a.
1bab0 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65   columns) in the
1bac0 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79   record given by
1bad0 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20  .** pKey,nKey.  
1bae0 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74 20  The verify that 
1baf0 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65  this count is le
1bb00 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
1bb10 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74   to the.** limit
1bb20 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e   given by pKeyIn
1bb30 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65  fo->nField + pKe
1bb40 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a  yInfo->nXField..
1bb50 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f  **.** If this co
1bb60 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20  nstraint is not 
1bb70 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65  satisfied, it me
1bb80 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69 67  ans that the hig
1bb90 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52  h-speed.** vdbeR
1bba0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1bbb0 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64  ) and vdbeRecord
1bbc0 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20  CompareString() 
1bbd0 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a  routines will.**
1bbe0 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
1bbf0 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61 73  tly.  If this as
1bc00 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72 65  sert() ever fire
1bc10 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d  s, it probably m
1bc20 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65  eans.** that the
1bc30 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20   KeyInfo.nField 
1bc40 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65  or KeyInfo.nXFie
1bc50 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20 63  ld values were c
1bc60 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72  omputed.** incor
1bc70 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
1bc80 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65 72  c void vdbeAsser
1bc90 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69  tFieldCountWithi
1bca0 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e  nLimits(.  int n
1bcb0 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  Key, const void 
1bcc0 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20  *pKey,   /* The 
1bcd0 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79  record to verify
1bce0 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79   */ .  const Key
1bcf0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20  Info *pKeyInfo  
1bd00 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20       /* Compare 
1bd10 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b  size with this K
1bd20 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69  eyInfo */.){.  i
1bd30 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20  nt nField = 0;. 
1bd40 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33   u32 szHdr;.  u3
1bd50 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74  2 idx;.  u32 not
1bd60 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Used;.  const un
1bd70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
1bd80 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  y = (const unsig
1bd90 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a  ned char*)pKey;.
1bda0 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44  .  if( CORRUPT_D
1bdb0 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64  B ) return;.  id
1bdc0 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  x = getVarint32(
1bdd0 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20  aKey, szHdr);.  
1bde0 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20  assert( nKey>=0 
1bdf0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48  );.  assert( szH
1be00 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b  dr<=(u32)nKey );
1be10 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a  .  while( idx<sz
1be20 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b  Hdr ){.    idx +
1be30 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1be40 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29  ey+idx, notUsed)
1be50 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a  ;.    nField++;.
1be60 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46    }.  assert( nF
1be70 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f  ield <= pKeyInfo
1be80 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66  ->nField+pKeyInf
1be90 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a  o->nXField );.}.
1bea0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76  #else.# define v
1beb0 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
1bec0 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
1bed0 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f  A,B,C).#endif../
1bee0 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31  *.** Both *pMem1
1bef0 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74   and *pMem2 cont
1bf00 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65  ain string value
1bf10 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74  s. Compare the t
1bf20 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69  wo values.** usi
1bf30 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ng the collation
1bf40 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e   sequence pColl.
1bf50 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72   As usual, retur
1bf60 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a  n a negative , z
1bf70 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69  ero.** or positi
1bf80 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65  ve value if *pMe
1bf90 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c  m1 is less than,
1bfa0 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65   equal to or gre
1bfb0 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70  ater than .** *p
1bfc0 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65  Mem2, respective
1bfd0 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73  ly. Similar in s
1bfe0 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28  pirit to "rc = (
1bff0 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d  *pMem1) - (*pMem
1c000 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  2);"..*/.static 
1c010 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  int vdbeCompareM
1c020 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  emString(.  cons
1c030 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20  t Mem *pMem1,.  
1c040 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32  const Mem *pMem2
1c050 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  ,.  const CollSe
1c060 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a  q *pColl,.  u8 *
1c070 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20 20  prcErr          
1c080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1c090 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c  f an OOM occurs,
1c0a0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1c0b0 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  OMEM */.){.  if(
1c0c0 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f   pMem1->enc==pCo
1c0d0 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f  ll->enc ){.    /
1c0e0 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61 72  * The strings ar
1c0f0 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  e already in the
1c100 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e   correct encodin
1c110 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20  g.  Call the.   
1c120 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20    ** comparison 
1c130 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c  function directl
1c140 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  y */.    return 
1c150 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c  pColl->xCmp(pCol
1c160 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e  l->pUser,pMem1->
1c170 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32  n,pMem1->z,pMem2
1c180 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20  ->n,pMem2->z);. 
1c190 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1c1a0 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f  rc;.    const vo
1c1b0 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20  id *v1, *v2;.   
1c1c0 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20   int n1, n2;.   
1c1d0 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d   Mem c1;.    Mem
1c1e0 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   c2;.    sqlite3
1c1f0 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c  VdbeMemInit(&c1,
1c200 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1c210 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1c220 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1c230 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  2, pMem1->db, ME
1c240 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1c250 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c  ite3VdbeMemShall
1c260 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d  owCopy(&c1, pMem
1c270 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20  1, MEM_Ephem);. 
1c280 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
1c290 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32  mShallowCopy(&c2
1c2a0 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68  , pMem2, MEM_Eph
1c2b0 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71  em);.    v1 = sq
1c2c0 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1c2d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1c2e0 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c1, pColl->enc);
1c2f0 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20  .    n1 = v1==0 
1c300 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20  ? 0 : c1.n;.    
1c310 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  v2 = sqlite3Valu
1c320 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76  eText((sqlite3_v
1c330 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c  alue*)&c2, pColl
1c340 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d  ->enc);.    n2 =
1c350 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e   v2==0 ? 0 : c2.
1c360 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c  n;.    rc = pCol
1c370 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
1c380 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32  User, n1, v1, n2
1c390 2c 20 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  , v2);.    sqlit
1c3a0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1c3b0 28 26 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  (&c1);.    sqlit
1c3c0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1c3d0 28 26 63 32 29 3b 0a 20 20 20 20 69 66 28 20 28  (&c2);.    if( (
1c3e0 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20  v1==0 || v2==0) 
1c3f0 26 26 20 70 72 63 45 72 72 20 29 20 2a 70 72 63  && prcErr ) *prc
1c400 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  Err = SQLITE_NOM
1c410 45 4d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  EM;.    return r
1c420 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c;.  }.}../*.** 
1c430 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62  Compare two blob
1c440 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  s.  Return negat
1c450 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1c460 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1c470 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74  rst.** is less t
1c480 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1c490 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74  r greater than t
1c4a0 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65  he second, respe
1c4b0 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f  ctively..** If o
1c4c0 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65  ne blob is a pre
1c4d0 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72  fix of the other
1c4e0 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74  , then the short
1c4f0 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72  er is the lessor
1c500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49  ..*/.static SQLI
1c510 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20  TE_NOINLINE int 
1c520 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61  sqlite3BlobCompa
1c530 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42  re(const Mem *pB
1c540 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42  1, const Mem *pB
1c550 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65  2){.  int c = me
1c560 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32  mcmp(pB1->z, pB2
1c570 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d  ->z, pB1->n>pB2-
1c580 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42  >n ? pB2->n : pB
1c590 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29  1->n);.  if( c )
1c5a0 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74   return c;.  ret
1c5b0 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32  urn pB1->n - pB2
1c5c0 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f  ->n;.}../*.** Do
1c5d0 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65   a comparison be
1c5e0 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73  tween a 64-bit s
1c5f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e  igned integer an
1c600 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74  d a 64-bit float
1c610 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d  ing-point.** num
1c620 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67  ber.  Return neg
1c630 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
1c640 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20  positive if the 
1c650 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c  first (i64) is l
1c660 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75  ess than,.** equ
1c670 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65  al to, or greate
1c680 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e  r than the secon
1c690 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73  d (double)..*/.s
1c6a0 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
1c6b0 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1c6c0 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72  (i64 i, double r
1c6d0 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28  ){.  if( sizeof(
1c6e0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1c6f0 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f  >8 ){.    LONGDO
1c700 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c  UBLE_TYPE x = (L
1c710 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69  ONGDOUBLE_TYPE)i
1c720 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20  ;.    if( x<r ) 
1c730 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1c740 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20  f( x>r ) return 
1c750 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1c760 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1c770 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65  64 y;.    double
1c780 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39   s;.    if( r<-9
1c790 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38  2233720368547758
1c7a0 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31  08.0 ) return +1
1c7b0 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32 33  ;.    if( r>9223
1c7c0 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e  372036854775807.
1c7d0 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1c7e0 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20     y = (i64)r;. 
1c7f0 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74     if( i<y ) ret
1c800 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1c810 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28  i>y ){.      if(
1c820 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54   y==SMALLEST_INT
1c830 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65  64 && r>0.0 ) re
1c840 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72  turn -1;.      r
1c850 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a  eturn +1;.    }.
1c860 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29      s = (double)
1c870 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29  i;.    if( s<r )
1c880 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c890 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e  if( s>r ) return
1c8a0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1c8b0 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
1c8c0 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75  Compare the valu
1c8d0 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20  es contained by 
1c8e0 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63  the two memory c
1c8f0 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a  ells, returning.
1c900 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  ** negative, zer
1c910 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  o or positive if
1c920 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74   pMem1 is less t
1c930 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f  han, equal to, o
1c940 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61  r greater.** tha
1c950 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67  n pMem2. Sorting
1c960 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73   order is NULL's
1c970 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64   first, followed
1c980 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74   by numbers (int
1c990 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61  egers.** and rea
1c9a0 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72  ls) sorted numer
1c9b0 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64  ically, followed
1c9c0 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64   by text ordered
1c9d0 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e   by the collatin
1c9e0 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43  g.** sequence pC
1c9f0 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20  oll and finally 
1ca00 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62  blob's ordered b
1ca10 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a  y memcmp()..**.*
1ca20 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65  * Two NULL value
1ca30 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
1ca40 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66   equal by this f
1ca50 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  unction..*/.int 
1ca60 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1ca70 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  e(const Mem *pMe
1ca80 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  m1, const Mem *p
1ca90 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c  Mem2, const Coll
1caa0 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69  Seq *pColl){.  i
1cab0 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74  nt f1, f2;.  int
1cac0 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b   combined_flags;
1cad0 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e  ..  f1 = pMem1->
1cae0 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d  flags;.  f2 = pM
1caf0 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f  em2->flags;.  co
1cb00 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66  mbined_flags = f
1cb10 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20  1|f2;.  assert( 
1cb20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20  (combined_flags 
1cb30 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30  & MEM_RowSet)==0
1cb40 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e   );. .  /* If on
1cb50 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c  e value is NULL,
1cb60 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
1cb70 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62   the other. If b
1cb80 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20  oth values.  ** 
1cb90 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e  are NULL, return
1cba0 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63   0..  */.  if( c
1cbb0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1cbc0 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65  M_Null ){.    re
1cbd0 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c  turn (f2&MEM_Nul
1cbe0 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c  l) - (f1&MEM_Nul
1cbf0 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74  l);.  }..  /* At
1cc00 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
1cc10 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20  e two values is 
1cc20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20  a number.  */.  
1cc30 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1cc40 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f  gs&(MEM_Int|MEM_
1cc50 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  Real) ){.    if(
1cc60 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f   (f1 & f2 & MEM_
1cc70 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1cc80 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1cc90 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  < pMem2->u.i ) r
1cca0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1ccb0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e  if( pMem1->u.i >
1ccc0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1ccd0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72  turn +1;.      r
1cce0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
1ccf0 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1cd00 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29  & MEM_Real)!=0 )
1cd10 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  {.      if( pMem
1cd20 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e  1->u.r < pMem2->
1cd30 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  u.r ) return -1;
1cd40 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1cd50 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75  ->u.r > pMem2->u
1cd60 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .r ) return +1;.
1cd70 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
1cd80 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66      }.    if( (f
1cd90 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  1&MEM_Int)!=0 ){
1cda0 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d  .      if( (f2&M
1cdb0 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20  EM_Real)!=0 ){. 
1cdc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71         return sq
1cdd0 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d  lite3IntFloatCom
1cde0 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c  pare(pMem1->u.i,
1cdf0 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20   pMem2->u.r);.  
1ce00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ce10 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
1ce20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1ce30 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1ce40 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1ce50 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d  ( (f2&MEM_Int)!=
1ce60 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1ce70 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46  urn -sqlite3IntF
1ce80 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d  loatCompare(pMem
1ce90 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75  2->u.i, pMem1->u
1cea0 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  .r);.      }else
1ceb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1cec0 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1ced0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31   }.    return +1
1cee0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f  ;.  }..  /* If o
1cef0 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74  ne value is a st
1cf00 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68  ring and the oth
1cf10 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68  er is a blob, th
1cf20 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73  e string is less
1cf30 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61  ..  ** If both a
1cf40 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70  re strings, comp
1cf50 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f  are using the co
1cf60 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
1cf70 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  s..  */.  if( co
1cf80 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1cf90 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20  _Str ){.    if( 
1cfa0 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d  (f1 & MEM_Str)==
1cfb0 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1cfc0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
1cfd0 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72  f( (f2 & MEM_Str
1cfe0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
1cff0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a  turn -1;.    }..
1d000 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1d010 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65  1->enc==pMem2->e
1d020 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d  nc || pMem1->db-
1d030 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
1d040 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1d050 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  m1->enc==SQLITE_
1d060 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20  UTF8 || .       
1d070 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d       pMem1->enc=
1d080 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
1d090 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  || pMem1->enc==S
1d0a0 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b  QLITE_UTF16BE );
1d0b0 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c  ..    /* The col
1d0c0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
1d0d0 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20  must be defined 
1d0e0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65  at this point, e
1d0f0 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68  ven if.    ** th
1d100 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74  e user deletes t
1d110 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1d120 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20  uence after the 
1d130 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a  vdbe program is.
1d140 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20      ** compiled 
1d150 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c  (this was not al
1d160 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a  ways the case)..
1d170 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1d180 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f  t( !pColl || pCo
1d190 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20  ll->xCmp );..   
1d1a0 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20   if( pColl ){.  
1d1b0 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43      return vdbeC
1d1c0 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1d1d0 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43  pMem1, pMem2, pC
1d1e0 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  oll, 0);.    }. 
1d1f0 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20     /* If a NULL 
1d200 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73  pointer was pass
1d210 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74  ed as the collat
1d220 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c  e function, fall
1d230 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20   through.    ** 
1d240 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65  to the blob case
1d250 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28   and use memcmp(
1d260 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f  ).  */.  }. .  /
1d270 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75  * Both values mu
1d280 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f  st be blobs.  Co
1d290 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63  mpare using memc
1d2a0 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75  mp().  */.  retu
1d2b0 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f  rn sqlite3BlobCo
1d2c0 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65  mpare(pMem1, pMe
1d2d0 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  m2);.}.../*.** T
1d2e0 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
1d2f0 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  t passed to this
1d300 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73   function is a s
1d310 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a  erial-type that.
1d320 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  ** corresponds t
1d330 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61  o an integer - a
1d340 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65  ll values betwee
1d350 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73  n 1 and 9 inclus
1d360 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37  ive .** except 7
1d370 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69  . The second poi
1d380 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
1d390 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e  containing an in
1d3a0 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73  teger value.** s
1d3b0 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64  erialized accord
1d3c0 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79  ing to serial_ty
1d3d0 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  pe. This functio
1d3e0 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a  n deserializes.*
1d3f0 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  * and returns th
1d400 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  e value..*/.stat
1d410 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72  ic i64 vdbeRecor
1d420 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73  dDecodeInt(u32 s
1d430 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73  erial_type, cons
1d440 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75  t u8 *aKey){.  u
1d450 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20  32 y;.  assert( 
1d460 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73  CORRUPT_DB || (s
1d470 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26  erial_type>=1 &&
1d480 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20   serial_type<=9 
1d490 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d  && serial_type!=
1d4a0 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20  7) );.  switch( 
1d4b0 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20  serial_type ){. 
1d4c0 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63     case 0:.    c
1d4d0 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73  ase 1:.      tes
1d4e0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1d4f0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1d500 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54  urn ONE_BYTE_INT
1d510 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1d520 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   2:.      testca
1d530 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d540 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d550 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1d560 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a  ey);.    case 3:
1d570 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1d580 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1d590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48  .      return TH
1d5a0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
1d5b0 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20  y);.    case 4: 
1d5c0 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1d5d0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1d5e0 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  ;.      y = FOUR
1d5f0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1d600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28  ;.      return (
1d610 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1d620 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a     }.    case 5:
1d630 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1d640 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1d650 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d660 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1d670 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1d680 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1d690 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1d6a0 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a  }.    case 6: {.
1d6b0 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f        u64 x = FO
1d6c0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1d6d0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1d6e0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d6f0 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78   );.      x = (x
1d700 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54  <<32) | FOUR_BYT
1d710 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a  E_UINT(aKey+4);.
1d720 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1d730 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  4)*(i64*)&x;.   
1d740 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
1d750 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20   (serial_type - 
1d760 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  8);.}../*.** Thi
1d770 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1d780 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c  res the two tabl
1d790 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20  e rows or index 
1d7a0 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69  records.** speci
1d7b0 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20  fied by {nKey1, 
1d7c0 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79  pKey1} and pPKey
1d7d0 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61  2.  It returns a
1d7e0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a   negative, zero.
1d7f0 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ** or positive i
1d800 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69  nteger if key1 i
1d810 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1d820 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65  al to or .** gre
1d830 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20  ater than key2. 
1d840 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65   The {nKey1, pKe
1d850 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20  y1} key must be 
1d860 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65  a blob.** create
1d870 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1d880 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66  Record opcode of
1d890 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20   the VDBE.  The 
1d8a0 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75  pPKey2.** key mu
1d8b0 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b  st be a parsed k
1d8c0 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69  ey such as obtai
1d8d0 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  ned from.** sqli
1d8e0 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f  te3VdbeParseReco
1d8f0 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67  rd..**.** If arg
1d900 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e  ument bSkip is n
1d910 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61  on-zero, it is a
1d920 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
1d930 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61  caller has alrea
1d940 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  dy.** determined
1d950 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20   that the first 
1d960 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65  fields of the ke
1d970 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a  ys are equal..**
1d980 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79  .** Key1 and Key
1d990 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f  2 do not have to
1d9a0 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
1d9b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c  e number of fiel
1d9c0 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66  ds. If all .** f
1d9d0 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61  ields that appea
1d9e0 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61  r in both keys a
1d9f0 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70  re equal, then p
1da00 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
1da10 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  c is .** returne
1da20 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61  d..**.** If data
1da30 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
1da40 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73  is discovered, s
1da50 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  et pPKey2->errCo
1da60 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45  de to .** SQLITE
1da70 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74  _CORRUPT and ret
1da80 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d  urn 0. If an OOM
1da90 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1daa0 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79  tered, .** pPKey
1dab0 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65  2->errCode is se
1dac0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  t to SQLITE_NOME
1dad0 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20  M and, if it is 
1dae0 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a  not NULL, the.**
1daf0 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66   malloc-failed f
1db00 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62  lag set on datab
1db10 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65  ase handle (pPKe
1db20 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  y2->pKeyInfo->db
1db30 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
1db40 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1db50 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e  reWithSkip(.  in
1db60 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
1db70 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a  oid *pKey1,   /*
1db80 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55   Left key */.  U
1db90 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1dba0 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f  PKey2,         /
1dbb0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20  * Right key */. 
1dbc0 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20   int bSkip      
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69   /* If true, ski
1dbf0 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  p the first fiel
1dc00 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31  d */.){.  u32 d1
1dc10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dc20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1dc30 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1dc40 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1dc50 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  ment */.  int i;
1dc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
1dc80 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64  ex of next field
1dc90 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20   to compare */. 
1dca0 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20   u32 szHdr1;    
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dcc0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f   /* Size of reco
1dcd0 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74  rd header in byt
1dce0 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31  es */.  u32 idx1
1dcf0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1dd00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1dd10 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20  t of first type 
1dd20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1dd30 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20  nt rc = 0;      
1dd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1dd50 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a  * Return value *
1dd60 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20  /.  Mem *pRhs = 
1dd70 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20  pPKey2->aMem;   
1dd80 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c      /* Next fiel
1dd90 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63  d of pPKey2 to c
1dda0 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49  ompare */.  KeyI
1ddb0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20  nfo *pKeyInfo = 
1ddc0 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ddd0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1dde0 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d  ed char *aKey1 =
1ddf0 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64   (const unsigned
1de00 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20   char *)pKey1;. 
1de10 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a   Mem mem1;..  /*
1de20 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75   If bSkip is tru
1de30 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c  e, then the call
1de40 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64  er has already d
1de50 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74  etermined that t
1de60 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77  he first.  ** tw
1de70 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68  o elements in th
1de80 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c  e keys are equal
1de90 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75  . Fix the variou
1dea0 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65  s stack variable
1deb0 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74  s so.  ** that t
1dec0 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69  his routine begi
1ded0 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20  ns comparing at 
1dee0 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64  the second field
1def0 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70  . */.  if( bSkip
1df00 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a   ){.    u32 s1;.
1df10 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67      idx1 = 1 + g
1df20 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1df30 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73  1[1], s1);.    s
1df40 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d  zHdr1 = aKey1[0]
1df50 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72  ;.    d1 = szHdr
1df60 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53  1 + sqlite3VdbeS
1df70 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29  erialTypeLen(s1)
1df80 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20  ;.    i = 1;.   
1df90 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65   pRhs++;.  }else
1dfa0 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74  {.    idx1 = get
1dfb0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20  Varint32(aKey1, 
1dfc0 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20  szHdr1);.    d1 
1dfd0 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66  = szHdr1;.    if
1dfe0 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e  ( d1>(unsigned)n
1dff0 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70  Key1 ){ .      p
1e000 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1e010 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1e020 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1e030 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f  return 0;  /* Co
1e040 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
1e050 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d  }.    i = 0;.  }
1e060 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65  ..  VVA_ONLY( me
1e070 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b  m1.szMalloc = 0;
1e080 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65   ) /* Only neede
1e090 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74  d by assert() st
1e0a0 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73  atements */.  as
1e0b0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b  sert( pPKey2->pK
1e0c0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70  eyInfo->nField+p
1e0d0 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1e0e0 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32  >nXField>=pPKey2
1e0f0 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20  ->nField .      
1e100 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1e110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1e120 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  y2->pKeyInfo->aS
1e130 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20  ortOrder!=0 );. 
1e140 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1e150 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1e160 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d>0 );.  assert(
1e170 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c   idx1<=szHdr1 ||
1e180 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20   CORRUPT_DB );. 
1e190 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72   do{.    u32 ser
1e1a0 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f  ial_type;..    /
1e1b0 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65  * RHS is an inte
1e1c0 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ger */.    if( p
1e1d0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1e1e0 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65  _Int ){.      se
1e1f0 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1e200 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74  1[idx1];.      t
1e210 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f  estcase( serial_
1e220 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20  type==12 );.    
1e230 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1e240 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20  e>=10 ){.       
1e250 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1e260 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1e270 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1e280 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1e2a0 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1e2b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1e2c0 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65  beSerialGet(&aKe
1e2d0 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74  y1[d1], serial_t
1e2e0 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20  ype, &mem1);.   
1e2f0 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74       rc = -sqlit
1e300 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1e310 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d  e(pRhs->u.i, mem
1e320 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  1.u.r);.      }e
1e330 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
1e340 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72   lhs = vdbeRecor
1e350 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61  dDecodeInt(seria
1e360 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64  l_type, &aKey1[d
1e370 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34  1]);.        i64
1e380 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69   rhs = pRhs->u.i
1e390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68  ;.        if( lh
1e3a0 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s<rhs ){.       
1e3b0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1e3c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68      }else if( lh
1e3d0 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  s>rhs ){.       
1e3e0 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1e400 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1e410 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65  is real */.    e
1e420 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1e430 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
1e440 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1e450 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1e460 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  ];.      if( ser
1e470 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a  ial_type>=10 ){.
1e480 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
1e490 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72  l types 12 or gr
1e4a0 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67  eater are string
1e4b0 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65  s and blobs (gre
1e4c0 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20  ater than.      
1e4d0 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54    ** numbers). T
1e4e0 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61  ypes 10 and 11 a
1e4f0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65  re currently "re
1e500 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72  served for futur
1e510 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73  e .        ** us
1e520 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27  e", so it doesn'
1e530 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20  t really matter 
1e540 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73  what the results
1e550 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20   of comparing.  
1e560 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f        ** them to
1e570 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73   numberic values
1e580 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20   are.  */.      
1e590 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1e5a0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1e5b0 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1e5c0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1e5d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e5e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1e5f0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1e600 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1e610 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1e620 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1e630 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
1e640 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52   if( mem1.u.r<pR
1e650 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
1e660 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1e670 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
1e680 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68  if( mem1.u.r>pRh
1e690 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
1e6a0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1e6b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e6c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e6d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e6e0 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1e6f0 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e  mem1.u.i, pRhs->
1e700 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  u.r);.        }.
1e710 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1e720 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
1e730 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
1e740 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1e750 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
1e760 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1e770 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1e780 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1e790 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1e7a0 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1e7b0 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1e7c0 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1e7d0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e7e0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1e7f0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1e800 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1e810 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1e820 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1e830 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1e840 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1e850 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1e860 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
1e870 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1e880 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1e890 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
1e8a0 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1e8b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1e8c0 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
1e8d0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1e8e0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1e8f0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1e900 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e910 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1e920 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1e930 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1e940 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1e950 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
1e960 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
1e970 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1e980 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1e990 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  enc;.          m
1e9a0 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1e9b0 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  o->db;.         
1e9c0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45   mem1.flags = ME
1e9d0 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20  M_Str;.         
1e9e0 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a   mem1.z = (char*
1e9f0 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20  )&aKey1[d1];.   
1ea00 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
1ea10 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1ea20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1ea30 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65  &mem1, pRhs, pKe
1ea40 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c  yInfo->aColl[i],
1ea50 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64   &pPKey2->errCod
1ea60 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
1ea70 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1ea80 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1ea90 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
1eaa0 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1eab0 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1eac0 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1ead0 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1eae0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1eaf0 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
1eb00 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
1eb10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1eb20 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1eb30 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
1eb40 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1eb50 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
1eb60 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1eb70 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1eb80 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1eb90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1eba0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1ebb0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1ebc0 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73  al_type<12 || (s
1ebd0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1ebe0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1ebf0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1ec00 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1ec10 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
1ec20 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1ec30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ec40 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73   (d1+nStr)==(uns
1ec50 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1ec60 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1ec70 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75   (d1+nStr+1)==(u
1ec80 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1ec90 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1eca0 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e  +nStr) > (unsign
1ecb0 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1ecc0 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1ecd0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1ece0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ecf0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1ed00 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1ed10 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1ed20 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1ed30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1ed40 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
1ed50 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
1ed60 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1ed70 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1ed80 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1ed90 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1eda0 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
1edb0 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
1edc0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1edd0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1ede0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
1edf0 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
1ee00 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1ee10 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
1ee20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
1ee30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1ee40 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
1ee50 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1ee60 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1ee70 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
1ee80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1ee90 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
1eea0 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1eeb0 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1eec0 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
1eed0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1eee0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1eef0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1ef00 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
1ef10 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1ef20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b   i++;.    pRhs++
1ef30 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
1ef40 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1ef50 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1ef60 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
1ef70 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
1ef80 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ef90 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
1efa0 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
1efb0 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1efc0 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  d && d1<=(unsign
1efd0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
1efe0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1eff0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1f000 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1f010 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1f020 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1f030 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1f040 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1f050 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1f060 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1f070 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1f080 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1f090 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1f0a0 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
1f0b0 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1f0c0 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1f0d0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1f0e0 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
1f0f0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1f100 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1f110 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1f120 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1f130 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1f140 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1f150 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1f160 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
1f170 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
1f180 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
1f190 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1f1a0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1f1b0 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
1f1c0 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
1f1d0 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62   || pKeyInfo->db
1f1e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
1f1f0 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71   );.  pPKey2->eq
1f200 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75  Seen = 1;.  retu
1f210 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75  rn pPKey2->defau
1f220 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  lt_rc;.}.int sql
1f230 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1f240 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65  mpare(.  int nKe
1f250 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1f260 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1f270 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1f280 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1f290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67            /* Rig
1f2a0 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72  ht key */.){.  r
1f2b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1f2c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69  eRecordCompareWi
1f2d0 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b  thSkip(nKey1, pK
1f2e0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b  ey1, pPKey2, 0);
1f2f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1f300 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1f310 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1f320 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1f330 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1f340 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1f350 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1f360 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65  PKey2 is an inte
1f370 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65  ger, and (b) the
1f380 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61   .** size-of-hea
1f390 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68  der varint at th
1f3a0 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79  e start of (pKey
1f3b0 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e  1/nKey1) fits in
1f3c0 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74   a single.** byt
1f3d0 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20  e (i.e. is less 
1f3e0 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a  than 128)..**.**
1f3f0 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72   To avoid concer
1f400 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20  ns about buffer 
1f410 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20  overreads, this 
1f420 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20  routine is only 
1f430 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d  used.** on schem
1f440 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78  as where the max
1f450 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65  imum valid heade
1f460 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74  r size is 63 byt
1f470 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73  es or less..*/.s
1f480 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1f490 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a  cordCompareInt(.
1f4a0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
1f4b0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20  st void *pKey1, 
1f4c0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1f4d0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1f4e0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f  *pPKey2        /
1f4f0 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29  * Right key */.)
1f500 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b  {.  const u8 *aK
1f510 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38  ey = &((const u8
1f520 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74  *)pKey1)[*(const
1f530 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33   u8*)pKey1 & 0x3
1f540 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c  F];.  int serial
1f550 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20  _type = ((const 
1f560 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20  u8*)pKey1)[1];. 
1f570 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20   int res;.  u32 
1f580 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36  y;.  u64 x;.  i6
1f590 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  4 v = pPKey2->aM
1f5a0 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36 34  em[0].u.i;.  i64
1f5b0 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73 73   lhs;..  vdbeAss
1f5c0 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1f5d0 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31 2c  hinLimits(nKey1,
1f5e0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d 3e   pKey1, pPKey2->
1f5f0 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73 73  pKeyInfo);.  ass
1f600 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79  ert( (*(u8*)pKey
1f610 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52  1)<=0x3F || CORR
1f620 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74  UPT_DB );.  swit
1f630 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20  ch( serial_type 
1f640 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b  ){.    case 1: {
1f650 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65   /* 1-byte signe
1f660 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
1f670 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54     lhs = ONE_BYT
1f680 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1f690 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f6a0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f6b0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f6c0 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65  e 2: { /* 2-byte
1f6d0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1f6e0 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54  */.      lhs = T
1f6f0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1f700 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f710 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1f720 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f730 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
1f740 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
1f750 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c  teger */.      l
1f760 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f  hs = THREE_BYTE_
1f770 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f780 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1f790 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f7a0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f7b0 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73  4: { /* 4-byte s
1f7c0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1f7d0 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1f7e0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1f7f0 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36  .      lhs = (i6
1f800 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1f810 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1f820 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1f830 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1f840 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
1f850 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1f860 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46  */.      lhs = F
1f870 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1f880 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1f890 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1f8a0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20  INT(aKey);.     
1f8b0 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30   testcase( lhs<0
1f8c0 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
1f8d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1f8e0 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73  6: { /* 8-byte s
1f8f0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1f900 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f  .      x = FOUR_
1f910 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1f920 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33  .      x = (x<<3
1f930 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55  2) | FOUR_BYTE_U
1f940 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20  INT(aKey+4);.   
1f950 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29     lhs = *(i64*)
1f960 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  &x;.      testca
1f970 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f980 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f990 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20      case 8: .   
1f9a0 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20     lhs = 0;.    
1f9b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1f9c0 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d  e 9:.      lhs =
1f9d0 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
1f9e0 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61  ..    /* This ca
1f9f0 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f  se could be remo
1fa00 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e  ved without chan
1fa10 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73  ging the results
1fa20 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20   of running.    
1fa30 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e  ** this code. In
1fa40 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65  cluding it cause
1fa50 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74  s gcc to generat
1fa60 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63  e a faster switc
1fa70 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d  h .    ** statem
1fa80 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72  ent (since the r
1fa90 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74  ange of switch t
1faa0 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74  argets now start
1fab0 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20  s at zero and.  
1fac0 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f    ** is contiguo
1fad0 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  us) but does not
1fae0 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69   cause any dupli
1faf0 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20  cate code to be 
1fb00 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a  generated.    **
1fb10 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76   (as gcc is clev
1fb20 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d  er enough to com
1fb30 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b  bine the two lik
1fb40 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20  e cases). Other 
1fb50 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72  .    ** compiler
1fb60 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c  s might be simil
1fb70 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73  ar.  */ .    cas
1fb80 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20  e 0: case 7:.   
1fb90 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1fba0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1fbb0 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  re(nKey1, pKey1,
1fbc0 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64   pPKey2);..    d
1fbd0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
1fbe0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1fbf0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b  RecordCompare(nK
1fc00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fc10 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  y2);.  }..  if( 
1fc20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73  v>lhs ){.    res
1fc30 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
1fc40 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73   }else if( v<lhs
1fc50 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
1fc60 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73  Key2->r2;.  }els
1fc70 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46  e if( pPKey2->nF
1fc80 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ield>1 ){.    /*
1fc90 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   The first field
1fca0 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79  s of the two key
1fcb0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d  s are equal. Com
1fcc0 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e  pare the trailin
1fcd0 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73  g .    ** fields
1fce0 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  .  */.    res = 
1fcf0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1fd00 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1fd10 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
1fd20 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65 6c  PKey2, 1);.  }el
1fd30 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66  se{.    /* The f
1fd40 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74  irst fields of t
1fd50 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65 20  he two keys are 
1fd60 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65 20  equal and there 
1fd70 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67 0a  are no trailing.
1fd80 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 52      ** fields. R
1fd90 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65  eturn pPKey2->de
1fda0 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69 73  fault_rc in this
1fdb0 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72 65   case. */.    re
1fdc0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  s = pPKey2->defa
1fdd0 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b 65  ult_rc;.    pPKe
1fde0 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
1fdf0 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
1fe00 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fe10 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1fe20 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
1fe30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1fe40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1fe50 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1fe60 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1fe70 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1fe80 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1fe90 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1fea0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1feb0 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
1fec0 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
1fed0 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
1fee0 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
1fef0 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
1ff00 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
1ff10 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
1ff20 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
1ff30 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1ff40 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1ff50 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1ff60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ff70 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1ff80 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
1ff90 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1ffa0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1ffb0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1ffc0 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1ffd0 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1ffe0 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1fff0 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28  st u8 *aKey1 = (
20000 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b  const u8*)pKey1;
20010 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
20020 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pe;.  int res;..
20030 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
20040 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 20  ->aMem[0].flags 
20050 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 76  & MEM_Str );.  v
20060 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f  dbeAssertFieldCo
20070 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28  untWithinLimits(
20080 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
20090 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b  Key2->pKeyInfo);
200a0 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  .  getVarint32(&
200b0 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c  aKey1[1], serial
200c0 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65  _type);.  if( se
200d0 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a  rial_type<12 ){.
200e0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
200f0 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70  ->r1;      /* (p
20100 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61  Key1/nKey1) is a
20110 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c   number or a nul
20120 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  l */.  }else if(
20130 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26   !(serial_type &
20140 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72   0x01) ){ .    r
20150 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
20160 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f        /* (pKey1/
20170 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62  nKey1) is a blob
20180 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
20190 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69   int nCmp;.    i
201a0 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74  nt nStr;.    int
201b0 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30   szHdr = aKey1[0
201c0 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28  ];..    nStr = (
201d0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20  serial_type-12) 
201e0 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a  / 2;.    if( (sz
201f0 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b  Hdr + nStr) > nK
20200 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b  ey1 ){.      pPK
20210 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
20220 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
20230 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
20240 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f  turn 0;    /* Co
20250 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  rruption */.    
20260 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e  }.    nCmp = MIN
20270 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30  ( pPKey2->aMem[0
20280 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20  ].n, nStr );.   
20290 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61   res = memcmp(&a
202a0 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b  Key1[szHdr], pPK
202b0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20  ey2->aMem[0].z, 
202c0 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20  nCmp);..    if( 
202d0 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
202e0 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b  res = nStr - pPK
202f0 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a  ey2->aMem[0].n;.
20300 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30        if( res==0
20310 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
20320 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31  pPKey2->nField>1
20330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
20340 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
20350 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
20360 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
20370 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
20380 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
20390 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50          res = pP
203a0 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
203b0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65  ;.          pPKe
203c0 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b 0a  y2->eqSeen = 1;.
203d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
203e0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
203f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d  ){.        res =
20400 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20   pPKey2->r2;.   
20410 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
20420 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20430 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r1;.      }.    
20440 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20  }else if( res>0 
20450 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70  ){.      res = p
20460 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d  PKey2->r2;.    }
20470 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20  else{.      res 
20480 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
20490 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72    }.  }..  asser
204a0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
204b0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
204c0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
204d0 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43  res).       || C
204e0 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20  ORRUPT_DB.      
204f0 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79   || pPKey2->pKey
20500 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
20510 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
20520 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a  turn res;.}../*.
20530 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
20540 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
20550 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
20560 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20  re() compatible 
20570 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74  function.** suit
20580 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69  able for compari
20590 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65  ng serialized re
205a0 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70  cords to the unp
205b0 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73  acked record pas
205c0 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e  sed.** as the on
205d0 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ly argument..*/.
205e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71  RecordCompare sq
205f0 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d  lite3VdbeFindCom
20600 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63  pare(UnpackedRec
20610 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61  ord *p){.  /* va
20620 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
20630 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e  eInt() and varin
20640 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74  tRecordCompareSt
20650 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75  ring() both assu
20660 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  me.  ** that the
20670 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20   size-of-header 
20680 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75  varint that occu
20690 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20  rs at the start 
206a0 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20  of each record. 
206b0 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69   ** fits in a si
206c0 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20  ngle byte (i.e. 
206d0 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e  is 127 or less).
206e0 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d   varintRecordCom
206f0 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61  pareInt().  ** a
20700 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74  lso assumes that
20710 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f   it is safe to o
20720 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72  verread a buffer
20730 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65   by at least the
20740 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70   .  ** maximum p
20750 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65  ossible legal he
20760 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38  ader size plus 8
20770 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20   bytes. Because 
20780 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75  there is.  ** gu
20790 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
207a0 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20  t least 74 (but 
207b0 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f  not 136) bytes o
207c0 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77  f padding follow
207d0 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75  ing each.  ** bu
207e0 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76  ffer passed to v
207f0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
20800 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b  reInt() this mak
20810 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74  es it convenient
20820 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74   to.  ** limit t
20830 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
20840 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65  eader to 64 byte
20850 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65  s in cases where
20860 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20870 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65  .  ** is an inte
20880 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ger..  **.  ** T
20890 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74  he easiest way t
208a0 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c  o enforce this l
208b0 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69  imit is to consi
208c0 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73  der only records
208d0 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69   with.  ** 13 fi
208e0 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66  elds or less. If
208f0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
20900 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20   is an integer, 
20910 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61  the maximum lega
20920 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69  l.  ** header si
20930 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20  ze is (12*5 + 1 
20940 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a  + 1) bytes.  */.
20950 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e    if( (p->pKeyIn
20960 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e  fo->nField + p->
20970 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
20980 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e  d)<=13 ){.    in
20990 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65  t flags = p->aMe
209a0 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20  m[0].flags;.    
209b0 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d  if( p->pKeyInfo-
209c0 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29  >aSortOrder[0] )
209d0 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20  {.      p->r1 = 
209e0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
209f0 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
20a00 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31        p->r1 = -1
20a10 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
20a20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
20a30 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e   (flags & MEM_In
20a40 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  t) ){.      retu
20a50 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
20a60 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20  pareInt;.    }. 
20a70 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
20a80 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b  gs & MEM_Real );
20a90 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66  .    testcase( f
20aa0 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20  lags & MEM_Null 
20ab0 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
20ac0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f   flags & MEM_Blo
20ad0 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c  b );.    if( (fl
20ae0 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c  ags & (MEM_Real|
20af0 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f  MEM_Null|MEM_Blo
20b00 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65  b))==0 && p->pKe
20b10 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d  yInfo->aColl[0]=
20b20 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
20b30 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f  rt( flags & MEM_
20b40 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74  Str );.      ret
20b50 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
20b60 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20  mpareString;.   
20b70 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
20b80 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20b90 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a  rdCompare;.}../*
20ba0 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20  .** pCur points 
20bb0 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72  at an index entr
20bc0 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20  y created using 
20bd0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
20be0 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61  d opcode..** Rea
20bf0 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65  d the rowid (the
20c00 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74   last field in t
20c10 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73  he record) and s
20c20 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69  tore it in *rowi
20c30 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  d..** Return SQL
20c40 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74  ITE_OK if everyt
20c50 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61  hing works, or a
20c60 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68  n error code oth
20c70 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43  erwise..**.** pC
20c80 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e  ur might be poin
20c90 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74  ting to text obt
20ca0 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72  ained from a cor
20cb0 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
20cc0 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f  le..** So the co
20cd0 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntent cannot be 
20ce0 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70  trusted.  Do app
20cf0 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20  ropriate checks 
20d00 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a  on the content..
20d10 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
20d20 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74  beIdxRowid(sqlit
20d30 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72  e3 *db, BtCursor
20d40 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77   *pCur, i64 *row
20d50 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c  id){.  i64 nCell
20d60 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  Key = 0;.  int r
20d70 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20  c;.  u32 szHdr; 
20d80 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
20d90 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a  f the header */.
20da0 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b    u32 typeRowid;
20db0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
20dc0 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  pe of the rowid 
20dd0 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69  */.  u32 lenRowi
20de0 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  d;     /* Size o
20df0 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
20e00 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a   Mem m, v;..  /*
20e10 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   Get the size of
20e20 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
20e30 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20  .  Only indices 
20e40 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a  entries of less.
20e50 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61    ** than 2GiB a
20e60 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79  re support - any
20e70 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74  thing large must
20e80 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72   be database cor
20e90 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e  ruption..  ** An
20ea0 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  y corruption is 
20eb0 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69  detected in sqli
20ec0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
20ed0 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20  lPtr(), though, 
20ee0 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64  so.  ** this cod
20ef0 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73  e can safely ass
20f00 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65  ume that nCellKe
20f10 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20  y is 32-bits  . 
20f20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
20f30 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
20f40 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b  IsValid(pCur) );
20f50 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d  .  VVA_ONLY(rc =
20f60 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  ) sqlite3BtreeKe
20f70 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65  ySize(pCur, &nCe
20f80 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74  llKey);.  assert
20f90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20fa0 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69  );     /* pCur i
20fb0 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
20fc0 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
20fd0 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72   fail */.  asser
20fe0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
20ff0 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
21000 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
21010 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
21020 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
21030 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
21040 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
21050 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
21060 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
21070 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
21080 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
21090 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
210a0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
210b0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
210c0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
210d0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
210e0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
210f0 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
21100 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
21110 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
21120 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
21130 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
21140 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
21150 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
21160 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
21170 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
21180 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21190 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
211a0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
211b0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
211c0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
211d0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
211e0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
211f0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
21200 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
21210 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
21220 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
21230 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
21240 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
21250 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
21260 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21270 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
21280 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
21290 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
212a0 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
212b0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
212c0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
212d0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
212e0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
212f0 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
21300 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21310 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
21320 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21330 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
21340 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
21350 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
21360 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
21370 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
21380 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
21390 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
213a0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
213b0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
213c0 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
213d0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
213e0 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
213f0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
21400 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
21410 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
21420 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
21430 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
21440 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
21450 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
21460 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
21470 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
21480 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
21490 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
214a0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
214b0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
214c0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
214d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
214e0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
214f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
21500 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
21510 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
21520 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
21530 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
21540 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
21550 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
21560 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
21570 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
21580 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
21590 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
215a0 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
215b0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
215c0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
215d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
215e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
215f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
21600 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
21610 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
21620 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
21630 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
21640 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
21650 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
21660 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
21670 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
21680 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
21690 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
216a0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
216b0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
216c0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
216d0 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
216e0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
216f0 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
21700 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
21710 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
21720 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
21730 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
21740 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
21750 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
21760 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
21770 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
21780 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
21790 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
217a0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
217b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
217c0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
217d0 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
217e0 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
217f0 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
21800 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
21810 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
21820 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
21830 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
21840 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
21850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
21860 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21870 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
21880 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
21890 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
218a0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
218b0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
218c0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
218d0 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
218e0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
218f0 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
21900 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
21910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21920 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
21930 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
21940 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
21950 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
21960 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
21970 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
21980 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
21990 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
219a0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
219b0 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
219c0 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
219d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
219e0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
219f0 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72   );.  VVA_ONLY(r
21a00 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65  c =) sqlite3Btre
21a10 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26  eKeySize(pCur, &
21a20 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73  nCellKey);.  ass
21a30 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21a40 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72  OK );    /* pCur
21a50 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
21a60 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e   so KeySize cann
21a70 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20  ot fail */.  /* 
21a80 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c  nCellKey will al
21a90 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e 20  ways be between 
21aa0 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66 66  0 and 0xffffffff
21ab0 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65 20   because of the 
21ac0 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74  way.  ** that bt
21ad0 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
21ae0 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74  ) and sqlite3Get
21af0 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20 69  Varint32() are i
21b00 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20  mplemented */.  
21b10 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20  if( nCellKey<=0 
21b20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66  || nCellKey>0x7f
21b30 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72  ffffff ){.    *r
21b40 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
21b50 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
21b60 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71  T_BKPT;.  }.  sq
21b70 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74  lite3VdbeMemInit
21b80 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72  (&m, db, 0);.  r
21b90 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
21ba0 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72  emFromBtree(pCur
21bb0 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
21bc0 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
21bd0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
21be0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65  rn rc;.  }.  *re
21bf0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
21c00 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
21c10 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
21c20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
21c30 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
21c40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21c50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
21c60 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
21c70 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
21c80 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
21c90 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
21ca0 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
21cb0 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
21cc0 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
21cd0 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
21ce0 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
21cf0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
21d00 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
21d10 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21d20 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
21d30 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
21d40 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
21d50 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
21d60 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
21d70 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
21d80 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
21d90 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
21da0 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
21db0 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
21dc0 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
21dd0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
21de0 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
21df0 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
21e00 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
21e10 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
21e20 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
21e30 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
21e40 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
21e50 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
21e60 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
21e70 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
21e80 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
21e90 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
21ea0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
21eb0 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
21ec0 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
21ed0 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
21ee0 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
21ef0 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
21f00 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
21f10 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
21f20 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
21f30 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
21f40 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
21f50 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
21f60 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
21f70 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
21f80 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
21f90 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
21fa0 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
21fb0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
21fc0 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
21fd0 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
21fe0 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
21ff0 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
22000 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
22010 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
22020 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
22030 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
22040 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
22050 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
22060 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
22070 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
22080 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
22090 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
220a0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
220b0 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
220c0 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
220d0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
220e0 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
220f0 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
22100 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
22110 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
22120 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
22130 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
22140 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
22150 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
22160 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
22170 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
22180 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
22190 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
221a0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
221b0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
221c0 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
221d0 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
221e0 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
221f0 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
22200 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
22210 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
22220 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20  BoundValue(Vdbe 
22230 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
22240 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
22250 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
22260 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
22270 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
22280 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
22290 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
222a0 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
222b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
222c0 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
222d0 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
222e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
222f0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
22300 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
22310 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
22320 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
22330 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
22340 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
22350 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
22360 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
22370 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
22380 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
22390 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
223a0 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
223b0 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
223c0 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
223d0 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
223e0 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
223f0 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
22400 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
22410 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
22420 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
22430 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
22440 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
22450 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
22460 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
22470 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
22480 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
22490 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
224a0 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
224b0 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
224c0 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
224d0 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
224e0 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
224f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22500 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
22510 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
22520 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
22530 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
22540 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
22550 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
22560 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
22570 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
22580 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
22590 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
225a0 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
225b0 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
225c0 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
225d0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
225e0 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
225f0 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
22600 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
22610 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
22620 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65   p->db;.  sqlite
22630 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
22640 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
22650 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
22660 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
22670 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b->zErrMsg);.  s
22680 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
22690 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
226a0 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
226b0 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
226c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
226d0 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.