/ Hex Artifact Content
Login

Artifact fcbca1519bdfe619edf2e95b64aad8e7b718494c:


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 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c40: 64 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f  dOp4(p, z==0 ? O
1c50: 50 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69  P_Null : OP_Stri
1c60: 6e 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b 2c  ng8, 0, iDest++,
1c70: 20 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d   0, z, 0);.    }
1c80: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1c90: 72 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20 20  rt( c=='i' );.  
1ca0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1cb0: 64 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65  ddOp2(p, OP_Inte
1cc0: 67 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20  ger, va_arg(ap, 
1cd0: 69 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b 0a  int), iDest++);.
1ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
1cf0: 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nd(ap);.}../*.**
1d00: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
1d10: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
1d20: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70   p4 value as a p
1d30: 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  ointer..*/.int s
1d40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1d50: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
1d60: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74          /* Add t
1d70: 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69  he opcode to thi
1d80: 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  s VM */.  int op
1d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1da0: 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20   The new opcode 
1db0: 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20  */.  int p1,    
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1dd0: 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P1 operand */.  
1de0: 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20  int p2,         
1df0: 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70      /* The P2 op
1e00: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
1e10: 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  3,             /
1e20: 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64  * The P3 operand
1e30: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e40: 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65   *zP4,    /* The
1e50: 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P4 operand */. 
1e60: 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20   int p4type     
1e70: 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61       /* P4 opera
1e80: 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20  nd type */.){.  
1e90: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
1ea0: 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20  e3VdbeAddOp3(p, 
1eb0: 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b  op, p1, p2, p3);
1ec0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  .  sqlite3VdbeCh
1ed0: 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20  angeP4(p, addr, 
1ee0: 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20  zP4, p4type);.  
1ef0: 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a  return addr;.}..
1f00: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63  /*.** Add an opc
1f10: 6f 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ode that include
1f20: 73 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 77  s the p4 value w
1f30: 69 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20 6f  ith a P4_INT64 o
1f40: 72 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79 70  r.** P4_REAL typ
1f50: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1f60: 33 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28  3VdbeAddOp4Dup8(
1f70: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1f80: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1f90: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1fa0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1fd0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1fe0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1ff0: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
2000: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
2010: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
2020: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
2030: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
2040: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
2050: 2a 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a  */.  const u8 *z
2060: 50 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  P4,      /* The 
2070: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
2080: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
2090: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
20a0: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63  d type */.){.  c
20b0: 68 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73 71  har *p4copy = sq
20c0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
20d0: 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 70  (sqlite3VdbeDb(p
20e0: 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63  ), 8);.  if( p4c
20f0: 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63  opy ) memcpy(p4c
2100: 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20  opy, zP4, 8);.  
2110: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
2120: 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20  beAddOp4(p, op, 
2130: 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f  p1, p2, p3, p4co
2140: 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a  py, p4type);.}..
2150: 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f  /*.** Add an OP_
2160: 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f  ParseSchema opco
2170: 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  de.  This routin
2180: 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20  e is broken out 
2190: 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56  from.** sqlite3V
21a0: 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63  dbeAddOp4() sinc
21b0: 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c  e it needs to al
21c0: 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b  so needs to mark
21d0: 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61   all btrees.** a
21e0: 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73  s having been us
21f0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57  ed..**.** The zW
2200: 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74  here string must
2210: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2220: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2230: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68  _malloc()..** Th
2240: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2250: 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f  take ownership o
2260: 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20  f the allocated 
2270: 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20  memory..*/.void 
2280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50 61  sqlite3VdbeAddPa
2290: 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65  rseSchemaOp(Vdbe
22a0: 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68   *p, int iDb, ch
22b0: 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69  ar *zWhere){.  i
22c0: 6e 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56  nt j;.  sqlite3V
22d0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f  dbeAddOp4(p, OP_
22e0: 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62  ParseSchema, iDb
22f0: 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20  , 0, 0, zWhere, 
2300: 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66  P4_DYNAMIC);.  f
2310: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d  or(j=0; j<p->db-
2320: 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74  >nDb; j++) sqlit
2330: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
2340: 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p, j);.}../*.** 
2350: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
2360: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
2370: 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69  p4 value as an i
2380: 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73  nteger..*/.int s
2390: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
23a0: 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  Int(.  Vdbe *p, 
23b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
23c0: 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20  d the opcode to 
23d0: 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74  this VM */.  int
23e0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
23f0: 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f   /* The new opco
2400: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20  de */.  int p1, 
2410: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2420: 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f  he P1 operand */
2430: 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20  .  int p2,      
2440: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32         /* The P2
2450: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
2460: 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20 20  t p3,           
2470: 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72    /* The P3 oper
2480: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20  and */.  int p4 
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a0: 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61  The P4 operand a
24b0: 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a  s an integer */.
24c0: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20  ){.  int addr = 
24d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
24e0: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c  3(p, op, p1, p2,
24f0: 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56   p3);.  sqlite3V
2500: 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61  dbeChangeP4(p, a
2510: 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f  ddr, SQLITE_INT_
2520: 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49  TO_PTR(p4), P4_I
2530: 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20  NT32);.  return 
2540: 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  addr;.}../*.** C
2550: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
2560: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
2570: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
2580: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
2590: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
25a0: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
25b0: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
25c0: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
25d0: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
25e0: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
25f0: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2600: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
2610: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
2620: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
2630: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
2640: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
2650: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
2660: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2670: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
2680: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
2690: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
26a0: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
26b0: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
26c0: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
26d0: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
26e0: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
26f0: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2700: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
2710: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
2720: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
2730: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
2740: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
2750: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
2760: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2770: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
2780: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
2790: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
27a0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
27b0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
27c0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
27d0: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
27e0: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
27f0: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2800: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
2810: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
2820: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
2830: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
2840: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
2850: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
2860: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2870: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
2880: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
28c0: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
28d0: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
28e0: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
28f0: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2900: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41  ;.  }.  return A
2910: 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  DDR(i);.}../*.**
2920: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
2930: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
2940: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2950: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
2960: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
2970: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
2980: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
2990: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
29a0: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
29b0: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
29c0: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
29d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
29e0: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
29f0: 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61  *v, int x){.  Pa
2a00: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
2a10: 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44  se;.  int j = AD
2a20: 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28  DR(x);.  assert(
2a30: 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   v->magic==VDBE_
2a40: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2a50: 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61  assert( j<p->nLa
2a60: 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  bel );.  assert(
2a70: 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   j>=0 );.  if( p
2a80: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2a90: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2aa0: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e  ->nOp;.  }.  p->
2ab0: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
2ac0: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
2ad0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
2ae0: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
2af0: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
2b00: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2b10: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2b20: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
2b30: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2b40: 31 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  1;.}..#ifdef SQL
2b50: 49 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c  ITE_DEBUG /* sql
2b60: 69 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f  ite3AssertMayAbo
2b70: 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f  rt() logic */../
2b80: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
2b90: 6e 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63  ng type and func
2ba0: 74 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f  tion are used to
2bb0: 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68   iterate through
2bc0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20   all opcodes.** 
2bd0: 69 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70  in a Vdbe main p
2be0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20  rogram and each 
2bf0: 6f 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72  of the sub-progr
2c00: 61 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69  ams (triggers) i
2c10: 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65  t may .** invoke
2c20: 20 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64   directly or ind
2c30: 69 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75  irectly. It shou
2c40: 6c 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f  ld be used as fo
2c50: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f  llows:.**.**   O
2c60: 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62  p *pOp;.**   Vdb
2c70: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a  eOpIter sIter;.*
2c80: 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73  *.**   memset(&s
2c90: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
2ca0: 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49  sIter));.**   sI
2cb0: 74 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20  ter.v = v;      
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66        // v is of
2ce0: 20 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20   type Vdbe* .** 
2cf0: 20 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20    while( (pOp = 
2d00: 6f 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65  opIterNext(&sIte
2d10: 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f  r)) ){.**     //
2d20: 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69   Do something wi
2d30: 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a  th pOp.**   }.**
2d40: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
2d50: 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70  (v->db, sIter.ap
2d60: 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70  Sub);.** .*/.typ
2d70: 65 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65  edef struct Vdbe
2d80: 4f 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65  OpIter VdbeOpIte
2d90: 72 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70  r;.struct VdbeOp
2da0: 49 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76  Iter {.  Vdbe *v
2db0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2dc0: 20 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69      /* Vdbe to i
2dd0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74  terate through t
2de0: 68 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f  he opcodes of */
2df0: 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a  .  SubProgram **
2e00: 61 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a  apSub;        /*
2e10: 20 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   Array of subpro
2e20: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
2e30: 53 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sub;            
2e40: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2e50: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70  of entries in ap
2e60: 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64  Sub */.  int iAd
2e70: 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dr;             
2e80: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
2e90: 66 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  f next instructi
2ea0: 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a  on to return */.
2eb0: 20 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20    int iSub;     
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed0: 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  0 = main program
2ee0: 2c 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d  , 1 = first sub-
2ef0: 70 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a  program etc. */.
2f00: 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70  };.static Op *op
2f10: 49 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49  IterNext(VdbeOpI
2f20: 74 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20  ter *p){.  Vdbe 
2f30: 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20  *v = p->v;.  Op 
2f40: 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20  *pRet = 0;.  Op 
2f50: 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b  *aOp;.  int nOp;
2f60: 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c  ..  if( p->iSub<
2f70: 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20  =p->nSub ){..   
2f80: 20 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20   if( p->iSub==0 
2f90: 29 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76  ){.      aOp = v
2fa0: 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70  ->aOp;.      nOp
2fb0: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d   = v->nOp;.    }
2fc0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20  else{.      aOp 
2fd0: 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53  = p->apSub[p->iS
2fe0: 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20  ub-1]->aOp;.    
2ff0: 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62    nOp = p->apSub
3000: 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70  [p->iSub-1]->nOp
3010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3020: 72 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70  rt( p->iAddr<nOp
3030: 20 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20   );..    pRet = 
3040: 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a  &aOp[p->iAddr];.
3050: 20 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a      p->iAddr++;.
3060: 20 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72      if( p->iAddr
3070: 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70  ==nOp ){.      p
3080: 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20  ->iSub++;.      
3090: 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20  p->iAddr = 0;.  
30a0: 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70    }.  .    if( p
30b0: 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f  Ret->p4type==P4_
30c0: 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20  SUBPROGRAM ){.  
30d0: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
30e0: 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65  (p->nSub+1)*size
30f0: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
3100: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
3110: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
3120: 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20  ->nSub; j++){.  
3130: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53        if( p->apS
3140: 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e  ub[j]==pRet->p4.
3150: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
3160: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3170: 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29  if( j==p->nSub )
3180: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53  {.        p->apS
3190: 75 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65  ub = sqlite3DbRe
31a0: 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64  allocOrFree(v->d
31b0: 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79  b, p->apSub, nBy
31c0: 74 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  te);.        if(
31d0: 20 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20   !p->apSub ){.  
31e0: 20 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30          pRet = 0
31f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
3200: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70  .          p->ap
3210: 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d  Sub[p->nSub++] =
3220: 20 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72   pRet->p4.pProgr
3230: 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  am;.        }.  
3240: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
3250: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
3260: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69  }../*.** Check i
3270: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74  f the program st
3280: 6f 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61  ored in the VM a
3290: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
32a0: 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72  Parse may.** thr
32b0: 6f 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65  ow an ABORT exce
32c0: 70 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74  ption (causing t
32d0: 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75  he statement, bu
32e0: 74 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61  t not entire tra
32f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62  nsaction.** to b
3300: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20  e rolled back). 
3310: 54 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69  This condition i
3320: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61  s true if the ma
3330: 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e  in program or an
3340: 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d  y.** sub-program
3350: 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f  s contains any o
3360: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
3370: 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48  .**.**   *  OP_H
3380: 61 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49  alt with P1=SQLI
3390: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
33a0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
33b0: 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66  *   *  OP_HaltIf
33c0: 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c  Null with P1=SQL
33d0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61  ITE_CONSTRAINT a
33e0: 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a  nd P2=OE_Abort..
33f0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72  **   *  OP_Destr
3400: 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55  oy.**   *  OP_VU
3410: 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50  pdate.**   *  OP
3420: 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20  _VRename.**   * 
3430: 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69   OP_FkCounter wi
3440: 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69  th P2==0 (immedi
3450: 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
3460: 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20  constraint).**  
3470: 20 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62   *  OP_CreateTab
3480: 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f  le and OP_InitCo
3490: 72 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45  routine (for CRE
34a0: 41 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c  ATE TABLE AS SEL
34b0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
34c0: 68 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74  hen check that t
34d0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73  he value of Pars
34e0: 65 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72  e.mayAbort is tr
34f0: 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52  ue if an.** ABOR
3500: 54 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c  T may be thrown,
3510: 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77   or false otherw
3520: 69 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ise. Return true
3530: 20 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d   if it does.** m
3540: 61 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f  atch, or false o
3550: 74 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66  therwise. This f
3560: 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e  unction is inten
3570: 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61  ded to be used a
3580: 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20  s.** part of an 
3590: 61 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74  assert statement
35a0: 20 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72   in the compiler
35b0: 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a  . Similar to:.**
35c0: 0a 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71  .**   assert( sq
35d0: 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d  lite3VdbeAssertM
35e0: 61 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e  ayAbort(pParse->
35f0: 70 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d  pVdbe, pParse->m
3600: 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69  ayAbort) );.*/.i
3610: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73  nt sqlite3VdbeAs
3620: 73 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62  sertMayAbort(Vdb
3630: 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f  e *v, int mayAbo
3640: 72 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62  rt){.  int hasAb
3650: 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68  ort = 0;.  int h
3660: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b  asFkCounter = 0;
3670: 0a 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65  .  int hasCreate
3680: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74  Table = 0;.  int
3690: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
36a0: 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70  e = 0;.  Op *pOp
36b0: 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73  ;.  VdbeOpIter s
36c0: 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26  Iter;.  memset(&
36d0: 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66  sIter, 0, sizeof
36e0: 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65  (sIter));.  sIte
36f0: 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c  r.v = v;..  whil
3700: 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72  e( (pOp = opIter
3710: 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30  Next(&sIter))!=0
3720: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f   ){.    int opco
3730: 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  de = pOp->opcode
3740: 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65  ;.    if( opcode
3750: 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20  ==OP_Destroy || 
3760: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61  opcode==OP_VUpda
3770: 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  te || opcode==OP
3780: 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c  _VRename .     |
3790: 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48  | ((opcode==OP_H
37a0: 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  alt || opcode==O
37b0: 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20  P_HaltIfNull) . 
37c0: 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70       && ((pOp->p
37d0: 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f  1&0xff)==SQLITE_
37e0: 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f  CONSTRAINT && pO
37f0: 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29  p->p2==OE_Abort)
3800: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68  ).    ){.      h
3810: 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20  asAbort = 1;.   
3820: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3830: 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d      if( opcode==
3840: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29  OP_CreateTable )
3850: 20 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20   hasCreateTable 
3860: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  = 1;.    if( opc
3870: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f  ode==OP_InitCoro
3880: 75 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43  utine ) hasInitC
3890: 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69  oroutine = 1;.#i
38a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
38b0: 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20  T_FOREIGN_KEY.  
38c0: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
38d0: 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f  _FkCounter && pO
38e0: 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d  p->p1==0 && pOp-
38f0: 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  >p2==1 ){.      
3900: 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31  hasFkCounter = 1
3910: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
3920: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
3930: 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e  ee(v->db, sIter.
3940: 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65  apSub);..  /* Re
3950: 74 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73  turn true if has
3960: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e  Abort==mayAbort.
3970: 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20   Or if a malloc 
3980: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
3990: 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63  ..  ** If malloc
39a0: 20 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68   failed, then th
39b0: 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61  e while() loop a
39c0: 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  bove may not hav
39d0: 65 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20  e iterated.  ** 
39e0: 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f  through all opco
39f0: 64 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74  des and hasAbort
3a00: 20 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f   may be set inco
3a10: 72 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a  rrectly. Return.
3a20: 20 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68    ** true for th
3a30: 69 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65  is case to preve
3a40: 6e 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20  nt the assert() 
3a50: 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66  in the callers f
3a60: 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66  rame.  ** from f
3a70: 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65  ailing.  */.  re
3a80: 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61  turn ( v->db->ma
3a90: 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61  llocFailed || ha
3aa0: 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74  sAbort==mayAbort
3ab0: 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72   || hasFkCounter
3ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  .              |
3ad0: 7c 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c  | (hasCreateTabl
3ae0: 65 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f  e && hasInitCoro
3af0: 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64  utine) );.}.#end
3b00: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42  if /* SQLITE_DEB
3b10: 55 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33  UG - the sqlite3
3b20: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
3b30: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a   function */../*
3b40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3b50: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
3b60: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76   all opcodes hav
3b70: 65 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e  e been inserted.
3b80: 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68    It loops.** th
3b90: 72 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70  rough all the op
3ba0: 63 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20  codes and fixes 
3bb0: 75 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e  up some details.
3bc0: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65  .**.** (1) For e
3bd0: 61 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63  ach jump instruc
3be0: 74 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61  tion with a nega
3bf0: 74 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61  tive P2 value (a
3c00: 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72   label).**     r
3c10: 65 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61  esolve the P2 va
3c20: 6c 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c  lue to an actual
3c30: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
3c40: 28 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20  (2) Compute the 
3c50: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
3c60: 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64  f arguments used
3c70: 20 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63   by any SQL func
3c80: 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20  tion.**     and 
3c90: 73 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65  store that value
3ca0: 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67   in *pMaxFuncArg
3cb0: 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64  s..**.** (3) Upd
3cc0: 61 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61  ate the Vdbe.rea
3cd0: 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62  dOnly and Vdbe.b
3ce0: 49 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74  IsReader flags t
3cf0: 6f 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20  o accurately.** 
3d00: 20 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61      indicate wha
3d10: 74 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  t the prepared s
3d20: 74 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c  tatement actuall
3d30: 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34  y does..**.** (4
3d40: 29 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  ) Initialize the
3d50: 20 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69   p4.xAdvance poi
3d60: 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20  nter on opcodes 
3d70: 74 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a  that use it..**.
3d80: 2a 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74  ** (5) Reclaim t
3d90: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
3da0: 74 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20  ted for storing 
3db0: 6c 61 62 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69  labels..*/.stati
3dc0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
3dd0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
3de0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
3df0: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3e00: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3e10: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3e20: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3e30: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3e40: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3e50: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3e60: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3e70: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
3e80: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
3e90: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
3ea0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
3eb0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
3ec0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
3ed0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
3ee0: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
3ef0: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3f00: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3f10: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3f20: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3f30: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3f40: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3f50: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3f60: 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f  se OP_Transactio
3f70: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  n: {.        if(
3f80: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d   pOp->p2!=0 ) p-
3f90: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
3fa0: 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74         /* fall t
3fb0: 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  hru */.      }. 
3fc0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74       case OP_Aut
3fd0: 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 63  oCommit:.      c
3fe0: 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74  ase OP_Savepoint
3ff0: 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 62  : {.        p->b
4000: 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20  IsReader = 1;.  
4010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4020: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4030: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20  ITE_OMIT_WAL.   
4040: 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b     case OP_Check
4050: 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20  point:.#endif.  
4060: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75      case OP_Vacu
4070: 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  um:.      case O
4080: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
4090: 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64  .        p->read
40a0: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
40b0: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
40c0: 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   1;.        brea
40d0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  k;.      }.#ifnd
40e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
40f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
4100: 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74    case OP_VUpdat
4110: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e: {.        if(
4120: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
4130: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
4140: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20  Op->p2;.        
4150: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4160: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69       case OP_VFi
4170: 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  lter: {.        
4180: 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 61  int n;.        a
4190: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d 20  ssert( p->nOp - 
41a0: 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20  i >= 3 );.      
41b0: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
41c0: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74  ].opcode==OP_Int
41d0: 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  eger );.        
41e0: 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a  n = pOp[-1].p1;.
41f0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d          if( n>nM
4200: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
4210: 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 62  s = n;.        b
4220: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65  reak;.      }.#e
4230: 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65 20  ndif.      case 
4240: 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20 63  OP_Next:.      c
4250: 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65  ase OP_NextIfOpe
4260: 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50  n:.      case OP
4270: 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20  _SorterNext: {. 
4280: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
4290: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
42a0: 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20  3BtreeNext;.    
42b0: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
42c0: 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20  = P4_ADVANCE;.  
42d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42e0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
42f0: 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20 63  OP_Prev:.      c
4300: 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70 65  ase OP_PrevIfOpe
4310: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f 70  n: {.        pOp
4320: 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d 20  ->p4.xAdvance = 
4330: 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76  sqlite3BtreePrev
4340: 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70 4f  ious;.        pO
4350: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41  p->p4type = P4_A
4360: 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20  DVANCE;.        
4370: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4380: 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e 6f     }..    pOp->o
4390: 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  pflags = sqlite3
43a0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 6f  OpcodeProperty[o
43b0: 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28 20  pcode];.    if( 
43c0: 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26 20  (pOp->opflags & 
43d0: 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26  OPFLG_JUMP)!=0 &
43e0: 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a 20  & pOp->p2<0 ){. 
43f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 41 44 44       assert( ADD
4400: 52 28 70 4f 70 2d 3e 70 32 29 3c 70 50 61 72 73  R(pOp->p2)<pPars
4410: 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20  e->nLabel );.   
4420: 20 20 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61     pOp->p2 = aLa
4430: 62 65 6c 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32  bel[ADDR(pOp->p2
4440: 29 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  )];.    }.  }.  
4450: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d  sqlite3DbFree(p-
4460: 3e 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61  >db, pParse->aLa
4470: 62 65 6c 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e  bel);.  pParse->
4480: 61 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50  aLabel = 0;.  pP
4490: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30  arse->nLabel = 0
44a0: 3b 0a 20 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  ;.  *pMaxFuncArg
44b0: 73 20 3d 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20  s = nMaxArgs;.  
44c0: 61 73 73 65 72 74 28 20 70 2d 3e 62 49 73 52 65  assert( p->bIsRe
44d0: 61 64 65 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73  ader!=0 || DbMas
44e0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65  kAllZero(p->btre
44f0: 65 4d 61 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a  eMask) );.}../*.
4500: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
4510: 64 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78  dress of the nex
4520: 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f  t instruction to
4530: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   be inserted..*/
4540: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
4550: 43 75 72 72 65 6e 74 41 64 64 72 28 56 64 62 65  CurrentAddr(Vdbe
4560: 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
4570: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4580: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72  AGIC_INIT );.  r
4590: 65 74 75 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a  eturn p->nOp;.}.
45a0: 0a 2f 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68  ./*.** Verify th
45b0: 61 74 20 61 74 20 6c 65 61 73 74 20 4e 20 6f 70  at at least N op
45c0: 63 6f 64 65 20 73 6c 6f 74 73 20 61 72 65 20 61  code slots are a
45d0: 76 61 69 6c 61 62 6c 65 20 69 6e 20 70 20 77 69  vailable in p wi
45e0: 74 68 6f 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20  thout.** having 
45f0: 74 6f 20 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f  to malloc for mo
4600: 72 65 20 73 70 61 63 65 20 28 65 78 63 65 70 74  re space (except
4610: 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75   when compiled u
4620: 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54  sing.** SQLITE_T
4630: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
4640: 53 53 29 2e 20 20 54 68 69 73 20 69 6e 74 65 72  SS).  This inter
4650: 66 61 63 65 20 69 73 20 75 73 65 64 20 64 75 72  face is used dur
4660: 69 6e 67 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74  ing testing.** t
4670: 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 63 65  o verify that ce
4680: 72 74 61 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73  rtain calls to s
4690: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
46a0: 69 73 74 28 29 20 63 61 6e 20 6e 65 76 65 72 0a  ist() can never.
46b0: 2a 2a 20 66 61 69 6c 20 64 75 65 20 74 6f 20 61  ** fail due to a
46c0: 20 4f 4f 4d 20 66 61 75 6c 74 20 61 6e 64 20 68   OOM fault and h
46d0: 65 6e 63 65 20 74 68 61 74 20 74 68 65 20 72 65  ence that the re
46e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a  turn value from.
46f0: 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  ** sqlite3VdbeAd
4700: 64 4f 70 4c 69 73 74 28 29 20 77 69 6c 6c 20 61  dOpList() will a
4710: 6c 77 61 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c  lways be non-NUL
4720: 4c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  L..*/.#if define
4730: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
4740: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
4750: 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f  TE_TEST_REALLOC_
4760: 53 54 52 45 53 53 29 0a 76 6f 69 64 20 73 71 6c  STRESS).void sql
4770: 69 74 65 33 56 64 62 65 56 65 72 69 66 79 4e 6f  ite3VdbeVerifyNo
4780: 4d 61 6c 6c 6f 63 52 65 71 75 69 72 65 64 28 56  MallocRequired(V
4790: 64 62 65 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a  dbe *p, int N){.
47a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
47b0: 20 2b 20 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73   + N <= p->pPars
47c0: 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d  e->nOpAlloc );.}
47d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
47e0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
47f0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
4800: 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6f  o the array of o
4810: 70 63 6f 64 65 73 20 61 73 73 6f 63 69 61 74 65  pcodes associate
4820: 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 56 64  d with.** the Vd
4830: 62 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  be passed as the
4840: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
4850: 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
4860: 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
4870: 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e 67 65 20  y.** to arrange 
4880: 66 6f 72 20 74 68 65 20 72 65 74 75 72 6e 65 64  for the returned
4890: 20 61 72 72 61 79 20 74 6f 20 62 65 20 65 76 65   array to be eve
48a0: 6e 74 75 61 6c 6c 79 20 66 72 65 65 64 20 75 73  ntually freed us
48b0: 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76 64 62 65  ing the .** vdbe
48c0: 46 72 65 65 4f 70 41 72 72 61 79 28 29 20 66 75  FreeOpArray() fu
48d0: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65  nction..**.** Be
48e0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2c 20  fore returning, 
48f0: 2a 70 6e 4f 70 20 69 73 20 73 65 74 20 74 6f 20  *pnOp is set to 
4900: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e  the number of en
4910: 74 72 69 65 73 20 69 6e 20 74 68 65 20 72 65 74  tries in the ret
4920: 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20  urned.** array. 
4930: 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20  Also, *pnMaxArg 
4940: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6c 61  is set to the la
4950: 72 67 65 72 20 6f 66 20 69 74 73 20 63 75 72 72  rger of its curr
4960: 65 6e 74 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a  ent value and .*
4970: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
4980: 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 56  entries in the V
4990: 64 62 65 2e 61 70 41 72 67 5b 5d 20 61 72 72 61  dbe.apArg[] arra
49a0: 79 20 72 65 71 75 69 72 65 64 20 74 6f 20 65 78  y required to ex
49b0: 65 63 75 74 65 20 74 68 65 20 0a 2a 2a 20 72 65  ecute the .** re
49c0: 74 75 72 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a  turned program..
49d0: 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74  */.VdbeOp *sqlit
49e0: 65 33 56 64 62 65 54 61 6b 65 4f 70 41 72 72 61  e3VdbeTakeOpArra
49f0: 79 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a  y(Vdbe *p, int *
4a00: 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78  pnOp, int *pnMax
4a10: 41 72 67 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  Arg){.  VdbeOp *
4a20: 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20  aOp = p->aOp;.  
4a30: 61 73 73 65 72 74 28 20 61 4f 70 20 26 26 20 21  assert( aOp && !
4a40: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
4a50: 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  led );..  /* Che
4a60: 63 6b 20 74 68 61 74 20 73 71 6c 69 74 65 33 56  ck that sqlite3V
4a70: 64 62 65 55 73 65 73 42 74 72 65 65 28 29 20 77  dbeUsesBtree() w
4a80: 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e  as not called on
4a90: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73   this VM */.  as
4aa0: 73 65 72 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a  sert( DbMaskAllZ
4ab0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
4ac0: 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50  ) );..  resolveP
4ad0: 32 56 61 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78  2Values(p, pnMax
4ae0: 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20  Arg);.  *pnOp = 
4af0: 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70  p->nOp;.  p->aOp
4b00: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 61   = 0;.  return a
4b10: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  Op;.}../*.** Add
4b20: 20 61 20 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66   a whole list of
4b30: 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 6f 20 74   operations to t
4b40: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 73 74 61  he operation sta
4b50: 63 6b 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a  ck.  Return a.**
4b60: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
4b70: 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20  first operation 
4b80: 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62  inserted..*/.Vdb
4b90: 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65  eOp *sqlite3Vdbe
4ba0: 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64 62  AddOpList(.  Vdb
4bb0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
4bc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4bd0: 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65 20   opcodes to the 
4be0: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
4bf0: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c  nt */.  int nOp,
4c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c10: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4c20: 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64 64  f opcodes to add
4c30: 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73 74   */.  VdbeOpList
4c40: 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20   const *aOp,    
4c50: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
4c60: 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a 2f  s to be added */
4c70: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20  .  int iLineno  
4c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c90: 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c  /* Source-file l
4ca0: 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  ine number of fi
4cb0: 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b  rst opcode */.){
4cc0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65  .  int i;.  Vdbe
4cd0: 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73  Op *pOut, *pFirs
4ce0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f 70  t;.  assert( nOp
4cf0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
4d00: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
4d10: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
4d20: 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20  f( p->nOp + nOp 
4d30: 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70  > p->pParse->nOp
4d40: 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41  Alloc && growOpA
4d50: 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a  rray(p, nOp) ){.
4d60: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
4d70: 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f 75  }.  pFirst = pOu
4d80: 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  t = &p->aOp[p->n
4d90: 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  Op];.  for(i=0; 
4da0: 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b  i<nOp; i++, aOp+
4db0: 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20  +, pOut++){.    
4dc0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61  pOut->opcode = a
4dd0: 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  Op->opcode;.    
4de0: 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e  pOut->p1 = aOp->
4df0: 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32  p1;.    pOut->p2
4e00: 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20   = aOp->p2;.    
4e10: 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e  assert( aOp->p2>
4e20: 3d 30 20 29 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  =0 );.    pOut->
4e30: 70 33 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20  p3 = aOp->p3;.  
4e40: 20 20 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d    pOut->p4type =
4e50: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20   P4_NOTUSED;.   
4e60: 20 70 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b   pOut->p4.p = 0;
4e70: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20  .    pOut->p5 = 
4e80: 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
4e90: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
4ea0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75  COMMENTS.    pOu
4eb0: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4ec0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4ed0: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4ee0: 41 47 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53  AGE.    pOut->iS
4ef0: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f  rcLine = iLineno
4f00: 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76  +i;.#else.    (v
4f10: 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e  oid)iLineno;.#en
4f20: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
4f30: 45 5f 44 45 42 55 47 0a 20 20 20 20 69 66 28 20  E_DEBUG.    if( 
4f40: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4f50: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
4f60: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71  race ){.      sq
4f70: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
4f80: 28 30 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70  (0, i+p->nOp, &p
4f90: 2d 3e 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29  ->aOp[i+p->nOp])
4fa0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
4fb0: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e   }.  p->nOp += n
4fc0: 4f 70 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69  Op;.  return pFi
4fd0: 72 73 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  rst;.}..#if defi
4fe0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
4ff0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
5000: 53 29 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20  S)./*.** Add an 
5010: 65 6e 74 72 79 20 74 6f 20 74 68 65 20 61 72 72  entry to the arr
5020: 61 79 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d  ay of counters m
5030: 61 6e 61 67 65 64 20 62 79 20 73 71 6c 69 74 65  anaged by sqlite
5040: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
5050: 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  s()..*/.void sql
5060: 69 74 65 33 56 64 62 65 53 63 61 6e 53 74 61 74  ite3VdbeScanStat
5070: 75 73 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20  us(.  Vdbe *p,  
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61        /* VM to a
50a0: 64 64 20 73 63 61 6e 73 74 61 74 75 73 28 29 20  dd scanstatus() 
50b0: 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72  to */.  int addr
50c0: 45 78 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20  Explain,        
50d0: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
50e0: 73 73 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e  ss of OP_Explain
50f0: 20 28 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74   (or 0) */.  int
5100: 20 61 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20   addrLoop,      
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5120: 41 64 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20  Address of loop 
5130: 63 6f 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e  counter */ .  in
5140: 74 20 61 64 64 72 56 69 73 69 74 2c 20 20 20 20  t addrVisit,    
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5160: 20 41 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73   Address of rows
5170: 20 76 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72   visited counter
5180: 20 2a 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73   */.  LogEst nEs
5190: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
51a0: 20 20 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74        /* Estimat
51b0: 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74  ed number of out
51c0: 70 75 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f  put rows */.  co
51d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
51f0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f   Name of table o
5200: 72 20 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63  r index being sc
5210: 61 6e 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e  anned */.){.  in
5220: 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53  t nByte = (p->nS
5230: 63 61 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28  can+1) * sizeof(
5240: 53 63 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53  ScanStatus);.  S
5250: 63 61 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b  canStatus *aNew;
5260: 0a 20 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53  .  aNew = (ScanS
5270: 74 61 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62  tatus*)sqlite3Db
5280: 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70  Realloc(p->db, p
5290: 2d 3e 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b  ->aScan, nByte);
52a0: 0a 20 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20  .  if( aNew ){. 
52b0: 20 20 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70     ScanStatus *p
52c0: 4e 65 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e  New = &aNew[p->n
52d0: 53 63 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65  Scan++];.    pNe
52e0: 77 2d 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d  w->addrExplain =
52f0: 20 61 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20   addrExplain;.  
5300: 20 20 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70    pNew->addrLoop
5310: 20 3d 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20   = addrLoop;.   
5320: 20 70 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74   pNew->addrVisit
5330: 20 3d 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20   = addrVisit;.  
5340: 20 20 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e    pNew->nEst = n
5350: 45 73 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a  Est;.    pNew->z
5360: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Name = sqlite3Db
5370: 53 74 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e  StrDup(p->db, zN
5380: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63  ame);.    p->aSc
5390: 61 6e 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d  an = aNew;.  }.}
53a0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
53b0: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
53c0: 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20   of the opcode, 
53d0: 6f 72 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f  or P1, P2, P3, o
53e0: 72 20 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a  r P5 operands.**
53f0: 20 66 6f 72 20 61 20 73 70 65 63 69 66 69 63 20   for a specific 
5400: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a  instruction..*/.
5410: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
5420: 43 68 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62  ChangeOpcode(Vdb
5430: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
5440: 75 38 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a  u8 iNewOpcode){.
5450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5460: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f  Op(p,addr)->opco
5470: 64 65 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b  de = iNewOpcode;
5480: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  .}.void sqlite3V
5490: 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62 65  dbeChangeP1(Vdbe
54a0: 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69   *p, u32 addr, i
54b0: 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74  nt val){.  sqlit
54c0: 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64  e3VdbeGetOp(p,ad
54d0: 64 72 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d  dr)->p1 = val;.}
54e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
54f0: 65 43 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a  eChangeP2(Vdbe *
5500: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5510: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5520: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5530: 29 2d 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p2 = val;.}.v
5540: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5550: 68 61 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c  hangeP3(Vdbe *p,
5560: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5570: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5580: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
5590: 3e 70 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p3 = val;.}.voi
55a0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
55b0: 6e 67 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75  ngeP5(Vdbe *p, u
55c0: 38 20 70 35 29 7b 0a 20 20 69 66 28 20 21 70 2d  8 p5){.  if( !p-
55d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
55e0: 64 20 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f  d ) p->aOp[p->nO
55f0: 70 2d 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a  p-1].p5 = p5;.}.
5600: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5610: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
5620: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
5630: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
5640: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
5650: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
5660: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
5670: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
5680: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
5690: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
56a0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 70 2d 3e 70  nt addr){.  p->p
56b0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 20  Parse->iFixedOp 
56c0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
56d0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
56e0: 65 50 32 28 70 2c 20 61 64 64 72 2c 20 70 2d 3e  eP2(p, addr, p->
56f0: 6e 4f 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  nOp);.}.../*.** 
5700: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
5710: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
5720: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
5730: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
5740: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
5750: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
5760: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
5770: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
5780: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
5790: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
57a0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
57b0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
57c0: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
57d0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
57e0: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
57f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
5800: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
5810: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
5820: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
5830: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
5840: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
5850: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
5860: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
5870: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5880: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
5890: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
58a0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
58b0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
58c0: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
58d0: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
58e0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 46 55        case P4_FU
58f0: 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 20  NCCTX: {.       
5900: 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75   freeEphemeralFu
5910: 6e 63 74 69 6f 6e 28 64 62 2c 20 28 28 73 71 6c  nction(db, ((sql
5920: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
5930: 29 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 20 20 20  )->pFunc);.     
5940: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
5950: 67 68 20 69 6e 74 6f 20 74 68 65 20 6e 65 78 74  gh into the next
5960: 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 7d   case */.      }
5970: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52  .      case P4_R
5980: 45 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20  EAL:.      case 
5990: 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20  P4_INT64:.      
59a0: 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a  case P4_DYNAMIC:
59b0: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49  .      case P4_I
59c0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
59d0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
59e0: 28 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20  (db, p4);.      
59f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5a00: 0a 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b  .      case P4_K
5a10: 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20  EYINFO: {.      
5a20: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
5a30: 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69  sFreed==0 ) sqli
5a40: 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28  te3KeyInfoUnref(
5a50: 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20  (KeyInfo*)p4);. 
5a60: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5a70: 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
5a80: 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f  ITE_ENABLE_CURSO
5a90: 52 5f 48 49 4e 54 53 0a 20 20 20 20 20 20 63 61  R_HINTS.      ca
5aa0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
5ab0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5ac0: 72 44 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70  rDelete(db, (Exp
5ad0: 72 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  r*)p4);.        
5ae0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
5af0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
5b00: 20 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20   P4_MPRINTF: {. 
5b10: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5b20: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5b30: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34   sqlite3_free(p4
5b40: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
5b50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5b60: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
5b70: 20 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45   {.        freeE
5b80: 70 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e  phemeralFunction
5b90: 28 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70  (db, (FuncDef*)p
5ba0: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5bb0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5bc0: 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a   case P4_MEM: {.
5bd0: 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e          if( db->
5be0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
5bf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
5c00: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73  ite3ValueFree((s
5c10: 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34  qlite3_value*)p4
5c20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
5c30: 7b 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20  {.          Mem 
5c40: 2a 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20  *p = (Mem*)p4;. 
5c50: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
5c60: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
5c70: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
5c80: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
5c90: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
5ca0: 65 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20  e(db, p);.      
5cb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61    }.        brea
5cc0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
5cd0: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
5ce0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62  {.        if( db
5cf0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
5d00: 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55  0 ) sqlite3VtabU
5d10: 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29  nlock((VTable *)
5d20: 70 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  p4);.        bre
5d30: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
5d40: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  }.  }.}../*.** F
5d50: 72 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c  ree the space al
5d60: 6c 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20  located for aOp 
5d70: 61 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65  and any p4 value
5d80: 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  s allocated for 
5d90: 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63  the.** opcodes c
5da0: 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e  ontained within.
5db0: 20 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e   If aOp is not N
5dc0: 55 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ULL it is assume
5dd0: 64 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a  d to contain .**
5de0: 20 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a   nOp entries. .*
5df0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
5e00: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5e10: 6c 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61  lite3 *db, Op *a
5e20: 4f 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20  Op, int nOp){.  
5e30: 69 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f  if( aOp ){.    O
5e40: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28  p *pOp;.    for(
5e50: 70 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f  pOp=aOp; pOp<&aO
5e60: 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a  p[nOp]; pOp++){.
5e70: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
5e80: 34 74 79 70 65 20 29 20 66 72 65 65 50 34 28 64  4type ) freeP4(d
5e90: 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20  b, pOp->p4type, 
5ea0: 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64  pOp->p4.p);.#ifd
5eb0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5ec0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
5ed0: 53 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  S.      sqlite3D
5ee0: 62 46 72 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a  bFree(db, pOp->z
5ef0: 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66  Comment);.#endif
5f00: 20 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a       .    }.  }.
5f10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5f20: 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a  db, aOp);.}../*.
5f30: 2a 2a 20 4c 69 6e 6b 20 74 68 65 20 53 75 62 50  ** Link the SubP
5f40: 72 6f 67 72 61 6d 20 6f 62 6a 65 63 74 20 70 61  rogram object pa
5f50: 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
5f60: 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f  nd argument into
5f70: 20 74 68 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c   the linked.** l
5f80: 69 73 74 20 61 74 20 56 64 62 65 2e 70 53 75 62  ist at Vdbe.pSub
5f90: 50 72 6f 67 72 61 6d 2e 20 54 68 69 73 20 6c 69  Program. This li
5fa0: 73 74 20 69 73 20 75 73 65 64 20 74 6f 20 64 65  st is used to de
5fb0: 6c 65 74 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f  lete all sub-pro
5fc0: 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20  gram.** objects 
5fd0: 77 68 65 6e 20 74 68 65 20 56 4d 20 69 73 20 6e  when the VM is n
5fe0: 6f 20 6c 6f 6e 67 65 72 20 72 65 71 75 69 72 65  o longer require
5ff0: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
6000: 65 33 56 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f  e3VdbeLinkSubPro
6010: 67 72 61 6d 28 56 64 62 65 20 2a 70 56 64 62 65  gram(Vdbe *pVdbe
6020: 2c 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 29  , SubProgram *p)
6030: 7b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70  {.  p->pNext = p
6040: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a  Vdbe->pProgram;.
6050: 20 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72 61    pVdbe->pProgra
6060: 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  m = p;.}../*.** 
6070: 43 68 61 6e 67 65 20 74 68 65 20 6f 70 63 6f 64  Change the opcod
6080: 65 20 61 74 20 61 64 64 72 20 69 6e 74 6f 20 4f  e at addr into O
6090: 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e 74 20 73 71  P_Noop.*/.int sq
60a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
60b0: 6f 4e 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69  oNoop(Vdbe *p, i
60c0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 56 64 62 65  nt addr){.  Vdbe
60d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20 70  Op *pOp;.  if( p
60e0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
60f0: 65 64 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ed ) return 0;. 
6100: 20 61 73 73 65 72 74 28 20 61 64 64 72 3e 3d 30   assert( addr>=0
6110: 20 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20   && addr<p->nOp 
6120: 29 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  );.  pOp = &p->a
6130: 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 66 72 65 65  Op[addr];.  free
6140: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
6150: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
6160: 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c  );.  memset(pOp,
6170: 20 30 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30   0, sizeof(pOp[0
6180: 5d 29 29 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f  ]));.  pOp->opco
6190: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
61a0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
61b0: 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f  ** If the last o
61c0: 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e  pcode is "op" an
61d0: 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75  d it is not a ju
61e0: 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a  mp destination,.
61f0: 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69  ** then remove i
6200: 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20  t.  Return true 
6210: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61  if and only if a
6220: 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d  n opcode was rem
6230: 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
6240: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72  ite3VdbeDeletePr
6250: 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a  iorOpcode(Vdbe *
6260: 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28  p, u8 op){.  if(
6270: 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e   (p->nOp-1)>(p->
6280: 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70  pParse->iFixedOp
6290: 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  ) && p->aOp[p->n
62a0: 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70  Op-1].opcode==op
62b0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
62c0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
62d0: 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70  ToNoop(p, p->nOp
62e0: 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  -1);.  }else{.  
62f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
6300: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  }../*.** Change 
6310: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
6320: 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20   P4 operand for 
6330: 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72  a specific instr
6340: 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20  uction..** This 
6350: 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75  routine is usefu
6360: 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70  l when a large p
6370: 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64  rogram is loaded
6380: 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69   from a.** stati
6390: 63 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71  c array using sq
63a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69  lite3VdbeAddOpLi
63b0: 73 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74  st but we want t
63c0: 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20  o make a.** few 
63d0: 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f  minor changes to
63e0: 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a   the program..**
63f0: 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e  .** If n>=0 then
6400: 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   the P4 operand 
6410: 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e  is dynamic, mean
6420: 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20  ing that a copy 
6430: 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67  of.** the string
6440: 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65   is made into me
6450: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72  mory obtained fr
6460: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
6470: 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20  c()..** A value 
6480: 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f  of n==0 means co
6490: 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20  py bytes of zP4 
64a0: 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64  up to and includ
64b0: 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74  ing the.** first
64c0: 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20   null byte.  If 
64d0: 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b  n>0 then copy n+
64e0: 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a  1 bytes of zP4..
64f0: 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c  ** .** Other val
6500: 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41  ues of n (P4_STA
6510: 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20  TIC, P4_COLLSEQ 
6520: 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74  etc.) indicate t
6530: 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a  hat zP4 points.*
6540: 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72  * to a string or
6550: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
6560: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
6570: 20 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c   exist for the l
6580: 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  ifetime of.** th
6590: 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65  e Vdbe. In these
65a0: 20 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75   cases we can ju
65b0: 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e  st copy the poin
65c0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64  ter..**.** If ad
65d0: 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65  dr<0 then change
65e0: 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20   P4 on the most 
65f0: 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65  recently inserte
6600: 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  d instruction..*
6610: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51  /.static void SQ
6620: 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64  LITE_NOINLINE vd
6630: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a  beChangeP4Full(.
6640: 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20    Vdbe *p,.  Op 
6650: 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68  *pOp,.  const ch
6660: 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e  ar *zP4,.  int n
6670: 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70  .){.  if( pOp->p
6680: 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65  4type ){.    fre
6690: 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e  eP4(p->db, pOp->
66a0: 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e  p4type, pOp->p4.
66b0: 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  p);.    pOp->p4t
66c0: 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  ype = 0;.    pOp
66d0: 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a  ->p4.p = 0;.  }.
66e0: 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20    if( n<0 ){.   
66f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
6700: 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f  geP4(p, (int)(pO
6710: 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34  p - p->aOp), zP4
6720: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
6730: 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20     if( n==0 ) n 
6740: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
6750: 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  0(zP4);.    pOp-
6760: 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44  >p4.z = sqlite3D
6770: 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20  bStrNDup(p->db, 
6780: 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70  zP4, n);.    pOp
6790: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59  ->p4type = P4_DY
67a0: 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  NAMIC;.  }.}.voi
67b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
67c0: 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69  ngeP4(Vdbe *p, i
67d0: 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63  nt addr, const c
67e0: 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29  har *zP4, int n)
67f0: 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73  {.  Op *pOp;.  s
6800: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73  qlite3 *db;.  as
6810: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
6820: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
6830: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
6840: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
6850: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
6860: 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61  aOp!=0 || db->ma
6870: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
6880: 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
6890: 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20  iled ){.    if( 
68a0: 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65  n!=P4_VTAB ) fre
68b0: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
68c0: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
68d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
68e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
68f0: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
6900: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
6910: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
6920: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
6930: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
6940: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
6950: 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c  ];.  if( n>=0 ||
6960: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
6970: 20 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34      vdbeChangeP4
6980: 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34  Full(p, pOp, zP4
6990: 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , n);.    return
69a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50  ;.  }.  if( n==P
69b0: 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f  4_INT32 ){.    /
69c0: 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73  * Note: this cas
69d0: 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75  t is safe, becau
69e0: 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61  se the origin da
69f0: 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20  ta point was an 
6a00: 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  int.    ** that 
6a10: 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63  was cast to a (c
6a20: 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f  onst char *). */
6a30: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d  .    pOp->p4.i =
6a40: 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49   SQLITE_PTR_TO_I
6a50: 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70  NT(zP4);.    pOp
6a60: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e  ->p4type = P4_IN
6a70: 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  T32;.  }else if(
6a80: 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61   zP4!=0 ){.    a
6a90: 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20  ssert( n<0 );.  
6aa0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
6ab0: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
6ac0: 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67  p->p4type = (sig
6ad0: 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20  ned char)n;.    
6ae0: 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29  if( n==P4_VTAB )
6af0: 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b   sqlite3VtabLock
6b00: 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a  ((VTable*)zP4);.
6b10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74    }.}../*.** Set
6b20: 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d   the P4 on the m
6b30: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64  ost recently add
6b40: 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65  ed opcode to the
6b50: 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65   KeyInfo for the
6b60: 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e  .** index given.
6b70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6b80: 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f  VdbeSetP4KeyInfo
6b90: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
6ba0: 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20  Index *pIdx){.  
6bb0: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
6bc0: 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72  ->pVdbe;.  asser
6bd0: 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( v!=0 );.  ass
6be0: 65 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a  ert( pIdx!=0 );.
6bf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
6c00: 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68  ngeP4(v, -1, (ch
6c10: 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e  ar*)sqlite3KeyIn
6c20: 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65  foOfIndex(pParse
6c30: 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20  , pIdx),.       
6c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
6c50: 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23  4_KEYINFO);.}..#
6c60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6c70: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
6c80: 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ENTS./*.** Chang
6c90: 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e  e the comment on
6ca0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6cb0: 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63  ly coded instruc
6cc0: 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73  tion.  Or.** ins
6cd0: 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20  ert a No-op and 
6ce0: 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  add the comment 
6cf0: 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74  to that new inst
6d00: 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a  ruction.  This.*
6d10: 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65  * makes the code
6d20: 20 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20   easier to read 
6d30: 64 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67  during debugging
6d40: 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20  .  None of this 
6d50: 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20  happens.** in a 
6d60: 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64  production build
6d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6d80: 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64   vdbeVComment(Vd
6d90: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
6da0: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c  r *zFormat, va_l
6db0: 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72  ist ap){.  asser
6dc0: 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70  t( p->nOp>0 || p
6dd0: 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73  ->aOp==0 );.  as
6de0: 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20  sert( p->aOp==0 
6df0: 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  || p->aOp[p->nOp
6e00: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20  -1].zComment==0 
6e10: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
6e20: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
6e30: 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73  p->nOp ){.    as
6e40: 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a  sert( p->aOp );.
6e50: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
6e60: 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b  e(p->db, p->aOp[
6e70: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6e80: 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  nt);.    p->aOp[
6e90: 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65  p->nOp-1].zComme
6ea0: 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72  nt = sqlite3VMPr
6eb0: 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72  intf(p->db, zFor
6ec0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a  mat, ap);.  }.}.
6ed0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
6ee0: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
6ef0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
6f00: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
6f10: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
6f20: 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72  p ){.    va_star
6f30: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
6f40: 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74      vdbeVComment
6f50: 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  (p, zFormat, ap)
6f60: 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
6f70: 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c  ;.  }.}.void sql
6f80: 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d  ite3VdbeNoopComm
6f90: 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e  ent(Vdbe *p, con
6fa0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
6fb0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
6fc0: 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b  t ap;.  if( p ){
6fd0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
6fe0: 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f  AddOp0(p, OP_Noo
6ff0: 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74  p);.    va_start
7000: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
7010: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
7020: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
7030: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
7040: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f  .  }.}.#endif  /
7050: 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  * NDEBUG */..#if
7060: 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
7070: 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53  COVERAGE./*.** S
7080: 65 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20  et the value if 
7090: 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65  the iSrcLine fie
70a0: 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69  ld for the previ
70b0: 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74  ously coded inst
70c0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ruction..*/.void
70d0: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c   sqlite3VdbeSetL
70e0: 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a  ineNumber(Vdbe *
70f0: 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20  v, int iLine){. 
7100: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
7110: 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e  p(v,-1)->iSrcLin
7120: 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e  e = iLine;.}.#en
7130: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44  dif /* SQLITE_VD
7140: 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a  BE_COVERAGE */..
7150: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7160: 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69   opcode for a gi
7170: 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66  ven address.  If
7180: 20 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20   the address is 
7190: 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75  -1, then.** retu
71a0: 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
71b0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70  ntly inserted op
71c0: 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  code..**.** If a
71d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
71e0: 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  on error has occ
71f0: 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74  urred prior to t
7200: 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68  he calling of th
7210: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74  is.** routine, t
7220: 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  hen a pointer to
7230: 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20   a dummy VdbeOp 
7240: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
7250: 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a  .  That opcode.*
7260: 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75  * is readable bu
7270: 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20  t not writable, 
7280: 74 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73  though it is cas
7290: 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20  t to a writable 
72a0: 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65  value..** The re
72b0: 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20  turn of a dummy 
72c0: 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68  opcode allows th
72d0: 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e  e call to contin
72e0: 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a  ue functioning.*
72f0: 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66  * after an OOM f
7300: 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76  ault without hav
7310: 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20  ing to check to 
7320: 73 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72  see if the retur
7330: 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20  n from .** this 
7340: 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c  routine is a val
7350: 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74  id pointer.  But
7360: 20 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d   because the dum
7370: 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a  my.opcode is 0,.
7380: 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65  ** dummy will ne
7390: 76 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74  ver be written t
73a0: 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69  o.  This is veri
73b0: 66 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73  fied by code ins
73c0: 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62  pection and.** b
73d0: 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56  y running with V
73e0: 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65  algrind..*/.Vdbe
73f0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47  Op *sqlite3VdbeG
7400: 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e  etOp(Vdbe *p, in
7410: 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38  t addr){.  /* C8
7420: 39 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74  9 specifies that
7430: 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64   the constant "d
7440: 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e  ummy" will be in
7450: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c  itialized to all
7460: 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69  .  ** zeros, whi
7470: 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20  ch is correct.  
7480: 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61  MSVC generates a
7490: 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74   warning, nevert
74a0: 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61  heless. */.  sta
74b0: 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79  tic VdbeOp dummy
74c0: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  ;  /* Ignore the
74d0: 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62   MSVC warning ab
74e0: 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a  out no initializ
74f0: 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
7500: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
7510: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69  AGIC_INIT );.  i
7520: 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20  f( addr<0 ){.   
7530: 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d   addr = p->nOp -
7540: 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   1;.  }.  assert
7550: 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64  ( (addr>=0 && ad
7560: 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d  dr<p->nOp) || p-
7570: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
7580: 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  d );.  if( p->db
7590: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
75a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64  {.    return (Vd
75b0: 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20  beOp*)&dummy;.  
75c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
75d0: 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  n &p->aOp[addr];
75e0: 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69  .  }.}..#if defi
75f0: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
7600: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
7610: 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  TS)./*.** Return
7620: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
7630: 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  e for one of the
7640: 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74   parameters to t
7650: 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a  he opcode pOp.**
7660: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63   determined by c
7670: 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73  haracter c..*/.s
7680: 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c  tatic int transl
7690: 61 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e  ateP(char c, con
76a0: 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69  st Op *pOp){.  i
76b0: 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75  f( c=='1' ) retu
76c0: 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66  rn pOp->p1;.  if
76d0: 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72  ( c=='2' ) retur
76e0: 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28  n pOp->p2;.  if(
76f0: 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e   c=='3' ) return
7700: 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20   pOp->p3;.  if( 
7710: 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20  c=='4' ) return 
7720: 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74  pOp->p4.i;.  ret
7730: 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a  urn pOp->p5;.}..
7740: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20  /*.** Compute a 
7750: 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22  string for the "
7760: 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f  comment" field o
7770: 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20  f a VDBE opcode 
7780: 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54  listing..**.** T
7790: 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65  he Synopsis: fie
77a0: 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69  ld in comments i
77b0: 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75  n the vdbe.c sou
77c0: 72 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f  rce file gets co
77d0: 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e  nverted.** to an
77e0: 20 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68   extra string th
77f0: 61 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  at is appended t
7800: 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63  o the sqlite3Opc
7810: 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74  odeName().  In t
7820: 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66  he.** absence of
7830: 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c   other comments,
7840: 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62   this synopsis b
7850: 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65  ecomes the comme
7860: 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65  nt on the opcode
7870: 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c  ..** Some transl
7880: 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a  ation occurs:.**
7890: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20  .**       "PX"  
78a0: 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a      ->  "r[X]".*
78b0: 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20  *       "PX@PY" 
78c0: 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d    ->  "r[X..X+Y-
78d0: 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69  1]"  or "r[x]" i
78e0: 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a  f y is 0 or 1.**
78f0: 20 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22         "PX@PY+1"
7900: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22   ->  "r[X..X+Y]"
7910: 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66      or "r[x]" if
7920: 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20   y is 0.**      
7930: 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22   "PY..PY"  ->  "
7940: 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72  r[X..Y]"      or
7950: 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a   "r[x]" if y<=x.
7960: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69  */.static int di
7970: 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20  splayComment(.  
7980: 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20  const Op *pOp,  
7990: 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65     /* The opcode
79a0: 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64   to be commented
79b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
79c0: 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76   *zP4,   /* Prev
79d0: 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20  iously obtained 
79e0: 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a  value for P4 */.
79f0: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20    char *zTemp,  
7a00: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
7a10: 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  sult here */.  i
7a20: 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20  nt nTemp        
7a30: 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c    /* Space avail
7a40: 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20  able in zTemp[] 
7a50: 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
7a60: 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63  ar *zOpName;.  c
7a70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f  onst char *zSyno
7a80: 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e  psis;.  int nOpN
7a90: 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a  ame;.  int ii, j
7aa0: 6a 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73  j;.  zOpName = s
7ab0: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
7ac0: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20  (pOp->opcode);. 
7ad0: 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74   nOpName = sqlit
7ae0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61  e3Strlen30(zOpNa
7af0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61  me);.  if( zOpNa
7b00: 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b  me[nOpName+1] ){
7b10: 0a 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d  .    int seenCom
7b20: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63   = 0;.    char c
7b30: 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20  ;.    zSynopsis 
7b40: 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70  = zOpName += nOp
7b50: 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f  Name + 1;.    fo
7b60: 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54  r(ii=jj=0; jj<nT
7b70: 65 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53  emp-1 && (c = zS
7b80: 79 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b  ynopsis[ii])!=0;
7b90: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66   ii++){.      if
7ba0: 28 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20  ( c=='P' ){.    
7bb0: 20 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69      c = zSynopsi
7bc0: 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20  s[++ii];.       
7bd0: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20   if( c=='4' ){. 
7be0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7bf0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7c00: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7c10: 73 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20  s", zP4);.      
7c20: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
7c30: 58 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  X' ){.          
7c40: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7c50: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7c60: 2b 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e  +jj, "%s", pOp->
7c70: 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20  zComment);.     
7c80: 20 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31       seenCom = 1
7c90: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7ca0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76  .          int v
7cb0: 31 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63  1 = translateP(c
7cc0: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
7cd0: 20 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20    int v2;.      
7ce0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7cf0: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
7d00: 54 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76  Temp+jj, "%d", v
7d10: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
7d20: 28 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70  ( strncmp(zSynop
7d30: 73 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20  sis+ii+1, "@P", 
7d40: 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
7d50: 20 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20       ii += 3;.  
7d60: 20 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20            jj += 
7d70: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
7d80: 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20  zTemp+jj);.     
7d90: 20 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e         v2 = tran
7da0: 73 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73  slateP(zSynopsis
7db0: 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20  [ii], pOp);.    
7dc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e          if( strn
7dd0: 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69  cmp(zSynopsis+ii
7de0: 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b  +1,"+1",2)==0 ){
7df0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
7e00: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
7e10: 20 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20        v2++;.    
7e20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7e30: 20 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29        if( v2>1 )
7e40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7e50: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7e60: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
7e70: 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b  +jj, "..%d", v1+
7e80: 76 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20  v2-1);.         
7e90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
7ea0: 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
7eb0: 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c  (zSynopsis+ii+1,
7ec0: 20 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26   "..P3", 4)==0 &
7ed0: 26 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a  & pOp->p3==0 ){.
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b              ii +
7ef0: 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 4;.          }
7f00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7f10: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
7f20: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
7f30: 6a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  j);.      }else{
7f40: 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a  .        zTemp[j
7f50: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
7f60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
7f70: 21 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e  !seenCom && jj<n
7f80: 54 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a  Temp-5 && pOp->z
7f90: 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20  Comment ){.     
7fa0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7fb0: 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d  f(nTemp-jj, zTem
7fc0: 70 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f  p+jj, "; %s", pO
7fd0: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20  p->zComment);.  
7fe0: 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65      jj += sqlite
7ff0: 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b  3Strlen30(zTemp+
8000: 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  jj);.    }.    i
8010: 66 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54  f( jj<nTemp ) zT
8020: 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d  emp[jj] = 0;.  }
8030: 65 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43  else if( pOp->zC
8040: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71  omment ){.    sq
8050: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8060: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
8070: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
8080: 29 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69  );.    jj = sqli
8090: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
80a0: 70 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  p);.  }else{.   
80b0: 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20   zTemp[0] = 0;. 
80c0: 20 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20     jj = 0;.  }. 
80d0: 20 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65   return jj;.}.#e
80e0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
80f0: 45 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42  EBUG */..#if VDB
8100: 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20  E_DISPLAY_P4 && 
8110: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
8120: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
8130: 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c  TS)./*.** Transl
8140: 61 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72  ate the P4.pExpr
8150: 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50   value for an OP
8160: 5f 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f  _CursorHint opco
8170: 64 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20  de into text.** 
8180: 74 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70  that can be disp
8190: 6c 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20  layed in the P4 
81a0: 63 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49  column of EXPLAI
81b0: 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61  N output..*/.sta
81c0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 50  tic int displayP
81d0: 34 45 78 70 72 28 69 6e 74 20 6e 54 65 6d 70 2c  4Expr(int nTemp,
81e0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 45 78   char *zTemp, Ex
81f0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 6f  pr *pExpr){.  co
8200: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
8210: 30 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 77  0;.  int n;.  sw
8220: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8230: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ){.    case TK_S
8240: 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71 6c  TRING:.      sql
8250: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8260: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 51 22  emp, zTemp, "%Q"
8270: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
8280: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
8290: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
82a0: 45 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69  EGER:.      sqli
82b0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
82c0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 64 22 2c  mp, zTemp, "%d",
82d0: 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65   pExpr->u.iValue
82e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
82f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
8300: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  :.      sqlite3_
8310: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
8320: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
8330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8340: 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54 45   case TK_REGISTE
8350: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
8360: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
8370: 70 2c 20 7a 54 65 6d 70 2c 20 22 72 5b 25 64 5d  p, zTemp, "r[%d]
8380: 22 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ", pExpr->iTable
8390: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
83a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
83b0: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
83c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
83d0: 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20  lumn<0 ){.      
83e0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
83f0: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8400: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
8410: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8420: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8430: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
8440: 63 25 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72  c%d", (int)pExpr
8450: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
8460: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8470: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8480: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LT:      zOp 
8490: 3d 20 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65  = "LT";      bre
84a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
84b0: 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  LE:      zOp = "
84c0: 4c 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  LE";      break;
84d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
84e0: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22        zOp = "GT"
84f0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8500: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
8510: 20 20 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20     zOp = "GE";  
8520: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8530: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
8540: 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20  zOp = "NE";     
8550: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8560: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70   TK_EQ:      zOp
8570: 20 3d 20 22 45 51 22 3b 20 20 20 20 20 20 62 72   = "EQ";      br
8580: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8590: 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _IS:      zOp = 
85a0: 22 49 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "IS";      break
85b0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
85c0: 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53  NOT:   zOp = "IS
85d0: 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  NOT";   break;. 
85e0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
85f0: 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b      zOp = "AND";
8600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8610: 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20  case TK_OR:     
8620: 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20   zOp = "OR";    
8630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8640: 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f  e TK_PLUS:    zO
8650: 70 20 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62  p = "ADD";     b
8660: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8670: 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d  K_STAR:    zOp =
8680: 20 22 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61   "MUL";     brea
8690: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
86a0: 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53  INUS:   zOp = "S
86b0: 55 42 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  UB";     break;.
86c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
86d0: 20 20 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22       zOp = "REM"
86e0: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
86f0: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
8700: 20 20 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22    zOp = "BITAND"
8710: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8720: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a  se TK_BITOR:   z
8730: 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20  Op = "BITOR";   
8740: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8750: 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20  TK_SLASH:   zOp 
8760: 3d 20 22 44 49 56 22 3b 20 20 20 20 20 62 72 65  = "DIV";     bre
8770: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8780: 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  LSHIFT:  zOp = "
8790: 4c 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  LSHIFT";  break;
87a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
87b0: 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48  IFT:  zOp = "RSH
87c0: 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  IFT";  break;.  
87d0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54    case TK_CONCAT
87e0: 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54  :  zOp = "CONCAT
87f0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ";  break;.    c
8800: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20  ase TK_UMINUS:  
8810: 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20  zOp = "MINUS";  
8820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8830: 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70   TK_UPLUS:   zOp
8840: 20 3d 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72   = "PLUS";    br
8850: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8860: 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20  _BITNOT:  zOp = 
8870: 22 42 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b  "BITNOT";  break
8880: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  ;.    case TK_NO
8890: 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f  T:     zOp = "NO
88a0: 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  T";     break;. 
88b0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
88c0: 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c  L:  zOp = "ISNUL
88d0: 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  L";  break;.    
88e0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
88f0: 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22   zOp = "NOTNULL"
8900: 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65  ; break;..    de
8910: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c  fault:.      sql
8920: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
8930: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
8940: 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20  , "expr");.     
8950: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69   break;.  }..  i
8960: 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71  f( zOp ){.    sq
8970: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8980: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73  Temp, zTemp, "%s
8990: 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 6e 20  (", zOp);.    n 
89a0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
89b0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 6e 20  0(zTemp);.    n 
89c0: 2b 3d 20 64 69 73 70 6c 61 79 50 34 45 78 70 72  += displayP4Expr
89d0: 28 6e 54 65 6d 70 2d 6e 2c 20 7a 54 65 6d 70 2b  (nTemp-n, zTemp+
89e0: 6e 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  n, pExpr->pLeft)
89f0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 6e 54 65 6d  ;.    if( n<nTem
8a00: 70 2d 31 20 26 26 20 70 45 78 70 72 2d 3e 70 52  p-1 && pExpr->pR
8a10: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 7a 54  ight ){.      zT
8a20: 65 6d 70 5b 6e 2b 2b 5d 20 3d 20 27 2c 27 3b 0a  emp[n++] = ',';.
8a30: 20 20 20 20 20 20 6e 20 2b 3d 20 64 69 73 70 6c        n += displ
8a40: 61 79 50 34 45 78 70 72 28 6e 54 65 6d 70 2d 6e  ayP4Expr(nTemp-n
8a50: 2c 20 7a 54 65 6d 70 2b 6e 2c 20 70 45 78 70 72  , zTemp+n, pExpr
8a60: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d  ->pRight);.    }
8a70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
8a80: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6e 2c 20 7a  rintf(nTemp-n, z
8a90: 54 65 6d 70 2b 6e 2c 20 22 29 22 29 3b 0a 20 20  Temp+n, ")");.  
8aa0: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
8ab0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
8ac0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  );.}.#endif /* V
8ad0: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 26  DBE_DISPLAY_P4 &
8ae0: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
8af0: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8b00: 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23 69 66 20 56  INTS) */...#if V
8b10: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 0a 2f  DBE_DISPLAY_P4./
8b20: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
8b30: 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
8b40: 69 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61  ibes the P4 para
8b50: 6d 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63  meter for an opc
8b60: 6f 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d  ode..** Use zTem
8b70: 70 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72  p for any requir
8b80: 65 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66  ed temporary buf
8b90: 66 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  fer space..*/.st
8ba0: 61 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c  atic char *displ
8bb0: 61 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68  ayP4(Op *pOp, ch
8bc0: 61 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e  ar *zTemp, int n
8bd0: 54 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a  Temp){.  char *z
8be0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73  P4 = zTemp;.  as
8bf0: 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20  sert( nTemp>=20 
8c00: 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70  );.  switch( pOp
8c10: 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20  ->p4type ){.    
8c20: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
8c30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20   {.      int i, 
8c40: 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f  j;.      KeyInfo
8c50: 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70   *pKeyInfo = pOp
8c60: 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20  ->p4.pKeyInfo;. 
8c70: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65       assert( pKe
8c80: 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
8c90: 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  r!=0 );.      sq
8ca0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
8cb0: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28  Temp, zTemp, "k(
8cc0: 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  %d", pKeyInfo->n
8cd0: 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20  Field);.      i 
8ce0: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
8cf0: 30 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20  0(zTemp);.      
8d00: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
8d10: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
8d20: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
8d30: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
8d40: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
8d50: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
8d60: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
8d70: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
8d80: 20 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20   : "nil";.      
8d90: 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
8da0: 33 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29  3Strlen30(zColl)
8db0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d  ;.        if( n=
8dc0: 3d 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f  =6 && memcmp(zCo
8dd0: 6c 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d  ll,"BINARY",6)==
8de0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  0 ){.          z
8df0: 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20  Coll = "B";.    
8e00: 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
8e10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
8e20: 66 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 37 20 29  f( i+n>nTemp-7 )
8e30: 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63  {.          memc
8e40: 70 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e  py(&zTemp[i],",.
8e50: 2e 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20  ..",4);.        
8e60: 20 20 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20    i += 4;.      
8e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8e80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54 65     }.        zTe
8e90: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20  mp[i++] = ',';. 
8ea0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
8eb0: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
8ec0: 6a 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j] ){.          
8ed0: 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27  zTemp[i++] = '-'
8ee0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8ef0: 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d      memcpy(&zTem
8f00: 70 5b 69 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31  p[i], zColl, n+1
8f10: 29 3b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20  );.        i += 
8f20: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
8f30: 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29   zTemp[i++] = ')
8f40: 27 3b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69  ';.      zTemp[i
8f50: 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  ] = 0;.      ass
8f60: 65 72 74 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a  ert( i<nTemp );.
8f70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f80: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
8f90: 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48  _ENABLE_CURSOR_H
8fa0: 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50 34  INTS.    case P4
8fb0: 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64  _EXPR: {.      d
8fc0: 69 73 70 6c 61 79 50 34 45 78 70 72 28 6e 54 65  isplayP4Expr(nTe
8fd0: 6d 70 2c 20 7a 54 65 6d 70 2c 20 70 4f 70 2d 3e  mp, zTemp, pOp->
8fe0: 70 34 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  p4.pExpr);.     
8ff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
9000: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
9010: 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a 20 20 20 20  _COLLSEQ: {.    
9020: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
9030: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c   = pOp->p4.pColl
9040: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9050: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
9060: 7a 54 65 6d 70 2c 20 22 28 25 2e 32 30 73 29 22  zTemp, "(%.20s)"
9070: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9080: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9090: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
90a0: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
90b0: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
90c0: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
90d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
90e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54  printf(nTemp, zT
90f0: 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c 20 70  emp, "%s(%d)", p
9100: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66  Def->zName, pDef
9110: 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62  ->nArg);.      b
9120: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64  reak;.    }.#ifd
9130: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9140: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
9150: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e  CTX: {.      Fun
9160: 63 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70  cDef *pDef = pOp
9170: 2d 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63  ->p4.pCtx->pFunc
9180: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
9190: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
91a0: 7a 54 65 6d 70 2c 20 22 25 73 28 25 64 29 22 2c  zTemp, "%s(%d)",
91b0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
91c0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
91d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
91e0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
91f0: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
9200: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9210: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9220: 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  %lld", *pOp->p4.
9230: 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62 72 65  pI64);.      bre
9240: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9250: 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b 0a 20  se P4_INT32: {. 
9260: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
9270: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
9280: 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  mp, "%d", pOp->p
9290: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
92a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
92b0: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
92c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
92d0: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
92e0: 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d  , "%.16g", *pOp-
92f0: 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20  >p4.pReal);.    
9300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9310: 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20     case P4_MEM: 
9320: 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
9330: 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d  m = pOp->p4.pMem
9340: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
9350: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
9360: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  r ){.        zP4
9370: 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20   = pMem->z;.    
9380: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
9390: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e  ->flags & MEM_In
93a0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
93b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
93c0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c  emp, zTemp, "%ll
93d0: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
93e0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
93f0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9400: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
9410: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9420: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
9430: 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d 2d 3e   "%.16g", pMem->
9440: 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
9450: 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67  e if( pMem->flag
9460: 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  s & MEM_Null ){.
9470: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
9480: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20  snprintf(nTemp, 
9490: 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a  zTemp, "NULL");.
94a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
94b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65       assert( pMe
94c0: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  m->flags & MEM_B
94d0: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20 20 7a  lob );.        z
94e0: 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20  P4 = "(blob)";. 
94f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
9500: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
9510: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
9520: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63  RTUALTABLE.    c
9530: 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20  ase P4_VTAB: {. 
9540: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61       sqlite3_vta
9550: 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e  b *pVtab = pOp->
9560: 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61 62 3b  p4.pVtab->pVtab;
9570: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
9580: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
9590: 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70 22 2c  Temp, "vtab:%p",
95a0: 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62   pVtab);.      b
95b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
95c0: 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  if.    case P4_I
95d0: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
95e0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
95f0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
9600: 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20  "intarray");.   
9610: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9620: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
9630: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
9640: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
9650: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
9660: 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20  program");.     
9670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9680: 20 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43    case P4_ADVANC
9690: 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70  E: {.      zTemp
96a0: 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  [0] = 0;.      b
96b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
96c0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
96d0: 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a   zP4 = pOp->p4.z
96e0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d  ;.      if( zP4=
96f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50  =0 ){.        zP
9700: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20  4 = zTemp;.     
9710: 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b     zTemp[0] = 0;
9720: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
9730: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34   }.  assert( zP4
9740: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
9750: 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  zP4;.}.#endif /*
9760: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
9770: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61   */../*.** Decla
9780: 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20 74  re to the Vdbe t
9790: 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f 62  hat the BTree ob
97a0: 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b  ject at db->aDb[
97b0: 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a  i] is used..**.*
97c0: 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20 73  * The prepared s
97d0: 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74  tatements need t
97e0: 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63  o know in advanc
97f0: 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73  e the complete s
9800: 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65  et of.** attache
9810: 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  d databases that
9820: 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41   will be use.  A
9830: 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64   mask of these d
9840: 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d  atabases.** is m
9850: 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e  aintained in p->
9860: 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20  btreeMask.  The 
9870: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75  p->lockMask valu
9880: 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74 20  e is the subset 
9890: 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61  of.** p->btreeMa
98a0: 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73 20  sk of databases 
98b0: 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72  that will requir
98c0: 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69  e a lock..*/.voi
98d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65  d sqlite3VdbeUse
98e0: 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20  sBtree(Vdbe *p, 
98f0: 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74  int i){.  assert
9900: 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64  ( i>=0 && i<p->d
9910: 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74  b->nDb && i<(int
9920: 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29  )sizeof(yDbMask)
9930: 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  *8 );.  assert( 
9940: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d  i<(int)sizeof(p-
9950: 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b  >btreeMask)*8 );
9960: 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e  .  DbMaskSet(p->
9970: 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20  btreeMask, i);. 
9980: 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c   if( i!=1 && sql
9990: 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62 6c  ite3BtreeSharabl
99a0: 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e  e(p->db->aDb[i].
99b0: 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61  pBt) ){.    DbMa
99c0: 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73  skSet(p->lockMas
99d0: 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  k, i);.  }.}..#i
99e0: 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
99f0: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
9a00: 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  CHE)./*.** If SQ
9a10: 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
9a20: 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72   to support shar
9a30: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e  ed-cache mode an
9a40: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
9a50: 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  fe,.** this rout
9a60: 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20  ine obtains the 
9a70: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
9a80: 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61   with each BtSha
9a90: 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  red structure.**
9aa0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63   that may be acc
9ab0: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20  essed by the VM 
9ac0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
9ad0: 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20  ument. In doing 
9ae0: 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65  so it also.** se
9af0: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
9b00: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
9b10: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
9b20: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
9b30: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
9b40: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
9b50: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
9b60: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
9b70: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
9b80: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
9b90: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
9ba0: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
9bb0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
9bc0: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
9bd0: 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e  reeEnter() is in
9be0: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65  voked to set the
9bf0: 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72   BtShared.db var
9c00: 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c  iables.** of all
9c10: 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72   of BtShared str
9c20: 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62  uctures accessib
9c30: 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62  le via the datab
9c40: 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61  ase handle .** a
9c50: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
9c60: 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  he VM..**.** If 
9c70: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
9c80: 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65  readsafe and doe
9c90: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
9ca0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
9cb0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
9cc0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
9cd0: 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65  .** The p->btree
9ce0: 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20  Mask field is a 
9cf0: 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62  bitmask of all b
9d00: 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70  trees that the p
9d10: 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74  repared .** stat
9d20: 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65  ement p will eve
9d30: 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65  r use.  Let N be
9d40: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
9d50: 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  its in p->btreeM
9d60: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
9d70: 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74  ding to btrees t
9d80: 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
9d90: 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20  ache.  Then the 
9da0: 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  runtime of.** th
9db0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a  is routine is N*
9dc0: 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20  N.  But as N is 
9dd0: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
9de0: 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20   1, this should 
9df0: 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62  not.** be a prob
9e00: 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
9e10: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64  ite3VdbeEnter(Vd
9e20: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
9e30: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
9e40: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
9e50: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
9e60: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
9e70: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
9e80: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
9e90: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
9ea0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
9eb0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
9ec0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
9ed0: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
9ee0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
9ef0: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
9f00: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
9f10: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
9f20: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
9f30: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44  te3BtreeEnter(aD
9f40: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
9f50: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
9f60: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
9f70: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
9f80: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
9f90: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
9fa0: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66  ** Unlock all of
9fb0: 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76   the btrees prev
9fc0: 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79  iously locked by
9fd0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
9fe0: 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a  e3VdbeEnter()..*
9ff0: 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f  /.static SQLITE_
a000: 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64  NOINLINE void vd
a010: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
a020: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
a030: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
a040: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
a050: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
a060: 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20  aDb = db->aDb;. 
a070: 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a   nDb = db->nDb;.
a080: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62    for(i=0; i<nDb
a090: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
a0a0: 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65  i!=1 && DbMaskTe
a0b0: 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69  st(p->lockMask,i
a0c0: 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b  ) && ALWAYS(aDb[
a0d0: 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20  i].pBt!=0) ){.  
a0e0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
a0f0: 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74  Leave(aDb[i].pBt
a100: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76  );.    }.  }.}.v
a110: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c  oid sqlite3VdbeL
a120: 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  eave(Vdbe *p){. 
a130: 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65   if( DbMaskAllZe
a140: 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20  ro(p->lockMask) 
a150: 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68  ) return;  /* Th
a160: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f  e common case */
a170: 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b  .  vdbeLeave(p);
a180: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .}.#endif..#if d
a190: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
a1a0: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
a1b0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
a1c0: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67  .** Print a sing
a1d0: 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73  le opcode.  This
a1e0: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
a1f0: 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
a200: 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  nly..*/.void sql
a210: 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28  ite3VdbePrintOp(
a220: 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20  FILE *pOut, int 
a230: 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20  pc, Op *pOp){.  
a240: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61  char *zP4;.  cha
a250: 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68  r zPtr[50];.  ch
a260: 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20  ar zCom[100];.  
a270: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
a280: 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25  r *zFormat1 = "%
a290: 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34 64  4d %-13s %4d %4d
a2a0: 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20   %4d %-13s %.2X 
a2b0: 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75  %s\n";.  if( pOu
a2c0: 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74  t==0 ) pOut = st
a2d0: 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69  dout;.  zP4 = di
a2e0: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74  splayP4(pOp, zPt
a2f0: 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29  r, sizeof(zPtr))
a300: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
a310: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
a320: 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61  OMMENTS.  displa
a330: 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50  yComment(pOp, zP
a340: 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28  4, zCom, sizeof(
a350: 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20  zCom));.#else.  
a360: 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e  zCom[0] = 0;.#en
a370: 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68  dif.  /* NB:  Th
a380: 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  e sqlite3OpcodeN
a390: 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ame() function i
a3a0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
a3b0: 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20   code created.  
a3c0: 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f  ** by the mkopco
a3d0: 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70  deh.awk and mkop
a3e0: 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74  codec.awk script
a3f0: 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74 20  s which extract 
a400: 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  the.  ** informa
a410: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64  tion from the vd
a420: 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74  be.c source text
a430: 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f   */.  fprintf(pO
a440: 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63  ut, zFormat1, pc
a450: 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  , .      sqlite3
a460: 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e  OpcodeName(pOp->
a470: 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31  opcode), pOp->p1
a480: 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e  , pOp->p2, pOp->
a490: 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35  p3, zP4, pOp->p5
a4a0: 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29  ,.      zCom.  )
a4b0: 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29  ;.  fflush(pOut)
a4c0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
a4d0: 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72  * Release an arr
a4e0: 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d  ay of N Mem elem
a4f0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ents.*/.static v
a500: 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  oid releaseMemAr
a510: 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20  ray(Mem *p, int 
a520: 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e  N){.  if( p && N
a530: 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e   ){.    Mem *pEn
a540: 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73  d = &p[N];.    s
a550: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
a560: 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f  db;.    u8 mallo
a570: 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d  c_failed = db->m
a580: 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
a590: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
a5a0: 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64  Freed ){.      d
a5b0: 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  o{.        if( p
a5c0: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c  ->szMalloc ) sql
a5d0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
a5e0: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
a5f0: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
a600: 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65  pEnd );.      re
a610: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  turn;.    }.    
a620: 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  do{.      assert
a630: 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20  ( (&p[1])==pEnd 
a640: 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d  || p[0].db==p[1]
a650: 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73  .db );.      ass
a660: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
a670: 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e  CheckMemInvarian
a680: 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20  ts(p) );..      
a690: 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73  /* This block is
a6a0: 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e   really an inlin
a6b0: 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
a6c0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
a6d0: 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74  ase().      ** t
a6e0: 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74  hat takes advant
a6f0: 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74 20  age of the fact 
a700: 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20  that the memory 
a710: 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20  cell value is . 
a720: 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65       ** being se
a730: 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20  t to NULL after 
a740: 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79  releasing any dy
a750: 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e  namic resources.
a760: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
a770: 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63 61  ** The justifica
a780: 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61  tion for duplica
a790: 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61  ting code is tha
a7a0: 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a  t according to .
a7b0: 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69        ** callgri
a7c0: 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73 20  nd, this causes 
a7d0: 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20 63  a certain test c
a7e0: 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20 43  ase to hit the C
a7f0: 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a  PU 4.7 .      **
a800: 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78   percent less (x
a810: 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65  86 linux, gcc ve
a820: 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36  rsion 4.1.2, -O6
a830: 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20  ) than if .     
a840: 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65   ** sqlite3MemRe
a850: 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61 6c  lease() were cal
a860: 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57  led from here. W
a870: 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75  ith -O2, this ju
a880: 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  mps.      ** to 
a890: 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65  6.6 percent. The
a8a0: 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69 6e   test case is in
a8b0: 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77  serting 1000 row
a8c0: 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a  s into a table .
a8d0: 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f        ** with no
a8e0: 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61   indexes using a
a8f0: 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64   single prepared
a900: 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e   INSERT statemen
a910: 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20  t, bind() .     
a920: 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e   ** and reset().
a930: 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f   Inserts are gro
a940: 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e  uped into a tran
a950: 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a  saction..      *
a960: 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  /.      testcase
a970: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  ( p->flags & MEM
a980: 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65  _Agg );.      te
a990: 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73  stcase( p->flags
a9a0: 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20   & MEM_Dyn );.  
a9b0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
a9c0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61  >flags & MEM_Fra
a9d0: 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  me );.      test
a9e0: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
a9f0: 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20   MEM_RowSet );. 
aa00: 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67       if( p->flag
aa10: 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44  s&(MEM_Agg|MEM_D
aa20: 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d  yn|MEM_Frame|MEM
aa30: 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20  _RowSet) ){.    
aa40: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
aa50: 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20  emRelease(p);.  
aa60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
aa70: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20  >szMalloc ){.   
aa80: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
aa90: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
aaa0: 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73  c);.        p->s
aab0: 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
aac0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66     }..      p->f
aad0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
aae0: 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ined;.    }while
aaf0: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
ab00: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
ab10: 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61  iled = malloc_fa
ab20: 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iled;.  }.}../*.
ab30: 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65  ** Delete a Vdbe
ab40: 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64  Frame object and
ab50: 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56   its contents. V
ab60: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
ab70: 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65   are.** allocate
ab80: 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67  d by the OP_Prog
ab90: 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71  ram opcode in sq
aba0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
abb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
abc0: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
abd0: 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20  VdbeFrame *p){. 
abe0: 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61   int i;.  Mem *a
abf0: 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d  Mem = VdbeFrameM
ac00: 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72  em(p);.  VdbeCur
ac10: 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56  sor **apCsr = (V
ac20: 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d  dbeCursor **)&aM
ac30: 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d  em[p->nChildMem]
ac40: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
ac50: 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b  ->nChildCsr; i++
ac60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
ac70: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e  beFreeCursor(p->
ac80: 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20  v, apCsr[i]);.  
ac90: 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  }.  releaseMemAr
aca0: 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68  ray(aMem, p->nCh
acb0: 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74  ildMem);.  sqlit
acc0: 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64  e3DbFree(p->v->d
acd0: 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  b, p);.}..#ifnde
ace0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
acf0: 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65  PLAIN./*.** Give
ad00: 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68   a listing of th
ad10: 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65  e program in the
ad20: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
ad30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65  ..**.** The inte
ad40: 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61 6d  rface is the sam
ad50: 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62 65  e as sqlite3Vdbe
ad60: 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73  Exec().  But ins
ad70: 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69  tead of.** runni
ad80: 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20  ng the code, it 
ad90: 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c  invokes the call
ada0: 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61  back once for ea
adb0: 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a  ch instruction..
adc0: 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65 20  ** This feature 
add0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
ade0: 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a  ment "EXPLAIN"..
adf0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
ae00: 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69  plain==1, each i
ae10: 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69  nstruction is li
ae20: 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70  sted.  When.** p
ae30: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e  ->explain==2, on
ae40: 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e  ly OP_Explain in
ae50: 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c  structions are l
ae60: 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a  isted and these.
ae70: 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20  ** are shown in 
ae80: 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d  a different form
ae90: 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  at.  p->explain=
aea0: 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d  =2 is used to im
aeb0: 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41  plement.** EXPLA
aec0: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a  IN QUERY PLAN..*
aed0: 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70  *.** When p->exp
aee0: 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74  lain==1, first t
aef0: 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20  he main program 
af00: 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20  is listed, then 
af10: 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74  each of.** the t
af20: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
af30: 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e  ms are listed on
af40: 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74  e by one..*/.int
af50: 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74   sqlite3VdbeList
af60: 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20 20  (.  Vdbe *p     
af70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
af80: 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a   The VDBE */.){.
af90: 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20    int nRow;     
afa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afb0: 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77         /* Stop w
afc0: 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65  hen row count re
afd0: 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  aches this */.  
afe0: 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20  int nSub = 0;   
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b010: 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e  f sub-vdbes seen
b020: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62   so far */.  Sub
b030: 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20  Program **apSub 
b040: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
b050: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
b060: 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d  b-vdbes */.  Mem
b070: 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20   *pSub = 0;     
b080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b090: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
b0a0: 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73   hold array of s
b0b0: 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c  ubprogs */.  sql
b0c0: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
b0d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b0e0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
b0f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
b100: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b120: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b130: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
b140: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
b170: 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d  */.  Mem *pMem =
b180: 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20   &p->aMem[1];   
b190: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
b1a0: 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74  st Mem of result
b1b0: 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72   set */..  asser
b1c0: 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b  t( p->explain );
b1d0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
b1e0: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
b1f0: 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RUN );.  assert(
b200: 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   p->rc==SQLITE_O
b210: 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  K || p->rc==SQLI
b220: 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63  TE_BUSY || p->rc
b230: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
b240: 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f  ;..  /* Even tho
b250: 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20  ugh this opcode 
b260: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e  does not use dyn
b270: 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72  amic strings for
b280: 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  .  ** the result
b290: 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  , result columns
b2a0: 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61   may become dyna
b2b0: 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72 20  mic if the user 
b2c0: 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74  calls.  ** sqlit
b2d0: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
b2e0: 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72  (), causing a tr
b2f0: 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46  anslation to UTF
b300: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20  -16 encoding..  
b310: 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  */.  releaseMemA
b320: 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20  rray(pMem, 8);. 
b330: 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d   p->pResultSet =
b340: 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63   0;..  if( p->rc
b350: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
b360: 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
b370: 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f  ppens if a mallo
b380: 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c  c() inside a cal
b390: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c  l to sqlite3_col
b3a0: 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20  umn_text() or.  
b3b0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
b3c0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69  umn_text16() fai
b3d0: 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d  led.  */.    db-
b3e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20  >mallocFailed = 
b3f0: 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
b400: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
b410: 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e  .  /* When the n
b420: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
b430: 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f  rows reaches nRo
b440: 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  w, that means th
b450: 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68  e.  ** listing h
b460: 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20  as finished and 
b470: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73  sqlite3_step() s
b480: 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c  hould return SQL
b490: 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e  ITE_DONE..  ** n
b4a0: 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f  Row is the sum o
b4b0: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b4c0: 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e  rows in the main
b4d0: 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20   program, plus. 
b4e0: 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74   ** the sum of t
b4f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
b500: 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72  s in all trigger
b510: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63   subprograms enc
b520: 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f  ountered.  ** so
b530: 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20   far.  The nRow 
b540: 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65  value will incre
b550: 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67 67  ase as new trigg
b560: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61  er subprograms a
b570: 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65  re.  ** encounte
b580: 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77  red, but p->pc w
b590: 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63  ill eventually c
b5a0: 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e  atch up to nRow.
b5b0: 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70  .  */.  nRow = p
b5c0: 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e  ->nOp;.  if( p->
b5d0: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
b5e0: 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38    /* The first 8
b5f0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72   memory cells ar
b600: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72  e used for the r
b610: 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77  esult set.  So w
b620: 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f  e will.    ** co
b630: 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74 68  mmandeer the 9th
b640: 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20   cell to use as 
b650: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61  storage for an a
b660: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
b670: 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67  .    ** to trigg
b680: 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  er subprograms. 
b690: 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75 61   The VDBE is gua
b6a0: 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20  ranteed to have 
b6b0: 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a  at least 9.    *
b6c0: 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20  * cells.  */.   
b6d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d   assert( p->nMem
b6e0: 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d  >9 );.    pSub =
b6f0: 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20   &p->aMem[9];.  
b700: 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67    if( pSub->flag
b710: 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20  s&MEM_Blob ){.  
b720: 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69      /* On the fi
b730: 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  rst call to sqli
b740: 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62  te3_step(), pSub
b750: 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c   will hold a NUL
b760: 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20 20  L.  It is.      
b770: 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ** initialized t
b780: 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20  o a BLOB by the 
b790: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72  P4_SUBPROGRAM pr
b7a0: 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62  ocessing logic b
b7b0: 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53  elow */.      nS
b7c0: 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a  ub = pSub->n/siz
b7d0: 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20  eof(Vdbe*);.    
b7e0: 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72    apSub = (SubPr
b7f0: 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a  ogram **)pSub->z
b800: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
b810: 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b  i=0; i<nSub; i++
b820: 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d  ){.      nRow +=
b830: 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a   apSub[i]->nOp;.
b840: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b      }.  }..  do{
b850: 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b  .    i = p->pc++
b860: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52  ;.  }while( i<nR
b870: 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e  ow && p->explain
b880: 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d  ==2 && p->aOp[i]
b890: 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c  .opcode!=OP_Expl
b8a0: 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d  ain );.  if( i>=
b8b0: 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72  nRow ){.    p->r
b8c0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
b8d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
b8e0: 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ONE;.  }else if(
b8f0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
b900: 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  upted ){.    p->
b910: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45  rc = SQLITE_INTE
b920: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
b930: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
b940: 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
b950: 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72  or(p, sqlite3Err
b960: 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d  Str(p->rc));.  }
b970: 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a  else{.    char *
b980: 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70  zP4;.    Op *pOp
b990: 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e  ;.    if( i<p->n
b9a0: 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  Op ){.      /* T
b9b0: 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e  he output line n
b9c0: 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65  umber is small e
b9d0: 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61 72  nough that we ar
b9e0: 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20  e still in the. 
b9f0: 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f       ** main pro
ba00: 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70  gram. */.      p
ba10: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b  Op = &p->aOp[i];
ba20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ba30: 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72    /* We are curr
ba40: 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75  ently listing su
ba50: 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75  bprograms.  Figu
ba60: 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65  re out which one
ba70: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69   and.      ** pi
ba80: 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f 70  ck up the approp
ba90: 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f  riate opcode. */
baa0: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
bab0: 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b      i -= p->nOp;
bac0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
bad0: 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  i>=apSub[j]->nOp
bae0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; j++){.        
baf0: 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e  i -= apSub[j]->n
bb00: 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  Op;.      }.    
bb10: 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a    pOp = &apSub[j
bb20: 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d  ]->aOp[i];.    }
bb30: 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c  .    if( p->expl
bb40: 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  ain==1 ){.      
bb50: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
bb60: 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65  M_Int;.      pMe
bb70: 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20  m->u.i = i;     
bb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
bba0: 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f  ogram counter */
bbb0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20  .      pMem++;. 
bbc0: 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c   .      pMem->fl
bbd0: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63  ags = MEM_Static
bbe0: 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72  |MEM_Str|MEM_Ter
bbf0: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  m;.      pMem->z
bc00: 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
bc10: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
bc20: 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63  >opcode); /* Opc
bc30: 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ode */.      ass
bc40: 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20  ert( pMem->z!=0 
bc50: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  );.      pMem->n
bc60: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
bc70: 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20  30(pMem->z);.   
bc80: 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53     pMem->enc = S
bc90: 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20  QLITE_UTF8;.    
bca0: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20    pMem++;..     
bcb0: 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50   /* When an OP_P
bcc0: 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73  rogram opcode is
bcd0: 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20   encounter (the 
bce0: 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74  only opcode that
bcf0: 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20   has.      ** a 
bd00: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72  P4_SUBPROGRAM ar
bd10: 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20  gument), expand 
bd20: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
bd30: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
bd40: 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65  rams.      ** ke
bd50: 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d  pt in p->aMem[9]
bd60: 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .z to hold the n
bd70: 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73  ew program - ass
bd80: 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70 72  uming this subpr
bd90: 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68  ogram.      ** h
bda0: 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62  as not already b
bdb0: 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20  een seen..      
bdc0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70  */.      if( pOp
bdd0: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42  ->p4type==P4_SUB
bde0: 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20  PROGRAM ){.     
bdf0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
be00: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
be10: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
be20: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
be30: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e      for(j=0; j<n
be40: 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Sub; j++){.     
be50: 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a       if( apSub[j
be60: 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67  ]==pOp->p4.pProg
be70: 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ram ) break;.   
be80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
be90: 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51  f( j==nSub && SQ
bea0: 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33  LITE_OK==sqlite3
beb0: 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62  VdbeMemGrow(pSub
bec0: 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30  , nByte, nSub!=0
bed0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ) ){.          a
bee0: 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72  pSub = (SubProgr
bef0: 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20  am **)pSub->z;. 
bf00: 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e           apSub[n
bf10: 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34  Sub++] = pOp->p4
bf20: 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20  .pProgram;.     
bf30: 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73       pSub->flags
bf40: 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20   |= MEM_Blob;.  
bf50: 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20          pSub->n 
bf60: 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75  = nSub*sizeof(Su
bf70: 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20  bProgram*);.    
bf80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bf90: 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66    }..    pMem->f
bfa0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
bfb0: 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
bfc0: 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20  pOp->p1;        
bfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfe0: 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70    /* P1 */.    p
bff0: 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d  Mem++;..    pMem
c000: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
c010: 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  t;.    pMem->u.i
c020: 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20   = pOp->p2;     
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20       /* P2 */.  
c050: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70    pMem++;..    p
c060: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c070: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
c080: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20  u.i = pOp->p3;  
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f          /* P3 */
c0b0: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
c0c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
c0d0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
c0e0: 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b  ze(pMem, 100) ){
c0f0: 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20   /* P4 */.      
c100: 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d  assert( p->db->m
c110: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
c120: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
c130: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
c140: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
c150: 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  = MEM_Str|MEM_Te
c160: 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69  rm;.    zP4 = di
c170: 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65  splayP4(pOp, pMe
c180: 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61  m->z, pMem->szMa
c190: 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a  lloc);.    if( z
c1a0: 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20  P4!=pMem->z ){. 
c1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1c0: 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20  MemSetStr(pMem, 
c1d0: 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  zP4, -1, SQLITE_
c1e0: 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65  UTF8, 0);.    }e
c1f0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
c200: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
c210: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
c220: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c230: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
c240: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
c250: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a  ITE_UTF8;.    }.
c260: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
c270: 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d   if( p->explain=
c280: 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =1 ){.      if( 
c290: 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c  sqlite3VdbeMemCl
c2a0: 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65  earAndResize(pMe
c2b0: 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20  m, 4) ){.       
c2c0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
c2d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c2e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c2f0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
c300: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
c310: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
c320: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
c330: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20   pMem->n = 2;.  
c340: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
c350: 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c  intf(3, pMem->z,
c360: 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35   "%.2x", pOp->p5
c370: 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20  );   /* P5 */.  
c380: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c390: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
c3a0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69     pMem++;.  .#i
c3b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c3c0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
c3d0: 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73 71  NTS.      if( sq
c3e0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
c3f0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
c400: 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20   500) ){.       
c410: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
c420: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c430: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
c440: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
c450: 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d     }.      pMem-
c460: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72  >flags = MEM_Str
c470: 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20  |MEM_Term;.     
c480: 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c   pMem->n = displ
c490: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
c4a0: 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30  P4, pMem->z, 500
c4b0: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
c4c0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c4d0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d  ;.#else.      pM
c4e0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c4f0: 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Null;           
c500: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
c510: 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66  omment */.#endif
c520: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e  .    }..    p->n
c530: 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20  ResColumn = 8 - 
c540: 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29  4*(p->explain-1)
c550: 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74  ;.    p->pResult
c560: 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31  Set = &p->aMem[1
c570: 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ];.    p->rc = S
c580: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63  QLITE_OK;.    rc
c590: 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20   = SQLITE_ROW;. 
c5a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
c5b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
c5c0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20  TE_OMIT_EXPLAIN 
c5d0: 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
c5e0: 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72  E_DEBUG./*.** Pr
c5f0: 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61 74  int the SQL that
c600: 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e   was used to gen
c610: 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72 6f  erate a VDBE pro
c620: 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gram..*/.void sq
c630: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53 71  lite3VdbePrintSq
c640: 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f  l(Vdbe *p){.  co
c650: 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b  nst char *z = 0;
c660: 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29  .  if( p->zSql )
c670: 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71  {.    z = p->zSq
c680: 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  l;.  }else if( p
c690: 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20  ->nOp>=1 ){.    
c6a0: 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f  const VdbeOp *pO
c6b0: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a  p = &p->aOp[0];.
c6c0: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63      if( pOp->opc
c6d0: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
c6e0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
c6f0: 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70        z = pOp->p
c700: 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  4.z;.      while
c710: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
c720: 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
c730: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20  }.  }.  if( z ) 
c740: 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73  printf("SQL: [%s
c750: 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64  ]\n", z);.}.#end
c760: 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  if..#if !defined
c770: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41  (SQLITE_OMIT_TRA
c780: 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  CE) && defined(S
c790: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
c7a0: 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  RACE)./*.** Prin
c7b0: 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73  t an IOTRACE mes
c7c0: 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c  sage showing SQL
c7d0: 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69   content..*/.voi
c7e0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54  d sqlite3VdbeIOT
c7f0: 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29  raceSql(Vdbe *p)
c800: 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d  {.  int nOp = p-
c810: 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a  >nOp;.  VdbeOp *
c820: 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  pOp;.  if( sqlit
c830: 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72  e3IoTrace==0 ) r
c840: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70  eturn;.  if( nOp
c850: 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  <1 ) return;.  p
c860: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
c870: 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f  .  if( pOp->opco
c880: 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70  de==OP_Init && p
c890: 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20  Op->p4.z!=0 ){. 
c8a0: 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
c8b0: 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20   char z[1000];. 
c8c0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
c8d0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
c8e0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e  , "%s", pOp->p4.
c8f0: 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  z);.    for(i=0;
c900: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
c910: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
c920: 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b    for(j=0; z[i];
c930: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
c940: 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28   sqlite3Isspace(
c950: 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  z[i]) ){.       
c960: 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27   if( z[i-1]!=' '
c970: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b   ){.          z[
c980: 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20  j++] = ' ';.    
c990: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
c9a0: 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b  e{.        z[j++
c9b0: 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20  ] = z[i];.      
c9c0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d  }.    }.    z[j]
c9d0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
c9e0: 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73  3IoTrace("SQL %s
c9f0: 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23  \n", z);.  }.}.#
ca00: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
ca10: 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53  _OMIT_TRACE && S
ca20: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
ca30: 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  RACE */../*.** A
ca40: 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 72  llocate space fr
ca50: 6f 6d 20 61 20 66 69 78 65 64 20 73 69 7a 65 20  om a fixed size 
ca60: 62 75 66 66 65 72 20 61 6e 64 20 72 65 74 75 72  buffer and retur
ca70: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 2a  n a pointer to.*
ca80: 2a 20 74 68 61 74 20 73 70 61 63 65 2e 20 20 49  * that space.  I
ca90: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  f insufficient s
caa0: 70 61 63 65 20 69 73 20 61 76 61 69 6c 61 62 6c  pace is availabl
cab0: 65 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  e, return NULL..
cac0: 2a 2a 0a 2a 2a 20 54 68 65 20 70 42 75 66 20 70  **.** The pBuf p
cad0: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
cae0: 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 6f 66  initial value of
caf0: 20 61 20 70 6f 69 6e 74 65 72 20 77 68 69 63 68   a pointer which
cb00: 20 77 69 6c 6c 0a 2a 2a 20 72 65 63 65 69 76 65   will.** receive
cb10: 20 74 68 65 20 6e 65 77 20 6d 65 6d 6f 72 79 2e   the new memory.
cb20: 20 20 70 42 75 66 20 69 73 20 6e 6f 72 6d 61 6c    pBuf is normal
cb30: 6c 79 20 4e 55 4c 4c 2e 20 20 49 66 20 70 42 75  ly NULL.  If pBu
cb40: 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c  f is not.** NULL
cb50: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
cb60: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 68 61 73  memory space has
cb70: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
cb80: 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 61 74  located and that
cb90: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
cba0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 61 6c 6c 6f   should not allo
cbb0: 63 61 74 65 20 61 6e 79 20 6e 65 77 20 6d 65 6d  cate any new mem
cbc0: 6f 72 79 2e 20 20 57 68 65 6e 20 70 42 75 66 20  ory.  When pBuf 
cbd0: 69 73 20 6e 6f 74 0a 2a 2a 20 4e 55 4c 4c 20 73  is not.** NULL s
cbe0: 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 70 42 75  imply return pBu
cbf0: 66 2e 20 20 4f 6e 6c 79 20 61 6c 6c 6f 63 61 74  f.  Only allocat
cc00: 65 20 6e 65 77 20 6d 65 6d 6f 72 79 20 73 70 61  e new memory spa
cc10: 63 65 20 77 68 65 6e 20 70 42 75 66 0a 2a 2a 20  ce when pBuf.** 
cc20: 69 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 6e  is NULL..**.** n
cc30: 42 79 74 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Byte is the numb
cc40: 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
cc50: 70 61 63 65 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  pace needed..**.
cc60: 2a 2a 20 70 46 72 6f 6d 20 70 6f 69 6e 74 73 20  ** pFrom points 
cc70: 74 6f 20 2a 70 6e 46 72 6f 6d 20 62 79 74 65 73  to *pnFrom bytes
cc80: 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 73 70   of available sp
cc90: 61 63 65 2e 20 20 4e 65 77 20 73 70 61 63 65 20  ace.  New space 
cca0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  is allocated.** 
ccb0: 66 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20  from the end of 
ccc0: 74 68 65 20 70 46 72 6f 6d 20 62 75 66 66 65 72  the pFrom buffer
ccd0: 20 61 6e 64 20 2a 70 6e 46 72 6f 6d 20 69 73 20   and *pnFrom is 
cce0: 64 65 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a  decremented..**.
ccf0: 2a 2a 20 2a 70 6e 4e 65 65 64 65 64 20 69 73 20  ** *pnNeeded is 
cd00: 61 20 63 6f 75 6e 74 65 72 20 6f 66 20 74 68 65  a counter of the
cd10: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
cd20: 20 6f 66 20 73 70 61 63 65 20 74 68 61 74 20 68   of space that h
cd30: 61 76 65 20 66 61 69 6c 65 64 0a 2a 2a 20 74 6f  ave failed.** to
cd40: 20 61 6c 6c 6f 63 61 74 65 2e 20 20 49 66 20 74   allocate.  If t
cd50: 68 65 72 65 20 69 73 20 69 6e 73 75 66 66 69 63  here is insuffic
cd60: 69 65 6e 74 20 73 70 61 63 65 20 69 6e 20 70 46  ient space in pF
cd70: 72 6f 6d 20 74 6f 20 73 61 74 69 73 66 79 20 74  rom to satisfy t
cd80: 68 65 0a 2a 2a 20 72 65 71 75 65 73 74 2c 20 74  he.** request, t
cd90: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  hen increment *p
cda0: 6e 4e 65 65 64 65 64 20 62 79 20 74 68 65 20 61  nNeeded by the a
cdb0: 6d 6f 75 6e 74 20 6f 66 20 74 68 65 20 72 65 71  mount of the req
cdc0: 75 65 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uest..*/.static 
cdd0: 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70 61 63 65  void *allocSpace
cde0: 28 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  (.  void *pBuf, 
cdf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
ce00: 65 20 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72  e return pointer
ce10: 20 77 69 6c 6c 20 62 65 20 73 74 6f 72 65 64 20   will be stored 
ce20: 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20  */.  int nByte, 
ce30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
ce40: 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20  ber of bytes to 
ce50: 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 20 20 75 38  allocate */.  u8
ce60: 20 2a 70 46 72 6f 6d 2c 20 20 20 20 20 20 20 20   *pFrom,        
ce70: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61     /* Memory ava
ce80: 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63  ilable for alloc
ce90: 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 2a  ation */.  int *
cea0: 70 6e 46 72 6f 6d 2c 20 20 20 20 20 20 20 20 20  pnFrom,         
ceb0: 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 70 61 63 65  /* IN/OUT: Space
cec0: 20 61 76 61 69 6c 61 62 6c 65 20 61 74 20 70 46   available at pF
ced0: 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  rom */.  int *pn
cee0: 4e 65 65 64 65 64 20 20 20 20 20 20 20 20 2f 2a  Needed        /*
cef0: 20 49 66 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63   If allocation c
cf00: 61 6e 6e 6f 74 20 62 65 20 6d 61 64 65 2c 20 69  annot be made, i
cf10: 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65  ncrement *pnByte
cf20: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
cf30: 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
cf40: 4e 4d 45 4e 54 28 70 46 72 6f 6d 29 20 29 3b 0a  NMENT(pFrom) );.
cf50: 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b    if( pBuf==0 ){
cf60: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 52 4f 55  .    nByte = ROU
cf70: 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 20 20  ND8(nByte);.    
cf80: 69 66 28 20 6e 42 79 74 65 20 3c 3d 20 2a 70 6e  if( nByte <= *pn
cf90: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 2a 70  From ){.      *p
cfa0: 6e 46 72 6f 6d 20 2d 3d 20 6e 42 79 74 65 3b 0a  nFrom -= nByte;.
cfb0: 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 46        pBuf = &pF
cfc0: 72 6f 6d 5b 2a 70 6e 46 72 6f 6d 5d 3b 0a 20 20  rom[*pnFrom];.  
cfd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
cfe0: 70 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  pnNeeded += nByt
cff0: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
d000: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
d010: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
d020: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
d030: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
d040: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
d050: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
d060: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
d070: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
d080: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
d090: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
d0a0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
d0b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
d0c0: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
d0d0: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
d0e0: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
d0f0: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
d100: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
d110: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
d120: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
d130: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
d140: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
d150: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d160: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
d170: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
d180: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
d190: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
d1a0: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
d1b0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
d1c0: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
d1d0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
d1e0: 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e    for(i=1; i<p->
d1f0: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
d200: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
d210: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
d220: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
d230: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
d240: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
d250: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
d260: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
d270: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
d280: 49 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68  IC_RUN;.  p->nCh
d290: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
d2a0: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
d2b0: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
d2c0: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
d2d0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
d2e0: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
d2f0: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
d300: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
d310: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
d320: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
d330: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
d340: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
d350: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
d360: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
d370: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
d380: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
d390: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
d3a0: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
d3b0: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
d3c0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
d3d0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
d3e0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
d3f0: 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73  allocating regis
d400: 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  ters and initial
d410: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
d420: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
d430: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
d440: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
d450: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
d460: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
d470: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
d480: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
d490: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
d4a0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
d4b0: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f  d exactly once o
d4c0: 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d  n each virtual m
d4d0: 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72  achine..** After
d4e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
d4f0: 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68   called the VM h
d500: 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65  as been "package
d510: 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a  d" and is ready.
d520: 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65  ** to run.  Afte
d530: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
d540: 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65  s called, furthe
d550: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
d560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d570: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
d580: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
d590: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
d5a0: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
d5b0: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
d5c0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
d5d0: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
d5e0: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
d5f0: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
d600: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
d610: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
d620: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
d630: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
d640: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
d650: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
d660: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
d670: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
d680: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
d690: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
d6a0: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
d6b0: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
d6c0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
d6d0: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
d6e0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
d6f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
d700: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
d710: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
d720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
d730: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
d740: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
d750: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
d760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
d770: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
d780: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
d790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7a0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d7b0: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
d7c0: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
d7f0: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
d800: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
d810: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
d820: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d830: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
d840: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
d850: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
d860: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
d870: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
d880: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
d890: 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20  .  int nOnce;   
d8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
d8c0: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
d8d0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ons */.  int n; 
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
d900: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
d910: 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20   nFree;         
d920: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d930: 76 61 69 6c 61 62 6c 65 20 66 72 65 65 20 73 70  vailable free sp
d940: 61 63 65 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ace */.  u8 *zCs
d950: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
d960: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
d970: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
d980: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
d990: 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
d9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d9b0: 2a 20 48 6f 77 20 6d 75 63 68 20 65 78 74 72 61  * How much extra
d9c0: 20 6d 65 6d 6f 72 79 20 69 73 20 6e 65 65 64 65   memory is neede
d9d0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
d9e0: 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  p!=0 );.  assert
d9f0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
da00: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 21 3d  assert( pParse!=
da10: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
da20: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
da30: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73  GIC_INIT );.  as
da40: 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 2d  sert( pParse==p-
da50: 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64 62 20  >pParse );.  db 
da60: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
da70: 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  t( db->mallocFai
da80: 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56 61 72  led==0 );.  nVar
da90: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b   = pParse->nVar;
daa0: 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72 73 65  .  nMem = pParse
dab0: 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72 73 6f  ->nMem;.  nCurso
dac0: 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  r = pParse->nTab
dad0: 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61 72 73  ;.  nArg = pPars
dae0: 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20 6e 4f  e->nMaxArg;.  nO
daf0: 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4f  nce = pParse->nO
db00: 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e 63 65  nce;.  if( nOnce
db10: 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20 31 3b  ==0 ) nOnce = 1;
db20: 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20 6c 65   /* Ensure at le
db30: 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69 6e 20  ast one byte in 
db40: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d 20 2a  p->aOnceFlag[] *
db50: 2f 0a 20 20 0a 20 20 2f 2a 20 46 6f 72 20 65 61  /.  .  /* For ea
db60: 63 68 20 63 75 72 73 6f 72 20 72 65 71 75 69 72  ch cursor requir
db70: 65 64 2c 20 61 6c 73 6f 20 61 6c 6c 6f 63 61 74  ed, also allocat
db80: 65 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e  e a memory cell.
db90: 20 4d 65 6d 6f 72 79 0a 20 20 2a 2a 20 63 65 6c   Memory.  ** cel
dba0: 6c 73 20 28 6e 4d 65 6d 2b 31 2d 6e 43 75 72 73  ls (nMem+1-nCurs
dbb0: 6f 72 29 2e 2e 6e 4d 65 6d 2c 20 69 6e 63 6c 75  or)..nMem, inclu
dbc0: 73 69 76 65 2c 20 77 69 6c 6c 20 6e 65 76 65 72  sive, will never
dbd0: 20 62 65 20 75 73 65 64 20 62 79 0a 20 20 2a 2a   be used by.  **
dbe0: 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72 61   the vdbe progra
dbf0: 6d 2e 20 49 6e 73 74 65 61 64 20 74 68 65 79 20  m. Instead they 
dc00: 61 72 65 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f  are used to allo
dc10: 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 0a 20  cate space for. 
dc20: 20 2a 2a 20 56 64 62 65 43 75 72 73 6f 72 2f 42   ** VdbeCursor/B
dc30: 74 43 75 72 73 6f 72 20 73 74 72 75 63 74 75 72  tCursor structur
dc40: 65 73 2e 20 54 68 65 20 62 6c 6f 62 20 6f 66 20  es. The blob of 
dc50: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
dc60: 64 20 77 69 74 68 20 0a 20 20 2a 2a 20 63 75 72  d with .  ** cur
dc70: 73 6f 72 20 30 20 69 73 20 73 74 6f 72 65 64 20  sor 0 is stored 
dc80: 69 6e 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 6e  in memory cell n
dc90: 4d 65 6d 2e 20 4d 65 6d 6f 72 79 20 63 65 6c 6c  Mem. Memory cell
dca0: 20 28 6e 4d 65 6d 2d 31 29 0a 20 20 2a 2a 20 73   (nMem-1).  ** s
dcb0: 74 6f 72 65 73 20 74 68 65 20 62 6c 6f 62 20 6f  tores the blob o
dcc0: 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
dcd0: 74 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20  ted with cursor 
dce0: 31 2c 20 65 74 63 2e 0a 20 20 2a 2a 0a 20 20 2a  1, etc..  **.  *
dcf0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61 6c 6c 6f  * See also: allo
dd00: 63 61 74 65 43 75 72 73 6f 72 28 29 2e 0a 20 20  cateCursor()..  
dd10: 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20 6e 43 75  */.  nMem += nCu
dd20: 72 73 6f 72 3b 0a 0a 20 20 2f 2a 20 7a 43 73 72  rsor;..  /* zCsr
dd30: 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c 6c 79 20   will initially 
dd40: 70 6f 69 6e 74 20 74 6f 20 6e 46 72 65 65 20 62  point to nFree b
dd50: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73  ytes of unused s
dd60: 70 61 63 65 20 61 74 20 74 68 65 0a 20 20 2a 2a  pace at the.  **
dd70: 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f   end of the opco
dd80: 64 65 20 61 72 72 61 79 2c 20 70 2d 3e 61 4f 70  de array, p->aOp
dd90: 2e 20 20 54 68 65 20 63 6f 6d 70 75 74 61 74 69  .  The computati
dda0: 6f 6e 20 6f 66 20 6e 46 72 65 65 20 69 73 0a 20  on of nFree is. 
ddb0: 20 2a 2a 20 63 6f 6e 73 65 72 76 61 74 69 76 65   ** conservative
ddc0: 20 2d 20 69 74 20 6d 69 67 68 74 20 62 65 20 73   - it might be s
ddd0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
dde0: 74 72 75 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  true number of f
ddf0: 72 65 65 0a 20 20 2a 2a 20 62 79 74 65 73 2c 20  ree.  ** bytes, 
de00: 62 75 74 20 6e 65 76 65 72 20 6c 61 72 67 65 72  but never larger
de10: 2e 20 20 6e 46 72 65 65 20 6d 75 73 74 20 62 65  .  nFree must be
de20: 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38   a multiple of 8
de30: 20 2d 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 6f   - it is.  ** ro
de40: 75 6e 64 65 64 20 64 6f 77 6e 20 69 66 20 69 73  unded down if is
de50: 20 6e 6f 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d   not..  */.  n =
de60: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f   ROUND8(sizeof(O
de70: 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20  p)*p->nOp);     
de80: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
de90: 73 20 6f 66 20 6f 70 63 6f 64 65 20 73 70 61 63  s of opcode spac
dea0: 65 20 75 73 65 64 20 2a 2f 0a 20 20 7a 43 73 72  e used */.  zCsr
deb0: 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70   = &((u8*)p->aOp
dec0: 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20 20  )[n];           
ded0: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
dee0: 64 20 6f 70 63 6f 64 65 20 73 70 61 63 65 20 2a  d opcode space *
def0: 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  /.  assert( EIGH
df00: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
df10: 28 7a 43 73 72 29 20 29 3b 0a 20 20 6e 46 72 65  (zCsr) );.  nFre
df20: 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70  e = ROUNDDOWN8(p
df30: 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  Parse->szOpAlloc
df40: 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73   - n);  /* Bytes
df50: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
df60: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 46   */.  assert( nF
df70: 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  ree>=0 );.  if( 
df80: 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 6d  nFree>0 ){.    m
df90: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 6e  emset(zCsr, 0, n
dfa0: 46 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Free);.    asser
dfb0: 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c  t( EIGHT_BYTE_AL
dfc0: 49 47 4e 4d 45 4e 54 28 26 7a 43 73 72 5b 6e 46  IGNMENT(&zCsr[nF
dfd0: 72 65 65 5d 29 20 29 3b 0a 20 20 7d 0a 0a 20 20  ree]) );.  }..  
dfe0: 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28  resolveP2Values(
dff0: 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d 3e  p, &nArg);.  p->
e000: 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20  usesStmtJournal 
e010: 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e 69  = (u8)(pParse->i
e020: 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20 70  sMultiWrite && p
e030: 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29  Parse->mayAbort)
e040: 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e  ;.  if( pParse->
e050: 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d 3c  explain && nMem<
e060: 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20 3d  10 ){.    nMem =
e070: 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65 78   10;.  }.  p->ex
e080: 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  pired = 0;..  /*
e090: 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69   Memory for regi
e0a0: 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72  sters, parameter
e0b0: 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20  s, cursor, etc, 
e0c0: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20  is allocated in 
e0d0: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
e0e0: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
e0f0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
e100: 65 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63  euse unused spac
e110: 65 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  e at the .  ** e
e120: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
e130: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
e140: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
e150: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
e160: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
e170: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
e180: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
e190: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
e1a0: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
e1b0: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
e1c0: 65 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73  est using a fres
e1d0: 68 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a  h allocation.  .
e1e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74    **.  ** This t
e1f0: 77 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68  wo-pass approach
e200: 20 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20   that reuses as 
e210: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70  much memory as p
e220: 6f 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a  ossible from.  *
e230: 2a 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73  * the leftover s
e240: 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
e250: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
e260: 72 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63  ray can signific
e270: 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63  antly.  ** reduc
e280: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
e290: 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61  memory held by a
e2a0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e2b0: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b  ent..  */.  do {
e2c0: 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a  .    nByte = 0;.
e2d0: 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c      p->aMem = al
e2e0: 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d  locSpace(p->aMem
e2f0: 2c 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65  , nMem*sizeof(Me
e300: 6d 29 2c 20 7a 43 73 72 2c 20 26 6e 46 72 65 65  m), zCsr, &nFree
e310: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
e320: 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70  ->aVar = allocSp
e330: 61 63 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61  ace(p->aVar, nVa
e340: 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 7a  r*sizeof(Mem), z
e350: 43 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42  Csr, &nFree, &nB
e360: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41  yte);.    p->apA
e370: 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  rg = allocSpace(
e380: 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a 73  p->apArg, nArg*s
e390: 69 7a 65 6f 66 28 4d 65 6d 2a 29 2c 20 7a 43 73  izeof(Mem*), zCs
e3a0: 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74  r, &nFree, &nByt
e3b0: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 7a 56 61 72  e);.    p->azVar
e3c0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d   = allocSpace(p-
e3d0: 3e 61 7a 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  >azVar, nVar*siz
e3e0: 65 6f 66 28 63 68 61 72 2a 29 2c 20 7a 43 73 72  eof(char*), zCsr
e3f0: 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79 74 65  , &nFree, &nByte
e400: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
e410: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
e420: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
e430: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
e440: 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  *),.            
e450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
e460: 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79  sr, &nFree, &nBy
e470: 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 6e 63  te);.    p->aOnc
e480: 65 46 6c 61 67 20 3d 20 61 6c 6c 6f 63 53 70 61  eFlag = allocSpa
e490: 63 65 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c  ce(p->aOnceFlag,
e4a0: 20 6e 4f 6e 63 65 2c 20 7a 43 73 72 2c 20 26 6e   nOnce, zCsr, &n
e4b0: 46 72 65 65 2c 20 26 6e 42 79 74 65 29 3b 0a 23  Free, &nByte);.#
e4c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
e4d0: 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
e4e0: 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65  TUS.    p->anExe
e4f0: 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  c = allocSpace(p
e500: 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e 4f 70  ->anExec, p->nOp
e510: 2a 73 69 7a 65 6f 66 28 69 36 34 29 2c 20 7a 43  *sizeof(i64), zC
e520: 73 72 2c 20 26 6e 46 72 65 65 2c 20 26 6e 42 79  sr, &nFree, &nBy
e530: 74 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  te);.#endif.    
e540: 69 66 28 20 6e 42 79 74 65 20 29 7b 0a 20 20 20  if( nByte ){.   
e550: 20 20 20 70 2d 3e 70 46 72 65 65 20 3d 20 73 71     p->pFree = sq
e560: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
e570: 6f 28 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  o(db, nByte);.  
e580: 20 20 7d 0a 20 20 20 20 7a 43 73 72 20 3d 20 70    }.    zCsr = p
e590: 2d 3e 70 46 72 65 65 3b 0a 20 20 20 20 6e 46 72  ->pFree;.    nFr
e5a0: 65 65 20 3d 20 6e 42 79 74 65 3b 0a 20 20 7d 77  ee = nByte;.  }w
e5b0: 68 69 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21  hile( nByte && !
e5c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e5d0: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f   );..  p->nCurso
e5e0: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70  r = nCursor;.  p
e5f0: 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f  ->nOnceFlag = nO
e600: 6e 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  nce;.  if( p->aV
e610: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
e620: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
e630: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
e640: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
e650: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
e660: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
e670: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
e680: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
e690: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61   }.  if( p->azVa
e6a0: 72 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56  r && pParse->nzV
e6b0: 61 72 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  ar>0 ){.    p->n
e6c0: 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  zVar = pParse->n
e6d0: 7a 56 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79  zVar;.    memcpy
e6e0: 28 70 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73  (p->azVar, pPars
e6f0: 65 2d 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56  e->azVar, p->nzV
e700: 61 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56  ar*sizeof(p->azV
e710: 61 72 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d  ar[0]));.    mem
e720: 73 65 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61  set(pParse->azVa
e730: 72 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a  r, 0, pParse->nz
e740: 56 61 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73  Var*sizeof(pPars
e750: 65 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20  e->azVar[0]));. 
e760: 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d   }.  if( p->aMem
e770: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d   ){.    p->aMem-
e780: 2d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  -;              
e790: 20 20 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b          /* aMem[
e7a0: 5d 20 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e  ] goes from 1..n
e7b0: 4d 65 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d  Mem */.    p->nM
e7c0: 65 6d 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20  em = nMem;      
e7d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20             /*   
e7e0: 20 20 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e      not from 0..
e7f0: 6e 4d 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f  nMem-1 */.    fo
e800: 72 28 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20  r(n=1; n<=nMem; 
e810: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
e820: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
e830: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
e840: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
e850: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
e860: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
e870: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
e880: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
e890: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
e8a0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
e8b0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
e8c0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
e8d0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
e8e0: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
e8f0: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
e900: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
e910: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
e920: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
e930: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
e940: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
e950: 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42   assert( pCx->pB
e960: 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75  t==0 || pCx->eCu
e970: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
e980: 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68  TREE );.  switch
e990: 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20  ( pCx->eCurType 
e9a0: 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  ){.    case CURT
e9b0: 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20  YPE_SORTER: {.  
e9c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
e9d0: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
e9e0: 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72  , pCx);.      br
e9f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ea00: 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45  ase CURTYPE_BTRE
ea10: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
ea20: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Cx->pBt ){.     
ea30: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ea40: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
ea50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ea60: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
ea70: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
ea80: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
ea90: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20  xists, by.      
eaa0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
eab0: 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65  ove. */.      }e
eac0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
ead0: 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75  ert( pCx->uc.pCu
eae0: 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rsor!=0 );.     
eaf0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
eb00: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
eb10: 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
eb20: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
eb30: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
eb40: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
eb50: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
eb60: 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20  e CURTYPE_VTAB: 
eb70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
eb80: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43  vtab_cursor *pVC
eb90: 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43  ur = pCx->uc.pVC
eba0: 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ur;.      const 
ebb0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
ebc0: 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d  pModule = pVCur-
ebd0: 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
ebe0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ebf0: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
ec00: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43  f>0 );.      pVC
ec10: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d  ur->pVtab->nRef-
ec20: 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65  -;.      pModule
ec30: 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b  ->xClose(pVCur);
ec40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ec50: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
ec60: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
ec70: 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  l cursors in the
ec80: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a   current frame..
ec90: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
eca0: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
ecb0: 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  me(Vdbe *p){.  i
ecc0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
ecd0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
ece0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
ecf0: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
ed00: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
ed10: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
ed20: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
ed30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ed40: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
ed50: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
ed60: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
ed70: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ed80: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
ed90: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
eda0: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
edb0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
edc0: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
edd0: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
ede0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
edf0: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
ee00: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
ee10: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
ee20: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
ee30: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
ee40: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
ee50: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
ee60: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
ee70: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
ee80: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
ee90: 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66  Frame(v);.#ifdef
eea0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
eeb0: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
eec0: 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72   v->anExec = pFr
eed0: 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e  ame->anExec;.#en
eee0: 64 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c  dif.  v->aOnceFl
eef0: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e  ag = pFrame->aOn
ef00: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e  ceFlag;.  v->nOn
ef10: 63 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d  ceFlag = pFrame-
ef20: 3e 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d  >nOnceFlag;.  v-
ef30: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
ef40: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
ef50: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
ef60: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
ef70: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
ef80: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
ef90: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
efa0: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
efb0: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
efc0: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
efd0: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
efe0: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
eff0: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
f000: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
f010: 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
f020: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
f030: 44 62 43 68 61 6e 67 65 3b 0a 20 20 72 65 74 75  DbChange;.  retu
f040: 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d  rn pFrame->pc;.}
f050: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
f060: 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a  l cursors..**.**
f070: 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e   Also release an
f080: 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79  y dynamic memory
f090: 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20   held by the VM 
f0a0: 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d  in the Vdbe.aMem
f0b0: 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c   memory .** cell
f0c0: 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73 20   array. This is 
f0d0: 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68 65  necessary as the
f0e0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72   memory cell arr
f0f0: 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a  ay may contain.*
f100: 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64  * pointers to Vd
f110: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c  beFrame objects,
f120: 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75   which may in tu
f130: 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74  rn contain point
f140: 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63  ers to.** open c
f150: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  ursors..*/.stati
f160: 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43  c void closeAllC
f170: 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b  ursors(Vdbe *p){
f180: 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65  .  if( p->pFrame
f190: 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d   ){.    VdbeFram
f1a0: 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66  e *pFrame;.    f
f1b0: 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72  or(pFrame=p->pFr
f1c0: 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61  ame; pFrame->pPa
f1d0: 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72  rent; pFrame=pFr
f1e0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20  ame->pParent);. 
f1f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
f200: 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d  ameRestore(pFram
f210: 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d  e);.    p->pFram
f220: 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46  e = 0;.    p->nF
f230: 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  rame = 0;.  }.  
f240: 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d  assert( p->nFram
f250: 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43  e==0 );.  closeC
f260: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29  ursorsInFrame(p)
f270: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
f280: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65  ){.    releaseMe
f290: 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65 6d 5b  mArray(&p->aMem[
f2a0: 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20  1], p->nMem);.  
f2b0: 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44  }.  while( p->pD
f2c0: 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56  elFrame ){.    V
f2d0: 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d  dbeFrame *pDel =
f2e0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20   p->pDelFrame;. 
f2f0: 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20     p->pDelFrame 
f300: 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b  = pDel->pParent;
f310: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f320: 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c  FrameDelete(pDel
f330: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c  );.  }..  /* Del
f340: 65 74 65 20 61 6e 79 20 61 75 78 64 61 74 61 20  ete any auxdata 
f350: 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65  allocations made
f360: 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20   by the VM */.  
f370: 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20  if( p->pAuxData 
f380: 29 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  ) sqlite3VdbeDel
f390: 65 74 65 41 75 78 44 61 74 61 28 70 2c 20 2d 31  eteAuxData(p, -1
f3a0: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
f3b0: 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
f3c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
f3d0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
f3e0: 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a   a single run..*
f3f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
f400: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
f410: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f420: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
f430: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
f440: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
f450: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
f460: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
f470: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
f480: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
f490: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
f4a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
f4b0: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
f4c0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
f4d0: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
f4e0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
f4f0: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
f500: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
f510: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
f520: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70 2d 3e   for(i=1; i<=p->
f530: 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72  nMem; i++) asser
f540: 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c  t( p->aMem[i].fl
f550: 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e  ags==MEM_Undefin
f560: 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ed );.  }.#endif
f570: 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ..  sqlite3DbFre
f580: 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
f590: 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  );.  p->zErrMsg 
f5a0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c  = 0;.  p->pResul
f5b0: 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  tSet = 0;.}../*.
f5c0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65  ** Set the numbe
f5d0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
f5e0: 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65  mns that will be
f5f0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
f600: 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65  s SQL.** stateme
f610: 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20  nt. This is now 
f620: 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  set at compile t
f630: 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e  ime, rather than
f640: 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75   during.** execu
f650: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65  tion of the vdbe
f660: 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74   program so that
f670: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
f680: 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62  count() can.** b
f690: 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53  e called on an S
f6a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66  QL statement bef
f6b0: 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ore sqlite3_step
f6c0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
f6d0: 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c  te3VdbeSetNumCol
f6e0: 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  s(Vdbe *p, int n
f6f0: 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65  ResColumn){.  Me
f700: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69  m *pColName;.  i
f710: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20  nt n;.  sqlite3 
f720: 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  *db = p->db;..  
f730: 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
f740: 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
f750: 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
f760: 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33  ME_N);.  sqlite3
f770: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43  DbFree(db, p->aC
f780: 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e  olName);.  n = n
f790: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f7a0: 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f  E_N;.  p->nResCo
f7b0: 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73  lumn = (u16)nRes
f7c0: 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f  Column;.  p->aCo
f7d0: 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65  lName = pColName
f7e0: 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33   = (Mem*)sqlite3
f7f0: 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c  DbMallocZero(db,
f800: 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29   sizeof(Mem)*n )
f810: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e  ;.  if( p->aColN
f820: 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ame==0 ) return;
f830: 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20  .  while( n-- > 
f840: 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  0 ){.    pColNam
f850: 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  e->flags = MEM_N
f860: 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d  ull;.    pColNam
f870: 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  e->db = p->db;. 
f880: 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20     pColName++;. 
f890: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
f8a0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
f8b0: 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f  idx'th column to
f8c0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
f8d0: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
f8e0: 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74  t..** zName must
f8f0: 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   be a pointer to
f900: 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65   a nul terminate
f910: 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  d string..**.** 
f920: 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62  This call must b
f930: 65 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63  e made after a c
f940: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64  all to sqlite3Vd
f950: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a  beSetNumCols()..
f960: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20  **.** The final 
f970: 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c  parameter, xDel,
f980: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
f990: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20  SQLITE_DYNAMIC, 
f9a0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a  SQLITE_STATIC.**
f9b0: 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53   or SQLITE_TRANS
f9c0: 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53  IENT. If it is S
f9d0: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74  QLITE_DYNAMIC, t
f9e0: 68 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70  hen the buffer p
f9f0: 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20  ointed.** to by 
fa00: 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72  zName will be fr
fa10: 65 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62  eed by sqlite3Db
fa20: 46 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20  Free() when the 
fa30: 76 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65  vdbe is destroye
fa40: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
fa50: 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28  3VdbeSetColName(
fa60: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa80: 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e      /* Vdbe bein
fa90: 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a  g configured */.
faa0: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
fab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fac0: 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63     /* Index of c
fad0: 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c  olumn zName appl
fae0: 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20  ies to */.  int 
faf0: 76 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  var,            
fb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fb10: 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41  One of the COLNA
fb20: 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a  ME_* constants *
fb30: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
fb40: 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20  zName,          
fb50: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
fb60: 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69  to buffer contai
fb70: 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76  ning name */.  v
fb80: 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64  oid (*xDel)(void
fb90: 2a 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *)              
fba0: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  /* Memory manage
fbb0: 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f  ment strategy fo
fbc0: 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20  r zName */.){.  
fbd0: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70  int rc;.  Mem *p
fbe0: 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72  ColName;.  asser
fbf0: 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f  t( idx<p->nResCo
fc00: 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74  lumn );.  assert
fc10: 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20  ( var<COLNAME_N 
fc20: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e  );.  if( p->db->
fc30: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
fc40: 20 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61      assert( !zNa
fc50: 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49  me || xDel!=SQLI
fc60: 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20  TE_DYNAMIC );.  
fc70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fc80: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61 73 73  NOMEM;.  }.  ass
fc90: 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
fca0: 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
fcb0: 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
fcc0: 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
fcd0: 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
fce0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
fcf0: 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
fd00: 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
fd10: 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
fd20: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
fd30: 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
fd40: 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
fd50: 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
fd60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
fd70: 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
fd80: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
fd90: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
fda0: 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
fdb0: 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
fdc0: 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
fdd0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
fde0: 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
fdf0: 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
fe00: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
fe10: 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
fe20: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
fe30: 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
fe40: 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
fe50: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
fe60: 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
fe70: 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
fe80: 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
fe90: 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
fea0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
feb0: 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
fec0: 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
fed0: 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
fee0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
fef0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
ff00: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
ff10: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30   needXcommit = 0
ff20: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
ff30: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
ff40: 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69  LE.  /* With thi
ff50: 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65  s option, sqlite
ff60: 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20 64  3VtabSync() is d
ff70: 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d  efined to be sim
ff80: 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45  ply .  ** SQLITE
ff90: 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20  _OK so p is not 
ffa0: 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e  used. .  */.  UN
ffb0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
ffc0: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
ffd0: 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79  Before doing any
ffe0: 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c  thing else, call
fff0: 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c   the xSync() cal
10000 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20  lback for any.  
10010 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c  ** virtual modul
10020 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e  e tables written
10030 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63   in this transac
10040 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74  tion. This has t
10050 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62  o.  ** be done b
10060 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e  efore determinin
10070 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73 74  g whether a mast
10080 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10090 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65  is .  ** require
100a0 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29  d, as an xSync()
100b0 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64   callback may ad
100c0 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64 61  d an attached da
100d0 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74  tabase.  ** to t
100e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
100f0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
10100 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20  te3VtabSync(db, 
10110 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c  p);..  /* This l
10120 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28  oop determines (
10130 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74  a) if the commit
10140 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20   hook should be 
10150 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a  invoked and.  **
10160 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61   (b) how many da
10170 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61 76  tabase files hav
10180 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61  e open write tra
10190 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a  nsactions, not .
101a0 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74    ** including t
101b0 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73 65  he temp database
101c0 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61  . (b) is importa
101d0 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f  nt because if mo
101e0 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e  re than .  ** on
101f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
10200 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74  has an open writ
10210 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
10220 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10230 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71    ** file is req
10240 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f  uired for an ato
10250 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f  mic commit..  */
10260 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d   .  for(i=0; rc=
10270 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
10280 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
10290 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
102a0 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
102b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
102c0 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
102d0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e 65 65  Bt) ){.      nee
102e0 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  dXcommit = 1;.  
102f0 20 20 20 20 69 66 28 20 69 21 3d 31 20 29 20 6e      if( i!=1 ) n
10300 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 73  Trans++;.      s
10310 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
10320 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72 63 20  (pBt);.      rc 
10330 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 45 78  = sqlite3PagerEx
10340 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71 6c 69  clusiveLock(sqli
10350 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
10360 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t));.      sqlit
10370 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
10380 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
10390 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
103a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
103b0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  c;.  }..  /* If 
103c0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 77 72  there are any wr
103d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 73  ite-transactions
103e0 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20   at all, invoke 
103f0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
10400 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58 63 6f  */.  if( needXco
10410 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43 6f 6d  mmit && db->xCom
10420 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  mitCallback ){. 
10430 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43 6f 6d     rc = db->xCom
10440 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  mitCallback(db->
10450 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20 20 20  pCommitArg);.   
10460 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
10470 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
10480 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
10490 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  HOOK;.    }.  }.
104a0 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70 6c 65  .  /* The simple
104b0 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72 65 20   case - no more 
104c0 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73  than one databas
104d0 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f 75 6e  e file (not coun
104e0 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 54 45  ting the.  ** TE
104f0 4d 50 20 64 61 74 61 62 61 73 65 29 20 68 61 73  MP database) has
10500 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61   a transaction a
10510 63 74 69 76 65 2e 20 20 20 54 68 65 72 65 20 69  ctive.   There i
10520 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 74 68  s no need for th
10530 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f  e.  ** master-jo
10540 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  urnal..  **.  **
10550 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20 76   If the return v
10560 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65 33 42  alue of sqlite3B
10570 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
10580 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65 6e 67  ) is a zero leng
10590 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67 2c 20  th.  ** string, 
105a0 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d 61 69  it means the mai
105b0 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 3a 6d  n database is :m
105c0 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65 6d 70  emory: or a temp
105d0 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20 2a 2a   file.  In .  **
105e0 20 74 68 61 74 20 63 61 73 65 20 77 65 20 64 6f   that case we do
105f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61 74 6f   not support ato
10600 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65 20 63  mic multi-file c
10610 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65 20 74  ommits, so use t
10620 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c 65 20  he .  ** simple 
10630 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e 0a 20  case then too.. 
10640 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 71 6c   */.  if( 0==sql
10650 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73 71 6c  ite3Strlen30(sql
10660 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65  ite3BtreeGetFile
10670 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  name(db->aDb[0].
10680 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54 72 61  pBt)).   || nTra
10690 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20 20 66  ns<=1.  ){.    f
106a0 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  or(i=0; rc==SQLI
106b0 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e  TE_OK && i<db->n
106c0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
106d0 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
106e0 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
106f0 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
10700 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10710 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
10720 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b 0a 20  seOne(pBt, 0);. 
10730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
10740 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 6d    /* Do the comm
10750 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c 20 64  it only if all d
10760 61 74 61 62 61 73 65 73 20 73 75 63 63 65 73 73  atabases success
10770 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65 20 70  fully complete p
10780 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a 2a 20  hase 1. .    ** 
10790 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 42 74  If one of the Bt
107a0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
107b0 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c 73 2c  e() calls fails,
107c0 20 74 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   this indicates 
107d0 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65 72 72  an.    ** IO err
107e0 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74 69 6e  or while deletin
107f0 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20  g or truncating 
10800 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  a journal file. 
10810 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a  It is unlikely,.
10820 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75 6c 64      ** but could
10830 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68 69 73   happen. In this
10840 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20 70 72   case abandon pr
10850 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72 65 74  ocessing and ret
10860 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e 0a 20  urn the error.. 
10870 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
10880 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
10890 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
108a0 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
108b0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
108c0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
108d0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
108e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
108f0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
10900 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
10910 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
10920 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10930 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 74  .      sqlite3Vt
10940 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
10950 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
10960 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65 20 2d  e complex case -
10970 20 54 68 65 72 65 20 69 73 20 61 20 6d 75 6c 74   There is a mult
10980 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74 72 61  i-file write-tra
10990 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e  nsaction active.
109a0 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71 75 69  .  ** This requi
109b0 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  res a master jou
109c0 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 6e 73  rnal file to ens
109d0 75 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ure the transact
109e0 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d  ion is.  ** comm
109f0 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c 6c 79  itted atomically
10a00 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53  ..  */.#ifndef S
10a10 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
10a20 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20 73 71  O.  else{.    sq
10a30 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
10a40 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 20 20  = db->pVfs;.    
10a50 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30  int needSync = 0
10a60 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
10a70 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69  ter = 0;   /* Fi
10a80 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  le-name for the 
10a90 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a  master journal *
10aa0 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74  /.    char const
10ab0 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71   *zMainFile = sq
10ac0 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
10ad0 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d  ename(db->aDb[0]
10ae0 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  .pBt);.    sqlit
10af0 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72  e3_file *pMaster
10b00 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66   = 0;.    i64 of
10b10 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e  fset = 0;.    in
10b20 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72  t res;.    int r
10b30 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20  etryCount = 0;. 
10b40 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65     int nMainFile
10b50 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74  ;..    /* Select
10b60 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10b70 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20  l file name */. 
10b80 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73     nMainFile = s
10b90 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
10ba0 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a  MainFile);.    z
10bb0 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
10bc0 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d  MPrintf(db, "%s-
10bd0 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a  mjXXXXXX9XXz", z
10be0 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69  MainFile);.    i
10bf0 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20  f( zMaster==0 ) 
10c00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10c10 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a 20 20  MEM;.    do {.  
10c20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f 6d 3b      u32 iRandom;
10c30 0a 20 20 20 20 20 20 69 66 28 20 72 65 74 72 79  .      if( retry
10c40 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  Count ){.       
10c50 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3e   if( retryCount>
10c60 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
10c70 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
10c80 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 64 65  ITE_FULL, "MJ de
10c90 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lete: %s", zMast
10ca0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
10cb0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
10cc0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  Vfs, zMaster, 0)
10cd0 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
10ce0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
10cf0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 3d   if( retryCount=
10d00 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
10d10 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
10d20 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63 6f 6c  TE_FULL, "MJ col
10d30 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61 73 74  lide: %s", zMast
10d40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  er);.        }. 
10d50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
10d60 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20 20 20  ryCount++;.     
10d70 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
10d80 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61 6e 64  ess(sizeof(iRand
10d90 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29 3b 0a  om), &iRandom);.
10da0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
10db0 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d 61 73  printf(13, &zMas
10dc0 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d 2c 20  ter[nMainFile], 
10dd0 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22 2c 0a  "-mj%06X9%02X",.
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
10e00 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78 66 66  iRandom>>8)&0xff
10e10 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26 30 78  ffff, iRandom&0x
10e20 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  ff);.      /* Th
10e30 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d 61 74  e antipenultimat
10e40 65 20 63 68 61 72 61 63 74 65 72 20 6f 66 20 74  e character of t
10e50 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10e60 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20 20 20  l name must.    
10e70 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f 20 61    ** be "9" to a
10e80 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c 69 73  void name collis
10e90 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e 67 20  ions when using 
10ea0 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e 20 2a  8+3 filenames. *
10eb0 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
10ec0 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65 33 53  zMaster[sqlite3S
10ed0 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65 72 29  trlen30(zMaster)
10ee0 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20 20 20  -3]=='9' );.    
10ef0 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66    sqlite3FileSuf
10f00 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65 2c 20  fix3(zMainFile, 
10f10 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10f20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63  rc = sqlite3OsAc
10f30 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61 73 74  cess(pVfs, zMast
10f40 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53  er, SQLITE_ACCES
10f50 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73 29 3b  S_EXISTS, &res);
10f60 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
10f70 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 65  =SQLITE_OK && re
10f80 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  s );.    if( rc=
10f90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10fa0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
10fb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20  master journal. 
10fc0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
10fd0 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c 6c 6f  lite3OsOpenMallo
10fe0 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  c(pVfs, zMaster,
10ff0 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20 20 20   &pMaster, .    
11000 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
11010 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
11020 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
11030 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11040 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
11050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
11060 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a 20 20  ER_JOURNAL, 0.  
11070 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20      );.    }.   
11080 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11090 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
110a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
110b0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
110c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
110d0 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68  .    /* Write th
110e0 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68 20 64  e name of each d
110f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
11100 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11110 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20 20 20  into the new.   
11120 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
11130 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e 20 65  al file. If an e
11140 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74 20 74  rror occurs at t
11150 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73 65 0a  his point close.
11160 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c 65 74      ** and delet
11170 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11180 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c 20 74  rnal file. All t
11190 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f  he individual jo
111a0 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20 20 20  urnal files.    
111b0 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20 27 6e  ** still have 'n
111c0 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61 73 74  ull' as the mast
111d0 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74  er journal point
111e0 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69 6c 6c  er, so they will
111f0 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62 61 63   roll.    ** bac
11200 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
11210 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f 63 63  if a failure occ
11220 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  urs..    */.    
11230 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
11240 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Db; i++){.      
11250 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d  Btree *pBt = db-
11260 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
11270 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
11280 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
11290 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ) ){.        cha
112a0 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 20 3d  r const *zFile =
112b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
112c0 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42 74 29  Journalname(pBt)
112d0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46  ;.        if( zF
112e0 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ile==0 ){.      
112f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 20 2f      continue;  /
11300 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20 61 6e  * Ignore TEMP an
11310 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74 61 62  d :memory: datab
11320 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ases */.        
11330 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
11340 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20 29 3b  ( zFile[0]!=0 );
11350 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 6e 65  .        if( !ne
11360 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c 69 74  edSync && !sqlit
11370 65 33 42 74 72 65 65 53 79 6e 63 44 69 73 61 62  e3BtreeSyncDisab
11380 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20 20 20  led(pBt) ){.    
11390 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d        needSync =
113a0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
113b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
113c0 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65  e3OsWrite(pMaste
113d0 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65  r, zFile, sqlite
113e0 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29  3Strlen30(zFile)
113f0 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  +1, offset);.   
11400 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73       offset += s
11410 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11420 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20  File)+1;.       
11430 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11440 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
11450 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72  sqlite3OsCloseFr
11460 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20  ee(pMaster);.   
11470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11480 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11490 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  ster, 0);.      
114a0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
114b0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
114c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
114d0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
114e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
114f0 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61    /* Sync the ma
11500 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11510 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f  e. If the IOCAP_
11520 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63  SEQUENTIAL devic
11530 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73  e.    ** flag is
11540 20 73 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74   set this is not
11550 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
11560 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79  /.    if( needSy
11570 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d 3d 28  nc .     && 0==(
11580 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
11590 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
115a0 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45 5f 49  Master)&SQLITE_I
115b0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
115c0 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54 45 5f  .     && SQLITE_
115d0 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
115e0 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65 72 2c  3OsSync(pMaster,
115f0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
11600 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  MAL)).    ){.   
11610 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
11620 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
11630 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
11640 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11650 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  ter, 0);.      s
11660 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
11670 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11680 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11690 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 61  }..    /* Sync a
116a0 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65 73 20  ll the db files 
116b0 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
116c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 65  transaction. The
116d0 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20 20 2a   same call.    *
116e0 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73 74 65  * sets the maste
116f0 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  r journal pointe
11700 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69 76 69  r in each indivi
11710 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  dual journal. If
11720 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72  .    ** an error
11730 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20 64 6f   occurs here, do
11740 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
11750 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11760 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ile..    **.    
11770 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  ** If the error 
11780 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 68  occurs during th
11790 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 0a  e first call to.
117a0 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 42 74      ** sqlite3Bt
117b0 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
117c0 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72 65 20  e(), then there 
117d0 69 73 20 61 20 63 68 61 6e 63 65 20 74 68 61 74  is a chance that
117e0 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61 73 74   the.    ** mast
117f0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11800 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e 65 64  will be orphaned
11810 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f 74 20  . But we cannot 
11820 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20 20 2a  delete it,.    *
11830 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 6d 61  * in case the ma
11840 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11850 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69 74 74  e name was writt
11860 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
11870 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
11880 62 65 66 6f 72 65 20 74 68 65 20 66 61 69 6c 75  before the failu
11890 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20 20  re occurred..   
118a0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
118b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
118c0 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
118d0 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
118e0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
118f0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11900 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
11910 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11920 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  eCommitPhaseOne(
11930 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  pBt, zMaster);. 
11940 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
11950 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46   sqlite3OsCloseF
11960 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
11970 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
11980 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20 20 20  LITE_BUSY );.   
11990 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
119a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
119b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d  te3DbFree(db, zM
119c0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65  aster);.      re
119d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
119e0 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 74 68      /* Delete th
119f0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11a00 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f 6d 6d   file. This comm
11a10 69 74 73 20 74 68 65 20 74 72 61 6e 73 61 63 74  its the transact
11a20 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20 20 2a  ion. After.    *
11a30 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74 68 65  * doing this the
11a40 20 64 69 72 65 63 74 6f 72 79 20 69 73 20 73 79   directory is sy
11a50 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66 6f 72  nced again befor
11a60 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75 61 6c  e any individual
11a70 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
11a80 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20 64 65  ion files are de
11a90 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  leted..    */.  
11aa0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11ab0 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61  Delete(pVfs, zMa
11ac0 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63 29 3b  ster, needSync);
11ad0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
11ae0 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b  ee(db, zMaster);
11af0 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30  .    zMaster = 0
11b00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
11b10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11b20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
11b30 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69 72  ll files and dir
11b40 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61 6c  ectories have al
11b50 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
11b60 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77  d, so the follow
11b70 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  ing.    ** calls
11b80 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
11b90 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
11ba0 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e   are only closin
11bb0 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20 20  g files and.    
11bc0 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74  ** deleting or t
11bd0 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61  runcating journa
11be0 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e 67  ls. If something
11bf0 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69 6c   goes wrong whil
11c00 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73  e.    ** this is
11c10 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64 6f   happening we do
11c20 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65 2e  n't really care.
11c30 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   The integrity o
11c40 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  f the.    ** tra
11c50 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
11c60 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c 20  ady guaranteed, 
11c70 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20 27  but some stray '
11c80 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20  cold' journals. 
11c90 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69     ** may be lyi
11ca0 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75 72  ng around. Retur
11cb0 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63 6f  ning an error co
11cc0 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61  de won't help ma
11cd0 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tters..    */.  
11ce0 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61    disable_simula
11cf0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b  ted_io_errors();
11d00 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
11d10 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
11d20 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11d30 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11d40 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11d50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11d60 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11d70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
11d80 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
11d90 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a  aseTwo(pBt, 1);.
11da0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
11db0 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
11dc0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
11dd0 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  enable_simulated
11de0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20  _io_errors();.. 
11df0 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
11e00 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  mmit(db);.  }.#e
11e10 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72  ndif..  return r
11e20 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69  c;.}../* .** Thi
11e30 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
11e40 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
11e50 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63 6f  3.nVdbeActive co
11e60 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  unt variable.** 
11e70 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d 62  matches the numb
11e80 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e 20  er of vdbe's in 
11e90 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65 33  the list sqlite3
11ea0 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65 0a  .pVdbe that are.
11eb0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  ** currently act
11ec0 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69 6f  ive. An assertio
11ed0 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20 74  n fails if the t
11ee0 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74  wo counts do not
11ef0 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20   match..** This 
11f00 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73  is an internal s
11f10 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d  elf-check only -
11f20 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65 73   it is not an es
11f30 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73 69  sential processi
11f40 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a  ng.** step..**.*
11f50 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  * This is a no-o
11f60 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20 64  p if NDEBUG is d
11f70 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64  efined..*/.#ifnd
11f80 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69 63  ef NDEBUG.static
11f90 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69 76   void checkActiv
11fa0 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65 33  eVdbeCnt(sqlite3
11fb0 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
11fc0 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  ;.  int cnt = 0;
11fd0 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d 20  .  int nWrite = 
11fe0 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20 3d  0;.  int nRead =
11ff0 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56   0;.  p = db->pV
12000 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  dbe;.  while( p 
12010 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
12020 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73 71  e3_stmt_busy((sq
12030 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20 29  lite3_stmt*)p) )
12040 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  {.      cnt++;. 
12050 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61 64       if( p->read
12060 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74 65  Only==0 ) nWrite
12070 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
12080 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52 65  >bIsReader ) nRe
12090 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ad++;.    }.    
120a0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  p = p->pNext;.  
120b0 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d  }.  assert( cnt=
120c0 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65  =db->nVdbeActive
120d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 57   );.  assert( nW
120e0 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57  rite==db->nVdbeW
120f0 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  rite );.  assert
12100 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64  ( nRead==db->nVd
12110 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73  beRead );.}.#els
12120 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b 41  e.#define checkA
12130 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29 0a  ctiveVdbeCnt(x).
12140 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66  #endif../*.** If
12150 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
12160 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72   as the first ar
12170 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61 20  gument opened a 
12180 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61  statement-transa
12190 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20  ction,.** close 
121a0 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74  it now. Argument
121b0 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69 74   eOp must be eit
121c0 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
121d0 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56  LLBACK or.** SAV
121e0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20  EPOINT_RELEASE. 
121f0 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
12200 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65  NT_ROLLBACK, the
12210 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a  n the statement.
12220 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
12230 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49  s rolled back. I
12240 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f 49  f eOp is SAVEPOI
12250 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
12260 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65   the .** stateme
12270 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12280 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a  s committed..**.
12290 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
122a0 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51 4c  r occurs, an SQL
122b0 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
122c0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
122d0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
122e0 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
122f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
12300 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
12310 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70  Vdbe *p, int eOp
12320 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63 6f  ){.  sqlite3 *co
12330 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  nst db = p->db;.
12340 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
12350 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  E_OK;..  /* If p
12360 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73 20  ->iStatement is 
12370 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
12380 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64 62  o, then this Vdb
12390 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a  e opened a .  **
123a0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
123b0 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f 75  action that shou
123c0 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65 72  ld be closed her
123d0 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63 65  e. The only exce
123e0 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68  ption.  ** is th
123f0 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d  at an IO error m
12400 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  ay have occurred
12410 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d 65  , causing an eme
12420 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e  rgency rollback.
12430 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63 61  .  ** In this ca
12440 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65  se (db->nStateme
12450 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65 72  nt==0), and ther
12460 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  e is nothing to 
12470 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  do..  */.  if( d
12480 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26 26  b->nStatement &&
12490 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 29   p->iStatement )
124a0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
124b0 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76 65   const int iSave
124c0 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74  point = p->iStat
124d0 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73  ement-1;..    as
124e0 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45 50  sert( eOp==SAVEP
124f0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c  OINT_ROLLBACK ||
12500 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12510 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61 73  RELEASE);.    as
12520 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74 65  sert( db->nState
12530 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61 73  ment>0 );.    as
12540 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65 6d  sert( p->iStatem
12550 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65  ent==(db->nState
12560 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f  ment+db->nSavepo
12570 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72  int) );..    for
12580 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b  (i=0; i<db->nDb;
12590 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e   i++){ .      in
125a0 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
125b0 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a  K;.      Btree *
125c0 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d  pBt = db->aDb[i]
125d0 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20  .pBt;.      if( 
125e0 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  pBt ){.        i
125f0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12600 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
12610 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
12620 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70 6f  lite3BtreeSavepo
12630 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f 49  int(pBt, SAVEPOI
12640 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61  NT_ROLLBACK, iSa
12650 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
12660 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12670 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2==SQLITE_OK )
12680 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
12690 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
126a0 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
126b0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
126c0 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
126d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
126e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
126f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
12700 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20 20   = rc2;.        
12710 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
12720 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65      db->nStateme
12730 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74  nt--;.    p->iSt
12740 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20  atement = 0;..  
12750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
12770 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   eOp==SAVEPOINT_
12780 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20  ROLLBACK ){.    
12790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
127a0 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62  VtabSavepoint(db
127b0 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  , SAVEPOINT_ROLL
127c0 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74  BACK, iSavepoint
127d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
127e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
127f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
12800 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53 61   = sqlite3VtabSa
12810 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56 45  vepoint(db, SAVE
12820 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
12830 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
12840 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
12850 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
12860 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
12870 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
12880 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72  ack, also restor
12890 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  e the .    ** da
128a0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20 64  tabase handles d
128b0 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
128c0 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74 68  nt counter to th
128d0 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20 77  e value it had w
128e0 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  hen .    ** the 
128f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
12900 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
12910 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f  .  */.    if( eO
12920 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12930 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 64  LBACK ){.      d
12940 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
12950 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f   = p->nStmtDefCo
12960 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44  ns;.      db->nD
12970 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
12980 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43   p->nStmtDefImmC
12990 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ons;.    }.  }. 
129a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
129b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
129c0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
129d0 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  n a transaction 
129e0 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64 61  opened by the da
129f0 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c  tabase .** handl
12a00 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
12a10 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64 20  h the VM passed 
12a20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 69  as an argument i
12a30 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a  s about to be .*
12a40 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20  * committed. If 
12a50 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
12a60 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20 66  nding deferred f
12a70 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
12a80 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69  raint.** violati
12a90 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ons, return SQLI
12aa0 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72 77  TE_ERROR. Otherw
12ab0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
12ac0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61  **.** If there a
12ad0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 46  re outstanding F
12ae0 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64  K violations and
12af0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12b00 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54  eturns .** SQLIT
12b10 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68 65  E_ERROR, set the
12b20 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 56   result of the V
12b30 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53  M to SQLITE_CONS
12b40 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
12b50 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 61  Y.** and write a
12b60 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
12b70 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74 75  to it. Then retu
12b80 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  rn SQLITE_ERROR.
12b90 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
12ba0 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f  TE_OMIT_FOREIGN_
12bb0 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  KEY.int sqlite3V
12bc0 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65 20  dbeCheckFk(Vdbe 
12bd0 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65 64  *p, int deferred
12be0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12bf0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
12c00 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64 62  (deferred && (db
12c10 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 2b  ->nDeferredCons+
12c20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
12c30 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20  Cons)>0) .   || 
12c40 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70 2d  (!deferred && p-
12c50 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30  >nFkConstraint>0
12c60 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72  ) .  ){.    p->r
12c70 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  c = SQLITE_CONST
12c80 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
12c90 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41 63  ;.    p->errorAc
12ca0 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b  tion = OE_Abort;
12cb0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
12cc0 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49 47  Error(p, "FOREIG
12cd0 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
12ce0 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
12cf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
12d00 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
12d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
12d20 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
12d30 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12d40 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
12d50 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
12d60 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
12d70 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
12d80 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
12d90 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
12da0 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
12db0 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
12dc0 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
12dd0 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
12de0 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
12df0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12e00 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
12e10 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
12e20 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
12e30 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
12e40 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
12e50 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
12e60 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
12e70 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
12e80 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
12e90 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
12ea0 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
12eb0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
12ec0 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
12ed0 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
12ee0 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
12ef0 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
12f00 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
12f10 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
12f20 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
12f30 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
12f40 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
12f50 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
12f60 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
12f70 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
12f80 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
12f90 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
12fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fb0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
12fc0 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
12fd0 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
12fe0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
12ff0 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
13000 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
13010 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
13020 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
13030 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
13040 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
13050 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
13060 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
13070 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
13080 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
13090 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
130a0 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
130b0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
130c0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
130d0 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
130e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
130f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
13100 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
13110 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
13120 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
13130 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13140 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
13150 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
13160 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
13170 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
13180 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
13190 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
131a0 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
131b0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
131c0 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
131d0 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
131e0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
131f0 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
13200 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
13210 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
13220 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
13230 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
13240 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
13250 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
13260 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
13270 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
13280 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
13290 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
132a0 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
132b0 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
132c0 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
132d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
132e0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
132f0 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
13300 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
13310 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
13320 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
13330 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
13340 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
13350 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
13360 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
13370 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
13380 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
13390 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
133a0 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
133b0 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
133c0 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
133d0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
133e0 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
133f0 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
13400 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
13410 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
13420 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
13430 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
13440 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
13450 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
13460 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
13470 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
13480 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
13490 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
134a0 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
134b0 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
134c0 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
134d0 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
134e0 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
134f0 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
13500 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
13510 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
13520 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
13530 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
13540 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
13550 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
13560 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
13570 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
13580 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
13590 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
135a0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
135b0 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
135c0 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
135d0 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
135e0 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
135f0 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
13600 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
13610 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
13620 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
13630 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
13640 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
13650 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
13660 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
13670 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
13680 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
13690 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
136a0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
136b0 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
136c0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
136d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
136e0 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
136f0 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
13700 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
13710 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
13720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
13730 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
13740 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
13750 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
13760 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
13770 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
13780 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
13790 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
137a0 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
137b0 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
137c0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
137d0 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
137e0 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
137f0 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
13800 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13810 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
13820 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
13830 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
13840 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
13850 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
13860 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
13870 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
13880 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
13890 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
138a0 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
138b0 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
138c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
138d0 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
138e0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
138f0 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
13900 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
13910 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
13920 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
13930 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
13940 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
13950 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
13960 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
13970 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
13980 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
13990 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
139a0 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
139b0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
139c0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
139d0 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
139e0 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
139f0 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
13a00 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
13a10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
13a20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
13a30 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
13a40 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
13a50 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
13a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
13a70 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
13a80 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
13a90 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
13aa0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
13ab0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
13ac0 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
13ad0 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
13ae0 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
13af0 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
13b00 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
13b10 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
13b20 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
13b30 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
13b40 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
13b50 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
13b60 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
13b70 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
13b80 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
13b90 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
13ba0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
13bb0 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
13bc0 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
13bd0 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
13be0 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
13bf0 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  te==(p->readOnly
13c00 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
13c10 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
13c20 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
13c30 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
13c40 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
13c50 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
13c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
13c70 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
13c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
13c90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13ca0 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
13cb0 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
13cc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
13cd0 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
13ce0 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
13cf0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13d00 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
13d10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
13d20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
13d30 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
13d40 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20        }else{ .  
13d50 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
13d60 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
13d70 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
13d80 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
13d90 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
13da0 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e      ** or hit an
13db0 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74   'OR FAIL' const
13dc0 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20  raint and there 
13dd0 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20  are no deferred 
13de0 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20  foreign.        
13df0 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61    ** key constra
13e00 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20  ints to hold up 
13e10 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
13e20 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
13e30 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  mmit .          
13e40 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
13e50 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
13e60 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
13e70 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
13e80 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
13e90 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d  QLITE_BUSY && p-
13ea0 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
13eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
13ec0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
13ed0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13ee0 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
13ef0 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
13f00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13f10 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
13f20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
13f30 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
13f40 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
13f50 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
13f60 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
13f70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13f80 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13f90 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
13fa0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
13fb0 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
13fc0 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
13fd0 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
13fe0 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
13ff0 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
14000 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
14010 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
14020 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14030 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14040 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14050 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OK);.        p->
14060 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
14070 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
14080 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
14090 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
140a0 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
140b0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
140c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
140d0 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
140e0 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
140f0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
14100 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
14110 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
14120 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
14130 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
14140 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
14150 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
14160 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
14170 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
14180 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
14190 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
141a0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
141b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
141c0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
141d0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
141e0 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
141f0 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14200 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14210 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
14220 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
14230 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
14240 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
14250 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
14260 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
14270 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
14280 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
14290 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
142a0 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
142b0 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
142c0 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
142d0 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
142e0 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
142f0 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
14300 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
14310 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
14320 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
14330 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
14340 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
14350 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
14360 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
14370 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
14380 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14390 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
143a0 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
143b0 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
143c0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
143d0 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
143e0 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
143f0 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
14400 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
14410 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
14420 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14430 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
14440 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
14450 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
14460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
14470 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
14480 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
14490 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
144a0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
144b0 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
144c0 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
144d0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
144e0 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
144f0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14500 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
14510 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
14520 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
14530 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
14540 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
14550 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
14560 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
14570 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
14580 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
14590 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
145a0 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
145b0 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
145c0 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
145d0 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
145e0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
145f0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
14600 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
14610 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
14620 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
14630 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14640 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
14650 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
14660 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
14670 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
14680 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
14690 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
146a0 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
146b0 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
146c0 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
146d0 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
146e0 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
146f0 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
14700 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
14710 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
14720 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
14730 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
14740 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
14750 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
14760 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
14770 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
14780 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
14790 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
147a0 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
147b0 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
147c0 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
147d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
147e0 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
147f0 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
14800 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
14810 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
14820 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
14830 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
14840 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14850 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14860 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
14870 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
14880 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
14890 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
148a0 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
148b0 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
148c0 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
148d0 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
148e0 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
148f0 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
14900 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
14910 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
14920 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
14930 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
14940 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
14950 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
14960 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
14970 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
14980 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
14990 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
149a0 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
149b0 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
149c0 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
149d0 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
149e0 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
149f0 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
14a00 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
14a10 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
14a20 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
14a30 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
14a40 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
14a50 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
14a60 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
14a70 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
14a80 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
14a90 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
14aa0 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
14ab0 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
14ac0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
14ad0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
14ae0 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
14af0 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
14b00 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
14b10 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
14b20 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
14b30 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
14b40 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
14b50 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
14b60 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
14b70 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
14b80 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
14b90 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
14ba0 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
14bb0 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
14bc0 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
14bd0 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
14be0 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
14bf0 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
14c00 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
14c10 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
14c20 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
14c30 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
14c40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
14c50 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
14c60 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
14c70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
14c80 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  8 mallocFailed =
14c90 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
14ca0 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  d;.    sqlite3Be
14cb0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
14cc0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  );.    if( db->p
14cd0 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72  Err==0 ) db->pEr
14ce0 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  r = sqlite3Value
14cf0 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
14d00 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
14d10 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
14d20 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
14d30 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
14d40 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
14d50 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14d60 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e  lloc();.    db->
14d70 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d  mallocFailed = m
14d80 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
14d90 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72   db->errCode = r
14da0 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
14db0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
14dc0 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
14dd0 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
14de0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
14df0 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
14e00 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
14e10 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
14e20 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
14e30 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
14e40 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
14e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14e60 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
14e70 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
14e80 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
14e90 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
14ea0 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
14eb0 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
14ec0 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
14ed0 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
14ee0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
14ef0 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
14f00 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
14f10 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
14f20 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
14f30 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
14f40 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
14f50 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
14f60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14f70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
14f80 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
14f90 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
14fa0 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
14fb0 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
14fc0 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
14fd0 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
14fe0 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
14ff0 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
15000 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
15010 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
15020 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
15030 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
15040 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
15050 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
15060 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
15070 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
15080 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
15090 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
150a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
150b0 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
150c0 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
150d0 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
150e0 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
150f0 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
15100 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
15110 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
15120 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
15130 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
15140 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
15150 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
15160 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
15170 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
15180 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
15190 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
151a0 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
151b0 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
151c0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
151d0 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
151e0 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
151f0 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
15200 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
15210 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
15220 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
15230 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
15240 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
15250 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
15260 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
15270 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
15280 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
15290 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
152a0 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
152b0 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
152c0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
152d0 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
152e0 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
152f0 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
15300 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
15310 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
15320 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
15330 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
15340 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
15350 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
15360 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
15370 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
15380 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
15390 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
153a0 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
153b0 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b  ){.    vdbeInvok
153c0 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20  eSqllog(p);.    
153d0 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
153e0 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  ferError(p);.   
153f0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
15400 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
15410 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
15420 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
15430 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
15440 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
15450 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
15460 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
15470 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
15480 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
15490 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
154a0 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
154b0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
154c0 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
154d0 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
154e0 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
154f0 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
15500 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
15510 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
15520 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
15530 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
15540 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
15550 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
15560 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
15570 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
15580 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
15590 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
155a0 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
155b0 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
155c0 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
155d0 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
155e0 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
155f0 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
15600 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
15610 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
15620 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
15630 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
15640 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
15650 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
15660 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
15670 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
15680 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
15690 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
156a0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
156b0 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
156c0 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
156d0 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
156e0 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
156f0 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
15700 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15710 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
15720 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n");.      if( p
15730 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ->zSql ){.      
15740 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30    char c, pc = 0
15750 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
15760 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
15770 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
15780 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29  (c = p->zSql[i])
15790 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
157a0 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e       if( pc=='\n
157b0 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
157c0 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
157d0 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b     putc(c, out);
157e0 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
157f0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
15800 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e       if( pc!='\n
15810 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
15820 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
15830 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
15840 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
15850 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72         char zHdr
15860 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  [100];.        s
15870 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
15880 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48  sizeof(zHdr), zH
15890 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20  dr, "%6u %12llu 
158a0 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20  %8llu ",.       
158b0 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
158c0 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
158d0 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
158e0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
158f0 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
15900 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
15910 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
15920 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
15930 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15940 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20  "%s", zHdr);.   
15950 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
15960 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
15970 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
15980 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
15990 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
159a0 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43  }.#endif.  p->iC
159b0 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a  urrentTime = 0;.
159c0 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
159d0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
159e0 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
159f0 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
15a00 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
15a10 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
15a20 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
15a30 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
15a40 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
15a50 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
15a60 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
15a70 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
15a80 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
15a90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15aa0 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
15ab0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
15ac0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
15ad0 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
15ae0 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
15af0 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
15b00 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
15b10 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
15b20 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
15b30 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
15b40 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
15b50 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
15b60 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
15b70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15b80 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
15b90 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
15ba0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
15bb0 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
15bc0 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
15bd0 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
15be0 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
15bf0 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
15c00 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
15c10 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
15c20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
15c30 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
15c40 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
15c50 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
15c60 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
15c70 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
15c80 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
15c90 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
15ca0 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
15cb0 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
15cc0 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
15cd0 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
15ce0 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
15cf0 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
15d00 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
15d10 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
15d20 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
15d30 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
15d40 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
15d50 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
15d60 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
15d70 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
15d80 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
15d90 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
15da0 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
15db0 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
15dc0 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
15dd0 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
15de0 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
15df0 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
15e00 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
15e10 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
15e20 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
15e30 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
15e40 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
15e50 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
15e60 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
15e70 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
15e80 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
15e90 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
15ea0 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
15eb0 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
15ec0 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
15ed0 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
15ee0 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
15ef0 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
15f00 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
15f10 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
15f20 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
15f30 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
15f40 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
15f50 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
15f60 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
15f70 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
15f80 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
15f90 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
15fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15fb0 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
15fc0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
15fd0 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
15fe0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
15ff0 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
16000 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
16010 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
16020 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
16030 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
16040 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
16050 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
16060 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
16070 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
16080 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
16090 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
160a0 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
160b0 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
160c0 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
160d0 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
160e0 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
160f0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
16100 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
16110 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
16120 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16130 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
16140 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
16150 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
16160 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
16170 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
16180 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
16190 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
161a0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
161b0 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
161c0 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
161d0 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
161e0 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
161f0 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
16200 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
16210 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
16220 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
16230 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
16240 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
16250 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
16260 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
16270 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16280 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
16290 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
162a0 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
162b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
162c0 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
162d0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
162e0 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
162f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16300 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
16310 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
16320 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
16330 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16340 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
16350 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16360 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
16370 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30  STATUS.  for(i=0
16380 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
16390 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
163a0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
163b0 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
163c0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
163d0 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b  e(db, p->aScan);
163e0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
163f0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
16400 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
16410 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16420 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
16430 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
16440 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
16450 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
16460 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
16470 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16480 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
16490 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
164a0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
164b0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
164c0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
164d0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
164e0 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
164f0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
16500 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
16510 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
16520 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
16530 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
16540 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
16550 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
16560 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
16570 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
16580 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
16590 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
165a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
165b0 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
165c0 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
165d0 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
165e0 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
165f0 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
16600 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
16610 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
16620 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
16630 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16640 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
16650 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
16660 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
16670 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
16680 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
16690 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
166a0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
166b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
166c0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
166d0 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
166e0 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
166f0 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
16700 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
16710 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
16720 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
16730 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
16740 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
16750 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
16760 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
16770 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
16780 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
16790 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
167a0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
167b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
167c0 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
167d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
167e0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
167f0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
16800 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
16810 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
16820 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
16830 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
16840 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
16850 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
16860 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
16870 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
16880 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
16890 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
168a0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
168b0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
168c0 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
168d0 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
168e0 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
168f0 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
16900 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
16910 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
16920 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
16930 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
16940 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
16950 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
16960 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
16970 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
16980 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
16990 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
169a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
169b0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
169c0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
169d0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
169e0 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
169f0 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
16a00 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
16a10 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
16a20 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
16a30 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
16a40 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
16a50 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
16a60 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
16a70 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
16a80 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
16a90 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
16aa0 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
16ab0 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
16ac0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
16ad0 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
16ae0 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
16af0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
16b00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16b10 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
16b20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
16b30 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
16b40 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
16b50 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
16b60 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
16b70 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
16b80 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
16b90 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
16ba0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
16bb0 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
16bc0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
16bd0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
16be0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
16bf0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
16c00 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
16c10 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
16c20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
16c30 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
16c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16c50 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16c60 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
16c70 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
16c80 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
16c90 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
16ca0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
16cb0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
16cc0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
16cd0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
16ce0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
16cf0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
16d00 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
16d10 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
16d20 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
16d30 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
16d40 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
16d50 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
16d60 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
16d70 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
16d80 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
16d90 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
16da0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
16db0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
16dc0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
16dd0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
16de0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
16df0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
16e00 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
16e10 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
16e20 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
16e30 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
16e40 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
16e50 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
16e60 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
16e70 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
16e80 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
16e90 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
16ea0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
16eb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16ec0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
16ed0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
16ee0 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72 54 79  .  if( p->eCurTy
16ef0 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45  pe==CURTYPE_BTRE
16f00 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  E ){.    if( p->
16f10 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29  deferredMoveto )
16f20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  {.      return h
16f30 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
16f40 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  eto(p);.    }.  
16f50 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
16f60 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
16f70 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
16f80 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
16f90 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
16fa0 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r(p);.    }.  }.
16fb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16fc0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
16fd0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
16fe0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
16ff0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
17000 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
17010 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17020 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17030 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
17040 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17050 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
17060 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
17070 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
17080 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
17090 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
170a0 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
170b0 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
170c0 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
170d0 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
170e0 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
170f0 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
17100 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
17110 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
17120 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
17130 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
17140 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
17150 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
17160 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
17170 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
17180 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
17190 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
171a0 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
171b0 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
171c0 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
171d0 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
171e0 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
171f0 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
17200 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
17210 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
17220 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
17230 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
17240 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
17250 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
17260 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
17270 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
17280 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
17290 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
172a0 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
172b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
172c0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
172d0 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
172e0 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
172f0 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
17300 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
17310 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
17320 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
17330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
17340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
17350 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17360 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
17370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17380 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
17390 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
173a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
173b0 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
173c0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
173d0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
173e0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
173f0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17400 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17420 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
17430 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17440 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
17450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
17460 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17470 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17480 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
17490 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
174a0 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
174b0 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
174c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174d0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
174e0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
174f0 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
17500 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
17510 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
17520 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
17530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17540 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17550 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17560 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
17570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17580 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
17590 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
175a0 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
175d0 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
175e0 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
175f0 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
17600 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
17610 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
17620 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
17630 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
17640 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
17650 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
17660 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
17670 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
17680 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
17690 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
176a0 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
176b0 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
176c0 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
176d0 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
176e0 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
176f0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
17700 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
17710 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
17720 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
17730 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a  le_format, u32 *
17740 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pLen){.  int fla
17750 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
17760 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73  ;.  u32 n;..  as
17770 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b  sert( pLen!=0 );
17780 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
17790 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Null ){.    *pL
177a0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  en = 0;.    retu
177b0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
177c0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
177d0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
177e0 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
177f0 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
17800 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
17810 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
17820 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
17830 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
17840 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
17850 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
17860 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
17870 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20      u = ~i;.    
17880 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
17890 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
178a0 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
178b0 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26    if( (i&1)==i &
178c0 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
178d0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65   ){.        *pLe
178e0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  n = 0;.        r
178f0 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a  eturn 8+(u32)u;.
17900 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17910 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a       *pLen = 1;.
17920 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
17930 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17940 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
17950 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72   ){ *pLen = 2; r
17960 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69  eturn 2; }.    i
17970 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b  f( u<=8388607 ){
17980 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75   *pLen = 3; retu
17990 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 3; }.    if( 
179a0 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  u<=2147483647 ){
179b0 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75   *pLen = 4; retu
179c0 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 4; }.    if( 
179d0 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20  u<=MAX_6BYTE ){ 
179e0 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72  *pLen = 6; retur
179f0 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e  n 5; }.    *pLen
17a00 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
17a10 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
17a20 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
17a30 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
17a40 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
17a50 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
17a60 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
17a70 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
17a80 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
17a90 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
17aa0 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28  >n>=0 );.  n = (
17ab0 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  u32)pMem->n;.  i
17ac0 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
17ad0 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
17ae0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
17af0 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a   }.  *pLen = n;.
17b00 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
17b10 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
17b20 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
17b30 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73  ./*.** The sizes
17b40 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65   for serial type
17b50 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a  s less than 128.
17b60 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
17b70 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  u8 sqlite3SmallT
17b80 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20  ypeSizes[] = {. 
17b90 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31         /*  0   1
17ba0 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35     2   3   4   5
17bb0 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39     6   7   8   9
17bc0 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f   */   ./*   0 */
17bd0 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33     0,  1,  2,  3
17be0 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38  ,  4,  6,  8,  8
17bf0 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30  ,  0,  0,./*  10
17c00 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
17c10 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c    0,  1,  1,  2,
17c20 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20    2,  3,  3,./* 
17c30 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20   20 */   4,  4, 
17c40 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20   5,  5,  6,  6, 
17c50 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a   7,  7,  8,  8,.
17c60 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20  /*  30 */   9,  
17c70 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31  9, 10, 10, 11, 1
17c80 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31  1, 12, 12, 13, 1
17c90 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34  3,./*  40 */  14
17ca0 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36  , 14, 15, 15, 16
17cb0 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38  , 16, 17, 17, 18
17cc0 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20  , 18,./*  50 */ 
17cd0 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c   19, 19, 20, 20,
17ce0 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c   21, 21, 22, 22,
17cf0 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20   23, 23,./*  60 
17d00 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20  */  24, 24, 25, 
17d10 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20  25, 26, 26, 27, 
17d20 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20  27, 28, 28,./*  
17d30 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33  70 */  29, 29, 3
17d40 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33  0, 30, 31, 31, 3
17d50 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f  2, 32, 33, 33,./
17d60 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34  *  80 */  34, 34
17d70 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36  , 35, 35, 36, 36
17d80 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38  , 37, 37, 38, 38
17d90 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c  ,./*  90 */  39,
17da0 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c   39, 40, 40, 41,
17db0 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c   41, 42, 42, 43,
17dc0 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20   43,./* 100 */  
17dd0 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20  44, 44, 45, 45, 
17de0 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20  46, 46, 47, 47, 
17df0 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a  48, 48,./* 110 *
17e00 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35  /  49, 49, 50, 5
17e10 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35  0, 51, 51, 52, 5
17e20 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32  2, 53, 53,./* 12
17e30 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35  0 */  54, 54, 55
17e40 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37  , 55, 56, 56, 57
17e50 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  , 57.};../*.** R
17e60 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
17e70 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
17e80 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
17e90 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
17ea0 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
17eb0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17ec0 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
17ed0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
17ee0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38  serial_type>=128
17ef0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
17f00 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
17f10 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
17f20 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
17f30 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20  ype<12 .        
17f40 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d      || sqlite3Sm
17f50 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
17f60 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69  ial_type]==(seri
17f70 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20  al_type - 12)/2 
17f80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
17f90 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
17fa0 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
17fb0 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74  ;.  }.}.u8 sqlit
17fc0 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72  e3VdbeOneByteSer
17fd0 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65  ialTypeLen(u8 se
17fe0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73  rial_type){.  as
17ff0 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
18000 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72  e<128 );.  retur
18010 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
18020 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18030 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ype];  .}../*.**
18040 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
18050 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
18060 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
18070 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
18080 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
18090 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
180a0 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
180b0 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
180c0 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
180d0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
180e0 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
180f0 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
18100 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
18110 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
18120 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
18130 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
18140 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
18150 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
18160 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
18170 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
18180 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
18190 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
181a0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
181b0 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
181c0 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
181d0 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
181e0 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
181f0 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
18200 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
18210 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
18220 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
18230 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
18240 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
18250 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
18260 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
18270 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
18280 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
18290 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
182a0 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
182b0 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
182c0 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
182d0 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
182e0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
182f0 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
18300 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
18310 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
18320 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
18330 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
18340 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
18350 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
18360 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
18370 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
18380 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
18390 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
183a0 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
183b0 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
183c0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
183d0 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
183e0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
183f0 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
18400 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
18410 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
18420 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
18430 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
18440 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
18450 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
18460 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
18470 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
18480 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
18490 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
184a0 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
184b0 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
184c0 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
184d0 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
184e0 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
184f0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
18500 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
18510 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
18520 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
18530 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
18540 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
18550 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
18560 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
18570 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
18580 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
18590 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
185a0 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
185b0 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
185c0 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
185d0 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
185e0 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
185f0 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
18600 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
18610 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
18620 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
18630 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
18640 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
18650 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
18660 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
18670 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
18680 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
18690 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
186a0 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
186b0 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
186c0 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
186d0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
186e0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
186f0 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
18700 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
18710 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
18720 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
18730 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
18740 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
18750 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
18760 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
18770 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
18780 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
18790 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
187a0 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
187b0 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
187c0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
187d0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
187e0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
187f0 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
18800 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
18810 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
18820 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
18830 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
18840 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
18850 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
18860 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
18870 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
18880 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18890 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
188a0 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
188b0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
188c0 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
188d0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
188e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
188f0 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
18900 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
18910 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
18920 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
18930 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
18940 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
18950 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
18960 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
18970 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
18980 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
18990 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
189a0 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
189b0 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
189c0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
189d0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
189e0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
189f0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
18a00 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
18a10 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
18a20 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
18a30 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
18a40 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
18a50 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
18a60 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
18a70 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
18a80 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
18a90 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
18aa0 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
18ab0 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
18ac0 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
18ad0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
18ae0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
18af0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
18b00 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
18b10 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
18b20 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
18b30 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
18b40 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
18b50 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
18b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18b70 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
18b80 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
18b90 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
18ba0 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
18bb0 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72  type];.    asser
18bc0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f  t( i>0 );.    do
18bd0 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d  {.      buf[--i]
18be0 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
18bf0 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
18c00 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b      }while( i );
18c10 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
18c20 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
18c30 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
18c40 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
18c50 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
18c60 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
18c70 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
18c80 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
18c90 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
18ca0 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
18cb0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
18cc0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
18cd0 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
18ce0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20  Mem->n;.    if( 
18cf0 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62  len>0 ) memcpy(b
18d00 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
18d10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
18d20 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
18d30 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
18d40 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
18d50 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74  n 0;.}../* Input
18d60 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e   "x" is a sequen
18d70 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63  ce of unsigned c
18d80 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72  haracters that r
18d90 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69  epresent a.** bi
18da0 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
18db0 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71  .  Return the eq
18dc0 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20  uivalent native 
18dd0 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69  integer.*/.#defi
18de0 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  ne ONE_BYTE_INT(
18df0 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30  x)    ((i8)(x)[0
18e00 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42  ]).#define TWO_B
18e10 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32  YTE_INT(x)    (2
18e20 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  56*(i8)((x)[0])|
18e30 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[1]).#define 
18e40 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78  THREE_BYTE_INT(x
18e50 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28  )  (65536*(i8)((
18e60 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
18e70 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69  8)|(x)[2]).#defi
18e80 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  ne FOUR_BYTE_UIN
18e90 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29  T(x)  (((u32)(x)
18ea0 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d  [0]<<24)|((x)[1]
18eb0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
18ec0 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e  )|(x)[3]).#defin
18ed0 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  e FOUR_BYTE_INT(
18ee0 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38  x) (16777216*(i8
18ef0 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
18f00 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
18f10 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
18f20 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
18f30 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
18f40 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
18f50 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
18f60 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
18f70 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
18f80 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
18f90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
18fa0 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  bytes read..**.*
18fb0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
18fc0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
18fd0 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72  s two separate r
18fe0 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66  outines for perf
18ff0 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
19000 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72  few cases that r
19010 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72  equire local var
19020 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65  iables are broke
19030 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70  n out into a sep
19040 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65  arate.** routine
19050 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74   so that in most
19060 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68   cases the overh
19070 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68  ead of moving th
19080 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a  e stack pointer.
19090 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a  ** is avoided..*
190a0 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51  / .static u32 SQ
190b0 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65  LITE_NOINLINE se
190c0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
190d0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
190e0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
190f0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
19100 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
19110 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19120 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19130 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19140 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19150 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
19160 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
19170 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
19180 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
19190 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f  .){.  u64 x = FO
191a0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
191b0 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55  );.  u32 y = FOU
191c0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
191d0 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32  4);.  x = (x<<32
191e0 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72  ) + y;.  if( ser
191f0 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
19200 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
19210 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32  F: R-29851-52272
19220 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19230 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20  endian 64-bit.  
19240 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19250 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19260 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
19270 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
19280 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19290 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
192a0 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
192b0 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
192c0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
192d0 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56   R-57343-49114 V
192e0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
192f0 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30  dian IEEE 754-20
19300 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  08 64-bit.    **
19310 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19320 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21  number. */.#if !
19330 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
19340 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19350 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
19360 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56  _POINT).    /* V
19370 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
19380 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
19390 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
193a0 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
193b0 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
193c0 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
193d0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
193e0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
193f0 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
19400 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
19410 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
19420 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
19430 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
19440 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
19450 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
19460 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
19470 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69  )<<32;.    stati
19480 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
19490 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34  1 = 1.0;.    u64
194a0 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77   t2 = t1;.    sw
194b0 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
194c0 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65  at(t2);.    asse
194d0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
194e0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
194f0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
19500 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
19510 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
19520 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
19530 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
19540 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  >u.r)==8 );.    
19550 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19560 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d  loat(x);.    mem
19570 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  cpy(&pMem->u.r, 
19580 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
19590 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
195a0 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
195b0 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f  Mem->u.r) ? MEM_
195c0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
195d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
195e0 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
195f0 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
19600 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19610 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
19620 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
19630 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
19640 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19660 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
19670 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
19680 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
196a0 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
196b0 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
196c0 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
196d0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
196e0 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
196f0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
19700 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
19710 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
19720 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
19730 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
19740 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c  ase 0: {  /* Nul
19750 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  l */.      /* EV
19760 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
19770 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69  78-09375 Value i
19780 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20  s a NULL. */.   
19790 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
197a0 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
197b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
197c0 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
197d0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
197e0 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20  : R-44885-25196 
197f0 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69  Value is an 8-bi
19800 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
19810 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  t.      ** integ
19820 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19830 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
19840 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19850 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19860 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19870 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19880 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19890 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
198a0 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
198b0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
198c0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
198d0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
198e0 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75  49794-35026 Valu
198f0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19900 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 16-bit.      *
19910 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
19920 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
19930 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19940 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
19950 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19960 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19970 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19980 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19990 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
199a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
199b0 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
199c0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
199d0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
199e0 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33  -OF: R-37839-543
199f0 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  01 Value is a bi
19a00 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a  g-endian 24-bit.
19a10 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
19a20 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19a30 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19a40 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
19a50 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19a60 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19a70 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19a80 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19a90 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19aa0 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
19ab0 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
19ac0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19ad0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19ae0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19af0 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75  01849-26079 Valu
19b00 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19b10 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 32-bit.      *
19b20 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
19b30 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
19b40 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19b50 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
19b60 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f  f);.#ifdef __HP_
19b70 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72  cc .      /* Wor
19b80 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d  k around a sign-
19b90 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e  extension bug in
19ba0 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72   the HP compiler
19bb0 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20   for HP/UX */.  
19bc0 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30      if( buf[0]&0
19bd0 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20  x80 ) pMem->u.i 
19be0 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30  |= 0xffffffff800
19bf0 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a  00000LL;.#endif.
19c00 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
19c10 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
19c20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
19c30 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
19c40 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
19c50 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
19c60 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
19c70 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
19c80 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19c90 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
19ca0 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
19cb0 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
19cc0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
19cd0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
19ce0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
19cf0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
19d00 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
19d10 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
19d20 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
19d30 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19d40 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
19d50 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
19d60 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
19d70 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
19d80 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
19d90 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
19da0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
19db0 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
19dc0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
19dd0 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
19de0 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
19df0 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
19e00 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
19e10 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
19e20 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
19e30 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
19e40 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
19e50 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
19e60 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
19e70 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
19e80 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
19e90 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
19ea0 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
19eb0 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
19ec0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
19ed0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
19ee0 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
19ef0 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
19f00 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
19f10 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
19f20 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
19f30 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
19f40 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
19f50 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
19f60 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
19f70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
19f80 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
19f90 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
19fa0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
19fb0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
19fc0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
19fd0 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
19fe0 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
19ff0 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
1a000 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
1a010 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
1a020 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
1a030 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
1a040 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
1a050 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
1a060 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
1a070 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
1a080 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
1a090 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
1a0a0 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
1a0b0 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
1a0c0 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
1a0d0 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
1a0e0 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
1a0f0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1a100 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1a110 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
1a120 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
1a130 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
1a140 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
1a150 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
1a160 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
1a170 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a180 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
1a190 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
1a1a0 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
1a1b0 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
1a1c0 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
1a1d0 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
1a1e0 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
1a1f0 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
1a200 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
1a210 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1a220 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
1a230 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
1a240 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
1a250 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
1a260 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
1a270 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a280 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
1a290 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
1a2a0 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
1a2b0 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
1a2c0 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
1a2d0 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
1a2e0 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
1a2f0 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
1a300 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
1a310 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
1a320 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
1a330 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
1a340 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1a350 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1a360 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
1a370 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
1a380 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
1a390 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
1a3a0 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
1a3b0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1a3c0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
1a3d0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1a3e0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1a3f0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1a400 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
1a410 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
1a420 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
1a430 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
1a440 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1a450 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
1a460 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
1a470 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
1a480 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
1a490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1a4a0 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
1a4b0 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
1a4c0 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
1a4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a4e0 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
1a4f0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
1a500 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
1a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a520 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
1a530 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
1a540 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
1a550 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1a560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1a570 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1a580 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1a590 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a5b0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
1a5c0 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
1a5d0 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
1a5e0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1a5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a600 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1a610 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1a620 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
1a630 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
1a640 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
1a650 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
1a660 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
1a670 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
1a680 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
1a690 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
1a6a0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
1a6b0 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
1a6c0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
1a6d0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
1a6e0 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
1a6f0 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
1a700 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
1a710 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
1a720 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
1a730 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
1a740 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
1a750 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1a760 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1a770 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
1a780 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
1a790 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
1a7a0 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
1a7b0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
1a7c0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1a7d0 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
1a7e0 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
1a7f0 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
1a800 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
1a810 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1a820 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1a830 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
1a840 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
1a850 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
1a860 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1a870 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1a880 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1a890 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1a8a0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1a8b0 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1a8c0 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1a8d0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1a8e0 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1a8f0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
1a900 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1a910 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
1a920 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
1a930 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
1a940 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
1a950 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
1a960 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
1a970 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
1a980 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
1a990 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
1a9a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1a9b0 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
1a9c0 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
1a9d0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1a9e0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
1a9f0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
1aa00 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1aa10 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
1aa20 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa40 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
1aa50 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1aa60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1aa70 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
1aa80 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
1aa90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1aaa0 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
1aab0 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
1aac0 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
1aad0 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
1aae0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1aaf0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1ab00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1ab10 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
1ab20 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
1ab30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab40 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
1ab50 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
1ab60 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
1ab70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab80 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1ab90 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1aba0 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
1abb0 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
1abc0 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
1abd0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
1abe0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1abf0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
1ac00 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
1ac10 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1ac20 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
1ac30 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
1ac40 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1ac50 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
1ac60 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1ac70 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
1ac80 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1ac90 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
1aca0 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
1acb0 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1acc0 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
1acd0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1ace0 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
1acf0 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
1ad00 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1ad10 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
1ad20 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
1ad30 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
1ad40 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
1ad50 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1ad60 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
1ad70 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
1ad80 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
1ad90 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46  if( (++u)>=p->nF
1ada0 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
1adb0 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
1adc0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1add0 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
1ade0 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53  ld = u;.}..#if S
1adf0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1ae00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ae10 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1ae20 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1ae30 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1ae40 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1ae50 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1ae60 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1ae70 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1ae80 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1ae90 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1aea0 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1aeb0 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1aec0 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1aed0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1aee0 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1aef0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1af00 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1af10 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1af20 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1af30 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1af40 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1af50 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1af60 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1af70 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1af80 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1af90 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1afa0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1afb0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1afc0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1afd0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1afe0 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1aff0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1b000 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1b010 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1b020 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1b030 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1b040 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1b050 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1b060 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1b070 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1b080 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1b090 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1b0a0 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b0c0 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1b0d0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1b0e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b0f0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b100 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1b110 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1b120 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1b130 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1b140 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1b150 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1b160 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1b170 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b180 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1b190 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1b1a0 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1b1b0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b1c0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1b1d0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b1e0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1b1f0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1b200 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1b210 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1b220 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1b230 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1b240 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1b250 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1b260 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1b270 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1b280 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1b290 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1b2a0 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1b2b0 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1b2c0 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1b2d0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1b2e0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1b2f0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1b300 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1b310 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1b320 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1b330 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1b340 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1b350 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1b360 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1b370 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1b380 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1b390 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1b3a0 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1b3b0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1b3c0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1b3d0 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1b3e0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1b3f0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1b400 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1b410 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1b420 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1b430 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1b440 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1b450 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1b460 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1b470 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1b480 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1b490 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1b4a0 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1b4b0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1b4c0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1b4d0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1b4e0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1b4f0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1b500 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1b510 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1b520 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1b530 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1b540 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1b550 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1b560 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1b570 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1b580 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1b590 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1b5a0 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
1b5b0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1b5c0 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
1b5d0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1b5e0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1b5f0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1b600 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1b610 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1b620 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1b630 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1b640 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1b650 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1b660 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1b670 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1b680 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1b690 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1b6a0 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1b6b0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1b6c0 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1b6d0 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1b6e0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1b6f0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1b700 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1b710 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1b720 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1b730 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1b740 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1b750 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1b760 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1b770 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1b780 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1b790 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1b7a0 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1b7b0 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1b7c0 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1b7d0 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1b7e0 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1b7f0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1b800 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1b810 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1b820 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1b830 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
1b840 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
1b850 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
1b860 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1b870 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
1b880 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
1b890 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
1b8a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1b8b0 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1b8c0 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
1b8d0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
1b8e0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1b8f0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1b900 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1b910 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
1b920 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
1b930 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
1b940 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
1b950 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
1b960 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
1b970 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1b980 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
1b990 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1b9a0 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1b9b0 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1b9c0 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1b9d0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1b9e0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1b9f0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1ba00 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1ba10 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1ba20 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1ba30 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1ba40 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1ba50 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1ba60 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1ba70 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1ba80 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1ba90 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1baa0 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1bab0 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1bac0 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1bad0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1bae0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1baf0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1bb00 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1bb10 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1bb20 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1bb30 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1bb40 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1bb50 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1bb60 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1bb70 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1bb80 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1bb90 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1bba0 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1bbb0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1bbc0 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1bbd0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1bbe0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1bbf0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1bc00 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1bc10 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1bc20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1bc30 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1bc40 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1bc50 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1bc60 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1bc70 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1bc80 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1bc90 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1bca0 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1bcb0 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1bcc0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1bcd0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1bce0 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1bcf0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1bd00 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1bd10 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1bd20 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1bd30 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1bd40 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1bd50 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1bd60 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1bd70 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1bd80 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1bd90 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1bda0 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1bdb0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1bdc0 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1bdd0 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1bde0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b  nfo->nField + pK
1bdf0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e  eyInfo->nXField.
1be00 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1be10 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1be20 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1be30 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1be40 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1be50 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1be60 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1be70 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1be80 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1be90 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1bea0 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1beb0 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1bec0 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1bed0 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1bee0 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  e KeyInfo.nField
1bef0 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   or KeyInfo.nXFi
1bf00 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1bf10 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1bf20 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1bf30 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1bf40 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1bf50 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1bf60 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1bf70 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1bf80 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1bf90 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1bfa0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1bfb0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1bfc0 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1bfd0 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1bfe0 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1bff0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1c000 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1c010 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1c020 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1c030 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1c040 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1c050 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1c060 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1c070 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1c080 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1c090 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1c0a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1c0b0 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1c0c0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1c0d0 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1c0e0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1c0f0 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1c100 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1c110 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1c120 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1c130 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1c140 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d  fo->nXField );.}
1c150 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c160 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c170 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c180 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1c190 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1c1a0 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1c1b0 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1c1c0 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1c1d0 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1c1e0 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1c1f0 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1c200 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1c210 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1c220 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1c230 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1c240 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1c250 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1c260 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1c270 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1c280 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1c290 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1c2a0 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1c2b0 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1c2c0 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1c2d0 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1c2e0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1c2f0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1c300 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1c310 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1c320 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c340 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1c350 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1c360 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1c370 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1c380 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1c390 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1c3a0 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1c3b0 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1c3c0 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1c3d0 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1c3e0 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1c3f0 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1c400 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1c410 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1c420 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1c430 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1c440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c450 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1c460 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1c470 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20    int n1, n2;.  
1c480 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1c490 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1c4a0 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1c4b0 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1c4c0 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1c4d0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1c4e0 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1c4f0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1c500 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1c510 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1c520 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1c530 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1c540 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1c550 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1c560 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1c570 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1c580 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1c590 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1c5a0 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30  ;.    n1 = v1==0
1c5b0 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20   ? 0 : c1.n;.   
1c5c0 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1c5d0 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1c5e0 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1c5f0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20  l->enc);.    n2 
1c600 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32  = v2==0 ? 0 : c2
1c610 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f  .n;.    rc = pCo
1c620 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1c630 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e  pUser, n1, v1, n
1c640 32 2c 20 76 32 29 3b 0a 20 20 20 20 69 66 28 20  2, v2);.    if( 
1c650 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1c660 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70 72   && prcErr ) *pr
1c670 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1c680 4d 45 4d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  MEM;.    sqlite3
1c690 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c6a0 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1c6b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c6c0 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  c2);.    return 
1c6d0 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1c6e0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f   Compare two blo
1c6f0 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  bs.  Return nega
1c700 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1c710 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1c720 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
1c730 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1c740 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1c750 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70  the second, resp
1c760 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20  ectively..** If 
1c770 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72  one blob is a pr
1c780 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
1c790 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72  r, then the shor
1c7a0 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f  ter is the lesso
1c7b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  r..*/.static SQL
1c7c0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1c7d0 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1c7e0 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1c7f0 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1c800 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  B2){.  int c = m
1c810 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42  emcmp(pB1->z, pB
1c820 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32  2->z, pB1->n>pB2
1c830 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70  ->n ? pB2->n : p
1c840 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20  B1->n);.  if( c 
1c850 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65  ) return c;.  re
1c860 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42  turn pB1->n - pB
1c870 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  2->n;.}../*.** D
1c880 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1c890 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1c8a0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1c8b0 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1c8c0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1c8d0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1c8e0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1c8f0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1c900 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1c910 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1c920 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1c930 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1c940 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1c950 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1c960 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1c970 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1c980 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1c990 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1c9a0 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1c9b0 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1c9c0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1c9d0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1c9e0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1c9f0 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1ca00 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1ca10 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1ca20 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1ca30 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1ca40 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1ca50 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1ca60 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32  1;.    if( r>922
1ca70 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1ca80 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1ca90 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1caa0 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1cab0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1cac0 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66   i>y ){.      if
1cad0 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  ( y==SMALLEST_IN
1cae0 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72  T64 && r>0.0 ) r
1caf0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1cb00 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d  return +1;.    }
1cb10 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65  .    s = (double
1cb20 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20  )i;.    if( s<r 
1cb30 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1cb40 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72   if( s>r ) retur
1cb50 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1cb60 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1cb70 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1cb80 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1cb90 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1cba0 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1cbb0 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1cbc0 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1cbd0 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1cbe0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1cbf0 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1cc00 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1cc10 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1cc20 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1cc30 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1cc40 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1cc50 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1cc60 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1cc70 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1cc80 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1cc90 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1cca0 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1ccb0 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1ccc0 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1ccd0 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1cce0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1ccf0 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1cd00 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1cd10 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1cd20 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1cd30 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1cd40 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1cd50 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1cd60 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1cd70 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1cd80 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1cd90 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1cda0 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1cdb0 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1cdc0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1cdd0 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1cde0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1cdf0 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1ce00 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1ce10 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1ce20 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1ce30 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1ce40 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1ce50 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1ce60 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1ce70 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1ce80 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1ce90 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1cea0 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ll);.  }..  /* A
1ceb0 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
1cec0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73  he two values is
1ced0 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20   a number.  */. 
1cee0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1cef0 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
1cf00 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66  _Real) ){.    if
1cf10 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1cf20 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1cf30 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1cf40 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1cf50 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1cf60 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1cf70 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1cf80 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1cf90 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1cfa0 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1cfb0 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20   & MEM_Real)!=0 
1cfc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1cfd0 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d  m1->u.r < pMem2-
1cfe0 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.r ) return -1
1cff0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1d000 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.r > pMem2->
1d010 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.r ) return +1;
1d020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1d030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d040 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
1d050 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1d060 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1d070 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1d080 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1d090 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
1d0a0 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
1d0b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d0c0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1d0d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d0e0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1d0f0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1d100 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
1d110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1d120 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74  turn -sqlite3Int
1d130 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1d140 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e  m2->u.i, pMem1->
1d150 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1d160 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1d170 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1d180 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b    }.    return +
1d190 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1d1a0 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1d1b0 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1d1c0 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1d1d0 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1d1e0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1d1f0 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1d200 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1d210 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1d220 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1d230 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1d240 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1d250 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1d260 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1d270 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1d280 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1d290 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1d2a0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1d2b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1d2c0 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1d2d0 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62  enc || pMem1->db
1d2e0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1d2f0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1d300 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1d310 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1d320 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1d330 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1d340 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1d350 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1d360 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1d370 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1d380 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1d390 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1d3a0 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1d3b0 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1d3c0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1d3d0 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1d3e0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1d3f0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1d400 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1d410 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1d420 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1d430 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1d440 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1d450 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1d460 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1d470 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1d480 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1d490 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1d4a0 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1d4b0 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1d4c0 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1d4d0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1d4e0 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1d4f0 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1d500 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1d510 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1d520 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1d530 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1d540 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1d550 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1d560 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1d570 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1d580 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1d590 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1d5a0 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1d5b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1d5c0 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1d5d0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1d5e0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1d5f0 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1d600 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1d610 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1d620 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1d630 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1d640 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1d650 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1d660 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1d670 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1d680 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1d690 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1d6a0 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1d6b0 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1d6c0 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1d6d0 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1d6e0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1d6f0 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1d700 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1d710 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1d720 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1d730 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1d740 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1d750 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1d760 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1d770 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1d780 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1d790 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1d7a0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1d7b0 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1d7c0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1d7d0 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1d7e0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1d7f0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1d800 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1d810 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1d820 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1d830 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1d840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1d850 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1d860 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1d870 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1d880 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1d890 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1d8a0 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d8b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d8c0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1d8d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1d8e0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1d8f0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1d900 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1d910 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1d920 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1d930 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1d940 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d950 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1d960 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1d970 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1d980 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1d990 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1d9a0 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1d9b0 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1d9c0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1d9d0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1d9e0 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1d9f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1da00 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1da10 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1da20 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1da30 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1da40 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1da50 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1da60 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1da70 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1da80 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1da90 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1daa0 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1dab0 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1dac0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1dad0 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1dae0 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1daf0 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1db00 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1db10 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1db20 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1db30 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1db40 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1db50 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1db60 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1db70 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1db80 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1db90 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1dba0 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1dbb0 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1dbc0 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1dbd0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1dbe0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1dbf0 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1dc00 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1dc10 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1dc20 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1dc30 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1dc40 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1dc50 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1dc60 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1dc70 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1dc80 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1dc90 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1dca0 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1dcb0 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1dcc0 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1dcd0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1dce0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1dcf0 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1dd00 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1dd10 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1dd20 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1dd30 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1dd40 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1dd50 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1dd60 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1dd70 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1dd80 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1dd90 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1dda0 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1ddb0 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1ddc0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1ddd0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1dde0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
1ddf0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1de00 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1de10 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1de20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1de30 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1de40 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1de50 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1de60 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1de70 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1de80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de90 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1dea0 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1deb0 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1dec0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1ded0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1dee0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1def0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1df00 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1df10 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1df20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1df30 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1df40 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1df50 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1df60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df70 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1df80 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1df90 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1dfa0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1dfb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1dfc0 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1dfd0 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1dfe0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1dff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e000 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1e010 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1e020 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1e030 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1e040 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1e050 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1e060 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1e070 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e080 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1e090 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1e0a0 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1e0b0 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1e0c0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1e0d0 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1e0e0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1e0f0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1e100 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1e110 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1e120 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1e130 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1e140 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1e150 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1e160 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1e170 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1e180 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1e190 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1e1a0 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1e1b0 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1e1c0 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1e1d0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1e1e0 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1e1f0 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1e200 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1e210 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1e220 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1e230 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1e240 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1e250 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1e260 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1e270 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1e280 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1e290 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1e2a0 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1e2b0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1e2c0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1e2d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1e2e0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1e2f0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1e300 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
1e310 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
1e320 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1e330 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1e340 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1e350 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
1e360 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1e370 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1e380 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1e390 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1e3a0 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1e3b0 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1e3c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1e3d0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1e3e0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1e3f0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1e400 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1e410 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1e420 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1e430 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1e440 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1e450 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1e460 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
1e470 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
1e480 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1e490 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
1e4a0 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1e4b0 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1e4c0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1e4d0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1e4e0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1e4f0 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1e500 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1e510 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1e520 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1e530 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1e540 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1e550 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1e560 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1e570 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1e580 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1e590 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1e5a0 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
1e5b0 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1e5c0 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
1e5d0 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
1e5e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1e5f0 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1e600 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1e610 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1e620 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1e630 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1e640 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1e650 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1e660 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1e670 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1e680 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1e690 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1e6a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1e6b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1e6c0 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1e6d0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1e6e0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1e6f0 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1e700 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1e710 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1e720 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1e730 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
1e740 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
1e750 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
1e760 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
1e770 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
1e780 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
1e790 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
1e7a0 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
1e7b0 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1e7c0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
1e7d0 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
1e7e0 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
1e7f0 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
1e800 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
1e810 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
1e820 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
1e830 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
1e840 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1e850 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1e860 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1e870 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1e880 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e890 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1e8a0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1e8b0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1e8c0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1e8d0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1e8e0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1e8f0 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
1e900 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
1e910 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1e920 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1e930 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
1e940 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
1e950 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1e960 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e980 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e990 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1e9a0 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
1e9b0 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
1e9c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1e9d0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1e9e0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1e9f0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1ea00 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1ea10 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1ea20 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1ea30 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1ea40 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1ea50 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1ea60 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1ea70 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1ea80 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1ea90 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1eaa0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1eab0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1eac0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1ead0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1eae0 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1eaf0 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1eb00 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1eb10 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1eb20 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1eb30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1eb40 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1eb50 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1eb60 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1eb70 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1eb80 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1eb90 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1eba0 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1ebb0 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1ebc0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1ebd0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1ebe0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1ebf0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1ec00 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1ec10 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1ec20 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1ec30 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1ec40 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1ec50 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1ec60 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1ec70 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1ec80 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1ec90 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1eca0 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1ecb0 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1ecc0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1ecd0 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1ece0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1ecf0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1ed00 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1ed10 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1ed20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ed30 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1ed40 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1ed50 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1ed60 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1ed70 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1ed80 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1ed90 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1eda0 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1edb0 70 52 68 73 2d 3e 6e 3b 20 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 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1edf0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1ee00 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1ee10 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1ee20 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1ee30 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1ee40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ee50 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1ee60 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1ee70 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1ee80 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1ee90 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1eea0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1eeb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1eec0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1eed0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1eee0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1eef0 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1ef00 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1ef10 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1ef20 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1ef30 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1ef40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1ef50 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1ef60 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1ef70 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1ef80 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1ef90 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1efa0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1efb0 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1efc0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1efd0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1efe0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1eff0 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1f000 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1f010 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1f020 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1f030 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1f040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f050 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1f060 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1f070 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f080 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1f090 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1f0a0 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1f0b0 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1f0c0 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1f0d0 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1f0e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f0f0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1f100 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1f110 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1f120 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1f130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1f140 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1f150 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1f160 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1f170 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1f180 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1f190 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1f1a0 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1f1b0 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1f1c0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1f1d0 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1f1e0 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1f1f0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1f200 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1f210 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1f220 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1f230 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1f240 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1f250 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1f260 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1f270 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1f280 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1f290 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1f2a0 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1f2b0 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1f2c0 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1f2d0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1f2e0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1f2f0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1f300 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1f310 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1f320 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1f330 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1f340 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1f350 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1f360 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1f370 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1f380 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1f390 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
1f3a0 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1f3b0 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1f3c0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1f3d0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1f3e0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1f3f0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1f400 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1f410 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
1f420 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
1f430 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
1f440 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1f450 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1f460 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
1f470 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
1f480 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
1f490 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1f4a0 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
1f4b0 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
1f4c0 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
1f4d0 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
1f4e0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1f4f0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
1f500 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1f510 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1f520 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1f530 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1f540 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
1f550 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1f560 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1f570 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1f580 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1f590 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
1f5a0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1f5b0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1f5c0 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1f5d0 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1f5e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1f5f0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1f600 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1f610 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
1f620 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
1f630 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
1f640 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
1f650 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1f660 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1f670 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
1f680 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
1f690 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
1f6a0 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
1f6b0 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
1f6c0 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
1f6d0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
1f6e0 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
1f6f0 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
1f700 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
1f710 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
1f720 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
1f730 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
1f740 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1f750 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1f760 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1f770 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1f780 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1f790 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
1f7a0 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1f7b0 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
1f7c0 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
1f7d0 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
1f7e0 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
1f7f0 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
1f800 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
1f810 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
1f820 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
1f830 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
1f840 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  64 v = pPKey2->a
1f850 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36  Mem[0].u.i;.  i6
1f860 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
1f870 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
1f880 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
1f890 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
1f8a0 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
1f8b0 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
1f8c0 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
1f8d0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
1f8e0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
1f8f0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
1f900 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
1f910 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
1f920 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
1f930 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1f940 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1f950 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1f960 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1f970 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
1f980 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1f990 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1f9a0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1f9b0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
1f9c0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
1f9d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1f9e0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
1f9f0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
1fa00 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
1fa10 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
1fa20 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1fa30 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1fa40 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fa50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fa60 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1fa70 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1fa80 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
1fa90 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1faa0 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
1fab0 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1fac0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
1fad0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
1fae0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1faf0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
1fb00 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1fb10 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
1fb20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
1fb30 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
1fb40 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
1fb50 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1fb60 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1fb70 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1fb80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1fb90 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
1fba0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1fbb0 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
1fbc0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1fbd0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1fbe0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1fbf0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1fc00 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
1fc10 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
1fc20 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1fc30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1fc40 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
1fc50 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
1fc60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1fc70 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
1fc80 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
1fc90 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
1fca0 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
1fcb0 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
1fcc0 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
1fcd0 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
1fce0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
1fcf0 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
1fd00 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
1fd10 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
1fd20 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
1fd30 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
1fd40 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
1fd50 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
1fd60 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
1fd70 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
1fd80 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
1fd90 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
1fda0 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
1fdb0 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
1fdc0 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
1fdd0 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
1fde0 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
1fdf0 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
1fe00 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
1fe10 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
1fe20 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
1fe30 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
1fe40 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
1fe50 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1fe60 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
1fe70 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
1fe80 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
1fe90 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1fea0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1feb0 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1fec0 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ey2);.  }..  if(
1fed0 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
1fee0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
1fef0 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
1ff00 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
1ff10 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
1ff20 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
1ff30 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
1ff40 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
1ff50 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
1ff60 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
1ff70 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
1ff80 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
1ff90 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
1ffa0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1ffb0 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1ffc0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1ffd0 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65  pPKey2, 1);.  }e
1ffe0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
1fff0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
20000 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
20010 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65   equal and there
20020 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67   are no trailing
20030 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
20040 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  Return pPKey2->d
20050 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69  efault_rc in thi
20060 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  s case. */.    r
20070 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
20080 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b  ault_rc;.    pPK
20090 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
200a0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
200b0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
200c0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
200d0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
200e0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ) );.  return re
200f0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
20100 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
20110 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
20120 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
20130 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
20140 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
20150 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
20160 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
20170 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
20180 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
20190 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
201a0 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
201b0 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
201c0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
201d0 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
201e0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
201f0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
20200 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
20210 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20220 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20230 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
20240 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
20250 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
20260 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
20270 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
20280 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
20290 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
202a0 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20  nst u8 *aKey1 = 
202b0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
202c0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
202d0 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ype;.  int res;.
202e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
202f0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  2->aMem[0].flags
20300 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
20310 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
20320 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
20330 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20340 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
20350 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28  ;.  getVarint32(
20360 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61  &aKey1[1], seria
20370 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73  l_type);.  if( s
20380 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
20390 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
203a0 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28  2->r1;      /* (
203b0 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
203c0 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75  a number or a nu
203d0 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ll */.  }else if
203e0 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
203f0 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20  & 0x01) ){ .    
20400 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
20410 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
20420 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f  /nKey1) is a blo
20430 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b */.  }else{.  
20440 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
20450 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e  int nStr;.    in
20460 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b  t szHdr = aKey1[
20470 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20  0];..    nStr = 
20480 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
20490 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73   / 2;.    if( (s
204a0 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e  zHdr + nStr) > n
204b0 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50  Key1 ){.      pP
204c0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
204d0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
204e0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
204f0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43  eturn 0;    /* C
20500 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
20510 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49   }.    nCmp = MI
20520 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  N( pPKey2->aMem[
20530 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20  0].n, nStr );.  
20540 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26    res = memcmp(&
20550 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50  aKey1[szHdr], pP
20560 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c  Key2->aMem[0].z,
20570 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28   nCmp);..    if(
20580 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
20590 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50   res = nStr - pP
205a0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b  Key2->aMem[0].n;
205b0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
205c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
205d0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
205e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
205f0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
20600 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20610 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
20620 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
20630 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20640 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70           res = p
20650 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20660 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  c;.          pPK
20670 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
20680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20690 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
206a0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
206b0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
206c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
206d0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
206e0 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
206f0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
20700 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
20710 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
20720 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
20730 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
20740 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
20750 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
20760 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
20770 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
20780 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20   res).       || 
20790 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20  CORRUPT_DB.     
207a0 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
207b0 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
207c0 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
207d0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
207e0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
207f0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
20800 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20810 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65  are() compatible
20820 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69   function.** sui
20830 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72  table for compar
20840 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72  ing serialized r
20850 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e  ecords to the un
20860 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61  packed record pa
20870 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
20880 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
20890 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73  .RecordCompare s
208a0 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
208b0 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65  mpare(UnpackedRe
208c0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76  cord *p){.  /* v
208d0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
208e0 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69  reInt() and vari
208f0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  ntRecordCompareS
20900 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73  tring() both ass
20910 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ume.  ** that th
20920 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
20930 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63   varint that occ
20940 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74  urs at the start
20950 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a   of each record.
20960 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73    ** fits in a s
20970 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e  ingle byte (i.e.
20980 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29   is 127 or less)
20990 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  . varintRecordCo
209a0 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20  mpareInt().  ** 
209b0 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
209c0 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
209d0 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65  overread a buffe
209e0 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68  r by at least th
209f0 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  e .  ** maximum 
20a00 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68  possible legal h
20a10 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20  eader size plus 
20a20 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65  8 bytes. Because
20a30 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67   there is.  ** g
20a40 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
20a50 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74  at least 74 (but
20a60 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20   not 136) bytes 
20a70 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f  of padding follo
20a80 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62  wing each.  ** b
20a90 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
20aa0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
20ab0 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61  areInt() this ma
20ac0 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e  kes it convenien
20ad0 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20  t to.  ** limit 
20ae0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
20af0 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74  header to 64 byt
20b00 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  es in cases wher
20b10 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  e the first fiel
20b20 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  d.  ** is an int
20b30 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger..  **.  ** 
20b40 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  The easiest way 
20b50 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
20b60 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73  limit is to cons
20b70 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64  ider only record
20b80 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66  s with.  ** 13 f
20b90 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49  ields or less. I
20ba0 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  f the first fiel
20bb0 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  d is an integer,
20bc0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   the maximum leg
20bd0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73  al.  ** header s
20be0 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31  ize is (12*5 + 1
20bf0 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f   + 1) bytes.  */
20c00 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49  .  if( (p->pKeyI
20c10 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d  nfo->nField + p-
20c20 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
20c30 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  ld)<=13 ){.    i
20c40 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
20c50 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
20c60 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
20c70 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
20c80 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
20c90 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
20ca0 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
20cb0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
20cc0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
20cd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
20ce0 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
20cf0 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
20d00 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
20d10 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
20d20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
20d30 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
20d40 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
20d50 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
20d60 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
20d70 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
20d80 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
20d90 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
20da0 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
20db0 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
20dc0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
20dd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
20de0 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
20df0 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
20e00 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
20e10 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
20e20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
20e30 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
20e40 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
20e50 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
20e60 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
20e70 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
20e80 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
20e90 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
20ea0 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
20eb0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
20ec0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
20ed0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
20ee0 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
20ef0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
20f00 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
20f10 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
20f20 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
20f30 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
20f40 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
20f50 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
20f60 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
20f70 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
20f80 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
20f90 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
20fa0 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
20fb0 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
20fc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
20fd0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
20fe0 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
20ff0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
21000 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
21010 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
21020 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
21030 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21040 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
21050 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
21060 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
21070 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
21080 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
21090 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
210a0 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
210b0 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
210c0 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
210d0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
210e0 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
210f0 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
21100 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
21110 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
21120 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
21130 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
21140 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
21150 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
21160 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
21170 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21180 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
21190 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
211a0 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
211b0 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
211c0 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
211d0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
211e0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
211f0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
21200 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
21210 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
21220 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
21230 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
21240 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
21250 20 29 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20   );     /* pCur 
21260 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20  is always valid 
21270 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f  so KeySize canno
21280 74 20 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65  t fail */.  asse
21290 72 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20  rt( (nCellKey & 
212a0 53 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d  SQLITE_MAX_U32)=
212b0 3d 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29  =(u64)nCellKey )
212c0 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20  ;..  /* Read in 
212d0 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e  the complete con
212e0 74 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65  tent of the inde
212f0 78 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c  x entry */.  sql
21300 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
21310 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63  &m, db, 0);.  rc
21320 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65   = sqlite3VdbeMe
21330 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c  mFromBtree(pCur,
21340 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65   0, (u32)nCellKe
21350 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28  y, 1, &m);.  if(
21360 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
21370 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  n rc;.  }..  /* 
21380 54 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20  The index entry 
21390 6d 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20  must begin with 
213a0 61 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f  a header size */
213b0 0a 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69  .  (void)getVari
213c0 6e 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73  nt32((u8*)m.z, s
213d0 7a 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73  zHdr);.  testcas
213e0 65 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20  e( szHdr==3 );. 
213f0 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72   testcase( szHdr
21400 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75  ==m.n );.  if( u
21410 6e 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20  nlikely(szHdr<3 
21420 7c 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e  || (int)szHdr>m.
21430 6e 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  n) ){.    goto i
21440 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
21450 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ion;.  }..  /* T
21460 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66  he last field of
21470 20 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c   the index shoul
21480 64 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  d be an integer 
21490 2d 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a  - the ROWID..  *
214a0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
214b0 65 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61  e last entry rea
214c0 6c 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65  lly is an intege
214d0 72 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65  r. */.  (void)ge
214e0 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26  tVarint32((u8*)&
214f0 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79  m.z[szHdr-1], ty
21500 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74  peRowid);.  test
21510 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21520 3d 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =1 );.  testcase
21530 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29  ( typeRowid==2 )
21540 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21550 70 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20  peRowid==3 );.  
21560 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21570 77 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74  wid==4 );.  test
21580 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21590 3d 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =5 );.  testcase
215a0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29  ( typeRowid==6 )
215b0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
215c0 70 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20  peRowid==8 );.  
215d0 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
215e0 77 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20  wid==9 );.  if( 
215f0 75 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77  unlikely(typeRow
21600 69 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69  id<1 || typeRowi
21610 64 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d>9 || typeRowid
21620 3d 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ==7) ){.    goto
21630 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75   idx_rowid_corru
21640 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e  ption;.  }.  len
21650 52 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53  Rowid = sqlite3S
21660 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79  mallTypeSizes[ty
21670 70 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74  peRowid];.  test
21680 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d  case( (u32)m.n==
21690 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29  szHdr+lenRowid )
216a0 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
216b0 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b  ((u32)m.n<szHdr+
216c0 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20  lenRowid) ){.   
216d0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
216e0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
216f0 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20  .  /* Fetch the 
21700 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20  integer off the 
21710 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78  end of the index
21720 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c   record */.  sql
21730 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
21740 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d  t((u8*)&m.z[m.n-
21750 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52  lenRowid], typeR
21760 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f  owid, &v);.  *ro
21770 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73  wid = v.u.i;.  s
21780 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
21790 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
217a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
217b0 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66   /* Jump here if
217c0 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
217d0 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64  tion is detected
217e0 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65   after m has bee
217f0 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  n.  ** allocated
21800 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62  .  Free the m ob
21810 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20  ject and return 
21820 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
21830 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  */.idx_rowid_cor
21840 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63  ruption:.  testc
21850 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21  ase( m.szMalloc!
21860 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  =0 );.  sqlite3V
21870 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
21880 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21890 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
218a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72  .}../*.** Compar
218b0 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65  e the key of the
218c0 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61   index entry tha
218d0 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70  t cursor pC is p
218e0 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e  ointing to again
218f0 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74  st.** the key st
21900 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65  ring in pUnpacke
21910 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a  d.  Write into *
21920 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a  pRes a number.**
21930 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76   that is negativ
21940 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
21950 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65  tive if pC is le
21960 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
21970 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72  o,.** or greater
21980 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e   than pUnpacked.
21990 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
219a0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a  OK on success..*
219b0 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69  *.** pUnpacked i
219c0 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64  s either created
219d0 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64   without a rowid
219e0 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64   or is truncated
219f0 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f   so that it.** o
21a00 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61  mits the rowid a
21a10 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20  t the end.  The 
21a20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
21a30 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
21a40 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65  try.** is ignore
21a50 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63  d as well.  Henc
21a60 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  e, this routine 
21a70 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68  only compares th
21a80 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f  e prefixes .** o
21a90 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72  f the keys prior
21aa0 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f   to the final ro
21ab0 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74  wid, not the ent
21ac0 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20  ire key..*/.int 
21ad0 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65  sqlite3VdbeIdxKe
21ae0 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69  yCompare(.  sqli
21af0 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
21b00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21b10 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  Database connect
21b20 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72  ion */.  VdbeCur
21b30 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20  sor *pC,        
21b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21b50 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61   cursor to compa
21b60 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20  re against */.  
21b70 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
21b80 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20  pUnpacked,      
21b90 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72   /* Unpacked ver
21ba0 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20  sion of key */. 
21bb0 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20   int *res       
21bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21bd0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63    /* Write the c
21be0 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74  omparison result
21bf0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36   here */.){.  i6
21c00 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a  4 nCellKey = 0;.
21c10 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75    int rc;.  BtCu
21c20 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65  rsor *pCur;.  Me
21c30 6d 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  m m;..  assert( 
21c40 70 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55  pC->eCurType==CU
21c50 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
21c60 20 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70   pCur = pC->uc.p
21c70 43 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74  Cursor;.  assert
21c80 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
21c90 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
21ca0 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) );.  VVA_ONLY(
21cb0 72 63 20 3d 29 20 73 71 6c 69 74 65 33 42 74 72  rc =) sqlite3Btr
21cc0 65 65 4b 65 79 53 69 7a 65 28 70 43 75 72 2c 20  eeKeySize(pCur, 
21cd0 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73  &nCellKey);.  as
21ce0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
21cf0 5f 4f 4b 20 29 3b 20 20 20 20 2f 2a 20 70 43 75  _OK );    /* pCu
21d00 72 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  r is always vali
21d10 64 20 73 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e  d so KeySize can
21d20 6e 6f 74 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a  not fail */.  /*
21d30 20 6e 43 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61   nCellKey will a
21d40 6c 77 61 79 73 20 62 65 20 62 65 74 77 65 65 6e  lways be between
21d50 20 30 20 61 6e 64 20 30 78 66 66 66 66 66 66 66   0 and 0xfffffff
21d60 66 20 62 65 63 61 75 73 65 20 6f 66 20 74 68 65  f because of the
21d70 20 77 61 79 0a 20 20 2a 2a 20 74 68 61 74 20 62   way.  ** that b
21d80 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21d90 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 47 65  () and sqlite3Ge
21da0 74 56 61 72 69 6e 74 33 32 28 29 20 61 72 65 20  tVarint32() are 
21db0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20  implemented */. 
21dc0 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30   if( nCellKey<=0
21dd0 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37   || nCellKey>0x7
21de0 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20 20 2a  fffffff ){.    *
21df0 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  res = 0;.    ret
21e00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21e10 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  PT_BKPT;.  }.  s
21e20 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
21e30 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20  t(&m, db, 0);.  
21e40 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
21e50 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70 43 75  MemFromBtree(pCu
21e60 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c  r, 0, (u32)nCell
21e70 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69  Key, 1, &m);.  i
21e80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
21e90 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72  urn rc;.  }.  *r
21ea0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
21eb0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e  RecordCompare(m.
21ec0 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65  n, m.z, pUnpacke
21ed0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d);.  sqlite3Vdb
21ee0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
21ef0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21f00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
21f10 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
21f20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20  the value to be 
21f30 72 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73  returned by subs
21f40 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a  equent calls to.
21f50 2a 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  ** sqlite3_chang
21f60 65 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61  es() on the data
21f70 62 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27  base handle 'db'
21f80 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  . .*/.void sqlit
21f90 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
21fa0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
21fb0 74 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73  t nChange){.  as
21fc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21fd0 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
21fe0 65 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68  ex) );.  db->nCh
21ff0 61 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a  ange = nChange;.
22000 20 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e    db->nTotalChan
22010 67 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d  ge += nChange;.}
22020 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c  ../*.** Set a fl
22030 61 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74  ag in the vdbe t
22040 6f 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  o update the cha
22050 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e  nge counter when
22060 20 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64   it is finalised
22070 0a 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f  .** or reset..*/
22080 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
22090 65 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64  eCountChanges(Vd
220a0 62 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61  be *v){.  v->cha
220b0 6e 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a  ngeCntOn = 1;.}.
220c0 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72  ./*.** Mark ever
220d0 79 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  y prepared state
220e0 6d 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20  ment associated 
220f0 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
22100 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73  connection.** as
22110 20 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   expired..**.** 
22120 41 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65  An expired state
22130 6d 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20  ment means that 
22140 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
22150 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
22160 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20  s.** recommend. 
22170 20 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69   Statements expi
22180 72 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68  re when things h
22190 61 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20  appen that make 
221a0 74 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d  their.** program
221b0 73 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d  s obsolete.  Rem
221c0 6f 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e  oving user-defin
221d0 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20  ed functions or 
221e0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
221f0 75 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67  uences, or chang
22200 69 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61  ing an authoriza
22210 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72  tion function ar
22220 65 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a  e the types of.*
22230 2a 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61  * things that ma
22240 6b 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  ke prepared stat
22250 65 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e  ements obsolete.
22260 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22270 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
22280 61 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33  atements(sqlite3
22290 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70   *db){.  Vdbe *p
222a0 3b 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e  ;.  for(p = db->
222b0 70 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70  pVdbe; p; p=p->p
222c0 4e 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78  Next){.    p->ex
222d0 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  pired = 1;.  }.}
222e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
222f0 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f  he database asso
22300 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
22310 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  Vdbe..*/.sqlite3
22320 20 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28   *sqlite3VdbeDb(
22330 56 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75  Vdbe *v){.  retu
22340 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  rn v->db;.}../*.
22350 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
22360 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  ter to an sqlite
22370 33 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72  3_value structur
22380 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
22390 20 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20   value bound.** 
223a0 70 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f  parameter iVar o
223b0 66 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20  f VM v. Except, 
223c0 69 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20  if the value is 
223d0 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74  an SQL NULL, ret
223e0 75 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61  urn .** 0 instea
223f0 64 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20  d. Unless it is 
22400 4e 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69  NULL, apply affi
22410 6e 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66  nity aff (one of
22420 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f   the SQLITE_AFF_
22430 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20  *.** constants) 
22440 74 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66  to the value bef
22450 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74  ore returning it
22460 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
22470 72 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20  rned value must 
22480 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20  be freed by the 
22490 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c  caller using sql
224a0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e  ite3ValueFree().
224b0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75  .*/.sqlite3_valu
224c0 65 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  e *sqlite3VdbeGe
224d0 74 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65  tBoundValue(Vdbe
224e0 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75   *v, int iVar, u
224f0 38 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74  8 aff){.  assert
22500 28 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66  ( iVar>0 );.  if
22510 28 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a  ( v ){.    Mem *
22520 70 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b  pMem = &v->aVar[
22530 69 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28  iVar-1];.    if(
22540 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   0==(pMem->flags
22550 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a   & MEM_Null) ){.
22560 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
22570 6c 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69  lue *pRet = sqli
22580 74 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64  te3ValueNew(v->d
22590 62 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  b);.      if( pR
225a0 65 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  et ){.        sq
225b0 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79  lite3VdbeMemCopy
225c0 28 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d  ((Mem *)pRet, pM
225d0 65 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  em);.        sql
225e0 69 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66  ite3ValueApplyAf
225f0 66 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66  finity(pRet, aff
22600 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a  , SQLITE_UTF8);.
22610 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
22620 74 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d  turn pRet;.    }
22630 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
22640 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67  .}../*.** Config
22650 75 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65  ure SQL variable
22660 20 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69   iVar so that bi
22670 6e 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75  nding a new valu
22680 65 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a  e to it signals.
22690 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65  ** to sqlite3_re
226a0 6f 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20  optimize() that 
226b0 72 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65  re-preparing the
226c0 20 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72   statement may r
226d0 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65  esult.** in a be
226e0 74 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e  tter query plan.
226f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
22700 56 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56  VdbeSetVarmask(V
22710 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72  dbe *v, int iVar
22720 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61  ){.  assert( iVa
22730 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61  r>0 );.  if( iVa
22740 72 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65  r>32 ){.    v->e
22750 78 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66  xpmask = 0xfffff
22760 66 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  fff;.  }else{.  
22770 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20    v->expmask |= 
22780 28 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72  ((u32)1 << (iVar
22790 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  -1));.  }.}..#if
227a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
227b0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a  _VIRTUALTABLE./*
227c0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72  .** Transfer err
227d0 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
227e0 66 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f  from an sqlite3_
227f0 76 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65  vtab.zErrMsg (te
22800 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
22810 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
22820 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
22830 6c 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65  loc) into a Vdbe
22840 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
22850 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
22860 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
22870 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63   sqlite3DbMalloc
22880 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
22890 65 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d  e3VtabImportErrm
228a0 73 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69  sg(Vdbe *p, sqli
228b0 74 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29  te3_vtab *pVtab)
228c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
228d0 3d 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74  = p->db;.  sqlit
228e0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
228f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
22900 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
22910 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74  DbStrDup(db, pVt
22920 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
22930 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74  sqlite3_free(pVt
22940 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ab->zErrMsg);.  
22950 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d  pVtab->zErrMsg =
22960 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   0;.}.#endif /* 
22970 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
22980 55 41 4c 54 41 42 4c 45 20 2a 2f 0a              UALTABLE */.