/ Hex Artifact Content
Login

Artifact 7a09b945ebc4893e3a15bd68c4634d4aff34ebd5:


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 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0780: 53 51 4c 20 61 73 73 6f 63 69 61 74 65 64 20 77  SQL associated w
0790: 69 74 68 20 61 20 70 72 65 70 61 72 65 64 20 73  ith a prepared s
07a0: 74 61 74 65 6d 65 6e 74 20 77 69 74 68 0a 2a 2a  tatement with.**
07b0: 20 62 6f 75 6e 64 20 70 61 72 61 6d 65 74 65 72   bound parameter
07c0: 73 20 65 78 70 61 6e 64 65 64 2e 20 20 53 70 61  s expanded.  Spa
07d0: 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 72  ce to hold the r
07e0: 65 74 75 72 6e 65 64 20 73 74 72 69 6e 67 20 69  eturned string i
07f0: 73 0a 2a 2a 20 6f 62 74 61 69 6e 65 64 20 66 72  s.** obtained fr
0800: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
0810: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 65 72  c().  The caller
0820: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
0830: 66 6f 72 0a 2a 2a 20 66 72 65 65 69 6e 67 20 74  for.** freeing t
0840: 68 65 20 72 65 74 75 72 6e 65 64 20 73 74 72 69  he returned stri
0850: 6e 67 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ng by passing it
0860: 20 74 6f 20 73 71 6c 69 74 65 33 5f 66 72 65 65   to sqlite3_free
0870: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51  ()..**.** The SQ
0880: 4c 49 54 45 5f 54 52 41 43 45 5f 53 49 5a 45 5f  LITE_TRACE_SIZE_
0890: 4c 49 4d 49 54 20 70 75 74 73 20 61 6e 20 75 70  LIMIT puts an up
08a0: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
08b0: 20 73 69 7a 65 20 6f 66 0a 2a 2a 20 65 78 70 61   size of.** expa
08c0: 6e 64 65 64 20 62 6f 75 6e 64 20 70 61 72 61 6d  nded bound param
08d0: 65 74 65 72 73 2e 0a 2a 2f 0a 63 68 61 72 20 2a  eters..*/.char *
08e0: 73 71 6c 69 74 65 33 5f 65 78 70 61 6e 64 65 64  sqlite3_expanded
08f0: 5f 73 71 6c 28 73 71 6c 69 74 65 33 5f 73 74 6d  _sql(sqlite3_stm
0900: 74 20 2a 70 53 74 6d 74 29 7b 0a 23 69 66 64 65  t *pStmt){.#ifde
0910: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
0920: 41 43 45 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ACE.  return 0;.
0930: 23 65 6c 73 65 0a 20 20 56 64 62 65 20 2a 70 20  #else.  Vdbe *p 
0940: 3d 20 28 56 64 62 65 20 2a 29 70 53 74 6d 74 3b  = (Vdbe *)pStmt;
0950: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
0960: 28 20 70 3d 3d 30 20 7c 7c 20 70 2d 3e 7a 53 71  ( p==0 || p->zSq
0970: 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
0980: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
0990: 5f 65 6e 74 65 72 28 70 2d 3e 64 62 2d 3e 6d 75  _enter(p->db->mu
09a0: 74 65 78 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  tex);.  z = sqli
09b0: 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
09c0: 28 70 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (p, p->zSql);.  
09d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
09e0: 61 76 65 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  ave(p->db->mutex
09f0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 23  );.  return z;.#
0a00: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  endif.}../*.** S
0a10: 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20  wap all content 
0a20: 62 65 74 77 65 65 6e 20 74 77 6f 20 56 44 42 45  between two VDBE
0a30: 20 73 74 72 75 63 74 75 72 65 73 2e 0a 2a 2f 0a   structures..*/.
0a40: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
0a50: 53 77 61 70 28 56 64 62 65 20 2a 70 41 2c 20 56  Swap(Vdbe *pA, V
0a60: 64 62 65 20 2a 70 42 29 7b 0a 20 20 56 64 62 65  dbe *pB){.  Vdbe
0a70: 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a 20 20 63   tmp, *pTmp;.  c
0a80: 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20 61 73 73  har *zTmp;.  ass
0a90: 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d 70 42 2d  ert( pA->db==pB-
0aa0: 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20 3d 20 2a  >db );.  tmp = *
0ab0: 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a 70 42 3b  pA;.  *pA = *pB;
0ac0: 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b 0a 20 20  .  *pB = tmp;.  
0ad0: 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e 65 78 74  pTmp = pA->pNext
0ae0: 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74 20 3d 20  ;.  pA->pNext = 
0af0: 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 42 2d  pB->pNext;.  pB-
0b00: 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70 3b 0a 20  >pNext = pTmp;. 
0b10: 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 50 72 65   pTmp = pA->pPre
0b20: 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65 76 20 3d  v;.  pA->pPrev =
0b30: 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20 20 70 42   pB->pPrev;.  pB
0b40: 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d 70 3b 0a  ->pPrev = pTmp;.
0b50: 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e 7a 53 71    zTmp = pA->zSq
0b60: 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c 20 3d 20  l;.  pA->zSql = 
0b70: 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70 42 2d 3e  pB->zSql;.  pB->
0b80: 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a 20 20 70  zSql = zTmp;.  p
0b90: 42 2d 3e 69 73 50 72 65 70 61 72 65 56 32 20 3d  B->isPrepareV2 =
0ba0: 20 70 41 2d 3e 69 73 50 72 65 70 61 72 65 56 32   pA->isPrepareV2
0bb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 69 7a  ;.}../*.** Resiz
0bc0: 65 20 74 68 65 20 56 64 62 65 2e 61 4f 70 20 61  e the Vdbe.aOp a
0bd0: 72 72 61 79 20 73 6f 20 74 68 61 74 20 69 74 20  rray so that it 
0be0: 69 73 20 61 74 20 6c 65 61 73 74 20 6e 4f 70 20  is at least nOp 
0bf0: 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67 65 72 20  elements larger 
0c00: 0a 2a 2a 20 74 68 61 6e 20 69 74 73 20 63 75 72  .** than its cur
0c10: 72 65 6e 74 20 73 69 7a 65 2e 20 6e 4f 70 20 69  rent size. nOp i
0c20: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
0c30: 62 65 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20  be less than or 
0c40: 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 31 30 32 34  equal.** to 1024
0c50: 2f 73 69 7a 65 6f 66 28 4f 70 29 2e 0a 2a 2a 0a  /sizeof(Op)..**.
0c60: 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d 6f 66 2d  ** If an out-of-
0c70: 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20 6f 63 63  memory error occ
0c80: 75 72 73 20 77 68 69 6c 65 20 72 65 73 69 7a 69  urs while resizi
0c90: 6e 67 20 74 68 65 20 61 72 72 61 79 2c 20 72 65  ng the array, re
0ca0: 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e  turn.** SQLITE_N
0cb0: 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73 20 63 61  OMEM. In this ca
0cc0: 73 65 20 56 64 62 65 2e 61 4f 70 20 61 6e 64 20  se Vdbe.aOp and 
0cd0: 50 61 72 73 65 2e 6e 4f 70 41 6c 6c 6f 63 20 72  Parse.nOpAlloc r
0ce0: 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63 68 61 6e  emain .** unchan
0cf0: 67 65 64 20 28 74 68 69 73 20 69 73 20 73 6f 20  ged (this is so 
0d00: 74 68 61 74 20 61 6e 79 20 6f 70 63 6f 64 65 73  that any opcodes
0d10: 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f 63 61 74   already allocat
0d20: 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a 20 63 6f  ed can be .** co
0d30: 72 72 65 63 74 6c 79 20 64 65 61 6c 6c 6f 63 61  rrectly dealloca
0d40: 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
0d50: 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 56  he rest of the V
0d60: 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dbe)..*/.static 
0d70: 69 6e 74 20 67 72 6f 77 4f 70 41 72 72 61 79 28  int growOpArray(
0d80: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6e 4f 70  Vdbe *v, int nOp
0d90: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4e 65  ){.  VdbeOp *pNe
0da0: 77 3b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  w;.  Parse *p = 
0db0: 76 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 2f 2a  v->pParse;..  /*
0dc0: 20 54 68 65 20 53 51 4c 49 54 45 5f 54 45 53 54   The SQLITE_TEST
0dd0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0de0: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
0df0: 69 6f 6e 20 69 73 20 64 65 73 69 67 6e 65 64 20  ion is designed 
0e00: 74 6f 20 66 6f 72 63 65 0a 20 20 2a 2a 20 6d 6f  to force.  ** mo
0e10: 72 65 20 66 72 65 71 75 65 6e 74 20 72 65 61 6c  re frequent real
0e20: 6c 6f 63 73 20 61 6e 64 20 68 65 6e 63 65 20 70  locs and hence p
0e30: 72 6f 76 69 64 65 20 6d 6f 72 65 20 6f 70 70 6f  rovide more oppo
0e40: 72 74 75 6e 69 74 69 65 73 20 66 6f 72 20 0a 20  rtunities for . 
0e50: 20 2a 2a 20 73 69 6d 75 6c 61 74 65 64 20 4f 4f   ** simulated OO
0e60: 4d 20 66 61 75 6c 74 73 2e 20 20 53 51 4c 49 54  M faults.  SQLIT
0e70: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0e80: 54 52 45 53 53 20 69 73 20 67 65 6e 65 72 61 6c  TRESS is general
0e90: 6c 79 20 75 73 65 64 0a 20 20 2a 2a 20 64 75 72  ly used.  ** dur
0ea0: 69 6e 67 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  ing testing only
0eb0: 2e 20 20 57 69 74 68 20 53 51 4c 49 54 45 5f 54  .  With SQLITE_T
0ec0: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
0ed0: 53 53 20 67 72 6f 77 20 74 68 65 20 6f 70 20 61  SS grow the op a
0ee0: 72 72 61 79 0a 20 20 2a 2a 20 62 79 20 74 68 65  rray.  ** by the
0ef0: 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d 6f 75 6e 74   minimum* amount
0f00: 20 72 65 71 75 69 72 65 64 20 75 6e 74 69 6c 20   required until 
0f10: 74 68 65 20 73 69 7a 65 20 72 65 61 63 68 65 73  the size reaches
0f20: 20 35 31 32 2e 20 20 4e 6f 72 6d 61 6c 0a 20 20   512.  Normal.  
0f30: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 28 77 69  ** operation (wi
0f40: 74 68 6f 75 74 20 53 51 4c 49 54 45 5f 54 45 53  thout SQLITE_TES
0f50: 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53  T_REALLOC_STRESS
0f60: 29 20 69 73 20 74 6f 20 64 6f 75 62 6c 65 20 74  ) is to double t
0f70: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 2a 2a 20  he current.  ** 
0f80: 73 69 7a 65 20 6f 66 20 74 68 65 20 6f 70 20 61  size of the op a
0f90: 72 72 61 79 20 6f 72 20 61 64 64 20 31 4b 42 20  rray or add 1KB 
0fa0: 6f 66 20 73 70 61 63 65 2c 20 77 68 69 63 68 65  of space, whiche
0fb0: 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 20  ver is smaller. 
0fc0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
0fd0: 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54  _TEST_REALLOC_ST
0fe0: 52 45 53 53 0a 20 20 69 6e 74 20 6e 4e 65 77 20  RESS.  int nNew 
0ff0: 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 3e 3d  = (p->nOpAlloc>=
1000: 35 31 32 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  512 ? p->nOpAllo
1010: 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70 41 6c 6c 6f  c*2 : p->nOpAllo
1020: 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73 65 0a 20 20  c+nOp);.#else.  
1030: 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e 6e  int nNew = (p->n
1040: 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e 6e 4f 70  OpAlloc ? p->nOp
1050: 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e 74 29 28  Alloc*2 : (int)(
1060: 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29  1024/sizeof(Op))
1070: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1080: 4d 45 54 45 52 28 6e 4f 70 29 3b 0a 23 65 6e 64  METER(nOp);.#end
1090: 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  if..  assert( nO
10a0: 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65 6f 66 28  p<=(1024/sizeof(
10b0: 4f 70 29 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Op)) );.  assert
10c0: 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e 4f 70 41  ( nNew>=(p->nOpA
10d0: 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a 20 20 70  lloc+nOp) );.  p
10e0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 44 62 52  New = sqlite3DbR
10f0: 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 76 2d  ealloc(p->db, v-
1100: 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69 7a 65 6f  >aOp, nNew*sizeo
1110: 66 28 4f 70 29 29 3b 0a 20 20 69 66 28 20 70 4e  f(Op));.  if( pN
1120: 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e 73 7a 4f  ew ){.    p->szO
1130: 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69 74 65 33  pAlloc = sqlite3
1140: 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28 70 2d 3e  DbMallocSize(p->
1150: 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20 20 20 70  db, pNew);.    p
1160: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ->nOpAlloc = p->
1170: 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a 65 6f 66  szOpAlloc/sizeof
1180: 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e 61 4f 70  (Op);.    v->aOp
1190: 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a 20 20 72   = pNew;.  }.  r
11a0: 65 74 75 72 6e 20 28 70 4e 65 77 20 3f 20 53 51  eturn (pNew ? SQ
11b0: 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45  LITE_OK : SQLITE
11c0: 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b 0a 7d 0a  _NOMEM_BKPT);.}.
11d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
11e0: 45 42 55 47 0a 2f 2a 20 54 68 69 73 20 72 6f 75  EBUG./* This rou
11f0: 74 69 6e 65 20 69 73 20 6a 75 73 74 20 61 20 63  tine is just a c
1200: 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
1210: 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
1220: 69 6e 74 20 74 68 61 74 20 77 69 6c 6c 0a 2a 2a  int that will.**
1230: 20 66 69 72 65 20 61 66 74 65 72 20 65 61 63 68   fire after each
1240: 20 6f 70 63 6f 64 65 20 69 73 20 69 6e 73 65 72   opcode is inser
1250: 74 65 64 20 61 6e 64 20 64 69 73 70 6c 61 79 65  ted and displaye
1260: 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50 52 41 47  d using.** "PRAG
1270: 4d 41 20 76 64 62 65 5f 61 64 64 6f 70 74 72 61  MA vdbe_addoptra
1280: 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74 61 74 69  ce=on"..*/.stati
1290: 63 20 76 6f 69 64 20 74 65 73 74 5f 61 64 64 6f  c void test_addo
12a0: 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69  p_breakpoint(voi
12b0: 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  d){.  static int
12c0: 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b 3b 0a 7d   n = 0;.  n++;.}
12d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
12e0: 64 64 20 61 20 6e 65 77 20 69 6e 73 74 72 75 63  dd a new instruc
12f0: 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c 69 73 74  tion to the list
1300: 20 6f 66 20 69 6e 73 74 72 75 63 74 69 6f 6e 73   of instructions
1310: 20 63 75 72 72 65 6e 74 20 69 6e 20 74 68 65 0a   current in the.
1320: 2a 2a 20 56 44 42 45 2e 20 20 52 65 74 75 72 6e  ** VDBE.  Return
1330: 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
1340: 74 68 65 20 6e 65 77 20 69 6e 73 74 72 75 63 74  the new instruct
1350: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ion..**.** Param
1360: 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  eters:.**.**    
1370: 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
1380: 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 56  Pointer to the V
1390: 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20 6f 70 20  DBE.**.**    op 
13a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65               The
13b0: 20 6f 70 63 6f 64 65 20 66 6f 72 20 74 68 69 73   opcode for this
13c0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 0a   instruction.**.
13d0: 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c 20 70 33  **    p1, p2, p3
13e0: 20 20 20 20 20 20 4f 70 65 72 61 6e 64 73 0a 2a        Operands.*
13f0: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
1400: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
1410: 61 62 65 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20  abel() function 
1420: 74 6f 20 66 69 78 20 61 6e 20 61 64 64 72 65 73  to fix an addres
1430: 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20 73 71 6c  s and.** the sql
1440: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34  ite3VdbeChangeP4
1450: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 63  () function to c
1460: 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20  hange the value 
1470: 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20 6f 70 65  of the P4.** ope
1480: 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rand..*/.static 
1490: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
14a0: 69 6e 74 20 67 72 6f 77 4f 70 33 28 56 64 62 65  int growOp3(Vdbe
14b0: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
14c0: 20 70 31 2c 20 69 6e 74 20 70 32 2c 20 69 6e 74   p1, int p2, int
14d0: 20 70 33 29 7b 0a 20 20 61 73 73 65 72 74 28 20   p3){.  assert( 
14e0: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
14f0: 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29 3b 0a 20  loc<=p->nOp );. 
1500: 20 69 66 28 20 67 72 6f 77 4f 70 41 72 72 61 79   if( growOpArray
1510: 28 70 2c 20 31 29 20 29 20 72 65 74 75 72 6e 20  (p, 1) ) return 
1520: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  1;.  assert( p->
1530: 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63  pParse->nOpAlloc
1540: 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 72 65 74  >p->nOp );.  ret
1550: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1560: 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c  ddOp3(p, op, p1,
1570: 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69 6e 74 20   p2, p3);.}.int 
1580: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1590: 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f  3(Vdbe *p, int o
15a0: 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20 70  p, int p1, int p
15b0: 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69 6e  2, int p3){.  in
15c0: 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70  t i;.  VdbeOp *p
15d0: 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e 4f  Op;..  i = p->nO
15e0: 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  p;.  assert( p->
15f0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
1600: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65  C_INIT );.  asse
1610: 72 74 28 20 6f 70 3e 3d 30 20 26 26 20 6f 70 3c  rt( op>=0 && op<
1620: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1630: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1640: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72 65 74 75  c<=i ){.    retu
1650: 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c 20 6f 70  rn growOp3(p, op
1660: 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20  , p1, p2, p3);. 
1670: 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20   }.  p->nOp++;. 
1680: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
1690: 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  ];.  pOp->opcode
16a0: 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20 70 4f 70   = (u8)op;.  pOp
16b0: 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70 4f 70 2d  ->p5 = 0;.  pOp-
16c0: 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70 4f 70 2d  >p1 = p1;.  pOp-
16d0: 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70 4f 70 2d  >p2 = p2;.  pOp-
16e0: 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70 4f 70 2d  >p3 = p3;.  pOp-
16f0: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 70 4f 70  >p4.p = 0;.  pOp
1700: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
1710: 54 55 53 45 44 3b 0a 23 69 66 64 65 66 20 53 51  TUSED;.#ifdef SQ
1720: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
1730: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 70  AIN_COMMENTS.  p
1740: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30  Op->zComment = 0
1750: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  ;.#endif.#ifdef 
1760: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
1770: 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20  f( p->db->flags 
1780: 26 20 53 51 4c 49 54 45 5f 56 64 62 65 41 64 64  & SQLITE_VdbeAdd
1790: 6f 70 54 72 61 63 65 20 29 7b 0a 20 20 20 20 69  opTrace ){.    i
17a0: 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50  nt jj, kk;.    P
17b0: 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20 70  arse *pParse = p
17c0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20 20 66 6f  ->pParse;.    fo
17d0: 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51  r(jj=kk=0; jj<SQ
17e0: 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b  LITE_N_COLCACHE;
17f0: 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74   jj++){.      st
1800: 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
1810: 78 20 3d 20 70 50 61 72 73 65 2d 3e 61 43 6f 6c  x = pParse->aCol
1820: 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20 20 20 20  Cache + jj;.    
1830: 20 20 69 66 28 20 78 2d 3e 69 4c 65 76 65 6c 3e    if( x->iLevel>
1840: 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65  pParse->iCacheLe
1850: 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d  vel || x->iReg==
1860: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1870: 20 20 20 20 70 72 69 6e 74 66 28 22 20 72 5b 25      printf(" r[%
1880: 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20 78 2d 3e  d]={%d:%d}", x->
1890: 69 52 65 67 2c 20 78 2d 3e 69 54 61 62 6c 65 2c  iReg, x->iTable,
18a0: 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20   x->iColumn);.  
18b0: 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a      kk++;.    }.
18c0: 20 20 20 20 69 66 28 20 6b 6b 20 29 20 70 72 69      if( kk ) pri
18d0: 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 73  ntf("\n");.    s
18e0: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
18f0: 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61 4f 70 5b  p(0, i, &p->aOp[
1900: 69 5d 29 3b 0a 20 20 20 20 74 65 73 74 5f 61 64  i]);.    test_ad
1910: 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  dop_breakpoint()
1920: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66  ;.  }.#endif.#if
1930: 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
1940: 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65 73 20 3d  .  pOp->cycles =
1950: 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e 74 20 3d   0;.  pOp->cnt =
1960: 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   0;.#endif.#ifde
1970: 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
1980: 56 45 52 41 47 45 0a 20 20 70 4f 70 2d 3e 69 53  VERAGE.  pOp->iS
1990: 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23 65 6e 64  rcLine = 0;.#end
19a0: 69 66 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d  if.  return i;.}
19b0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
19c0: 41 64 64 4f 70 30 28 56 64 62 65 20 2a 70 2c 20  AddOp0(Vdbe *p, 
19d0: 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65 74 75 72  int op){.  retur
19e0: 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  n sqlite3VdbeAdd
19f0: 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(p, op, 0, 0,
1a00: 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74   0);.}.int sqlit
1a10: 65 33 56 64 62 65 41 64 64 4f 70 31 28 56 64 62  e3VdbeAddOp1(Vdb
1a20: 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e  e *p, int op, in
1a30: 74 20 70 31 29 7b 0a 20 20 72 65 74 75 72 6e 20  t p1){.  return 
1a40: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1a50: 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 30 2c 20  3(p, op, p1, 0, 
1a60: 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0);.}.int sqlite
1a70: 33 56 64 62 65 41 64 64 4f 70 32 28 56 64 62 65  3VdbeAddOp2(Vdbe
1a80: 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74   *p, int op, int
1a90: 20 70 31 2c 20 69 6e 74 20 70 32 29 7b 0a 20 20   p1, int p2){.  
1aa0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1ab0: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1ac0: 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d 0a 0a 2f  p1, p2, 0);.}../
1ad0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1ae0: 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64 69 74 69  for an unconditi
1af0: 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20 69 6e 73  onal jump to ins
1b00: 74 72 75 63 74 69 6f 6e 20 69 44 65 73 74 0a 2a  truction iDest.*
1b10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1b20: 65 47 6f 74 6f 28 56 64 62 65 20 2a 70 2c 20 69  eGoto(Vdbe *p, i
1b30: 6e 74 20 69 44 65 73 74 29 7b 0a 20 20 72 65 74  nt iDest){.  ret
1b40: 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41  urn sqlite3VdbeA
1b50: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47 6f 74 6f  ddOp3(p, OP_Goto
1b60: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 29 3b 0a  , 0, iDest, 0);.
1b70: 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63  }../* Generate c
1b80: 6f 64 65 20 74 6f 20 63 61 75 73 65 20 74 68 65  ode to cause the
1b90: 20 73 74 72 69 6e 67 20 7a 53 74 72 20 74 6f 20   string zStr to 
1ba0: 62 65 20 6c 6f 61 64 65 64 20 69 6e 74 6f 0a 2a  be loaded into.*
1bb0: 2a 20 72 65 67 69 73 74 65 72 20 69 44 65 73 74  * register iDest
1bc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1bd0: 64 62 65 4c 6f 61 64 53 74 72 69 6e 67 28 56 64  dbeLoadString(Vd
1be0: 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74  be *p, int iDest
1bf0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
1c00: 74 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  tr){.  return sq
1c10: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1c20: 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  p, OP_String8, 0
1c30: 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a 53 74 72  , iDest, 0, zStr
1c40: 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  , 0);.}../*.** G
1c50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1c60: 74 20 69 6e 69 74 69 61 6c 69 7a 65 73 20 6d 75  t initializes mu
1c70: 6c 74 69 70 6c 65 20 72 65 67 69 73 74 65 72 73  ltiple registers
1c80: 20 74 6f 20 73 74 72 69 6e 67 20 6f 72 20 69 6e   to string or in
1c90: 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e  teger.** constan
1ca0: 74 73 2e 20 20 54 68 65 20 72 65 67 69 73 74 65  ts.  The registe
1cb0: 72 73 20 62 65 67 69 6e 20 77 69 74 68 20 69 44  rs begin with iD
1cc0: 65 73 74 20 61 6e 64 20 69 6e 63 72 65 61 73 65  est and increase
1cd0: 20 63 6f 6e 73 65 63 75 74 69 76 65 6c 79 2e 0a   consecutively..
1ce0: 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74 65 72 20  ** One register 
1cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 66  is initialized f
1d00: 6f 72 20 65 61 63 68 20 63 68 61 72 61 63 67 74  or each characgt
1d10: 65 72 20 69 6e 20 7a 54 79 70 65 73 5b 5d 2e 20  er in zTypes[]. 
1d20: 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20 22 73 22   For each.** "s"
1d30: 20 63 68 61 72 61 63 74 65 72 20 69 6e 20 7a 54   character in zT
1d40: 79 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69  ypes[], the regi
1d50: 73 74 65 72 20 69 73 20 61 20 73 74 72 69 6e 67  ster is a string
1d60: 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   if the argument
1d70: 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55 4c 4c 2c   is.** not NULL,
1d80: 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69 66 20 74   or OP_Null if t
1d90: 68 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75  he value is a nu
1da0: 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20 46 6f 72  ll pointer.  For
1db0: 20 65 61 63 68 20 22 69 22 20 63 68 61 72 61 63   each "i" charac
1dc0: 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79 70 65 73  ter.** in zTypes
1dd0: 5b 5d 2c 20 74 68 65 20 72 65 67 69 73 74 65 72  [], the register
1de0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
1df0: 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 2a  to an integer..*
1e00: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
1e10: 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56 64 62 65  beMultiLoad(Vdbe
1e20: 20 2a 70 2c 20 69 6e 74 20 69 44 65 73 74 2c 20   *p, int iDest, 
1e30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
1e40: 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  es, ...){.  va_l
1e50: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 69 3b  ist ap;.  int i;
1e60: 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 76 61 5f  .  char c;.  va_
1e70: 73 74 61 72 74 28 61 70 2c 20 7a 54 79 70 65 73  start(ap, zTypes
1e80: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
1e90: 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29 21 3d 30   = zTypes[i])!=0
1ea0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1eb0: 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20 20 20 20  c=='s' ){.      
1ec0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1ed0: 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
1ee0: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
1ef0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
1f00: 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50 5f 4e 75  (p, z==0 ? OP_Nu
1f10: 6c 6c 20 3a 20 4f 50 5f 53 74 72 69 6e 67 38 2c  ll : OP_String8,
1f20: 20 30 2c 20 69 44 65 73 74 2b 2b 2c 20 30 2c 20   0, iDest++, 0, 
1f30: 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  z, 0);.    }else
1f40: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1f50: 63 3d 3d 27 69 27 20 29 3b 0a 20 20 20 20 20 20  c=='i' );.      
1f60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1f70: 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  2(p, OP_Integer,
1f80: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1f90: 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20 20 20 20  , iDest++);.    
1fa0: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
1fb0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  p);.}../*.** Add
1fc0: 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20   an opcode that 
1fd0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20  includes the p4 
1fe0: 76 61 6c 75 65 20 61 73 20 61 20 70 6f 69 6e 74  value as a point
1ff0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
2000: 65 33 56 64 62 65 41 64 64 4f 70 34 28 0a 20 20  e3VdbeAddOp4(.  
2010: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
2020: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
2030: 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d  pcode to this VM
2040: 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
2050: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2060: 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20   new opcode */. 
2070: 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20   int p1,        
2080: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f       /* The P1 o
2090: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
20a0: 70 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p2,             
20b0: 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e  /* The P2 operan
20c0: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20  d */.  int p3,  
20d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
20e0: 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P3 operand */.
20f0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
2100: 34 2c 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20  4,    /* The P4 
2110: 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  operand */.  int
2120: 20 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20   p4type         
2130: 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74   /* P4 operand t
2140: 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ype */.){.  int 
2150: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
2160: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
2170: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 20 20 73  p1, p2, p3);.  s
2180: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
2190: 50 34 28 70 2c 20 61 64 64 72 2c 20 7a 50 34 2c  P4(p, addr, zP4,
21a0: 20 70 34 74 79 70 65 29 3b 0a 20 20 72 65 74 75   p4type);.  retu
21b0: 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn addr;.}../*.*
21c0: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
21d0: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
21e0: 65 20 70 34 20 76 61 6c 75 65 20 77 69 74 68 20  e p4 value with 
21f0: 61 20 50 34 5f 49 4e 54 36 34 20 6f 72 0a 2a 2a  a P4_INT64 or.**
2200: 20 50 34 5f 52 45 41 4c 20 74 79 70 65 2e 0a 2a   P4_REAL type..*
2210: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
2220: 65 41 64 64 4f 70 34 44 75 70 38 28 0a 20 20 56  eAddOp4Dup8(.  V
2230: 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  dbe *p,         
2240: 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f 70     /* Add the op
2250: 63 6f 64 65 20 74 6f 20 74 68 69 73 20 56 4d 20  code to this VM 
2260: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
2270: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2280: 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  new opcode */.  
2290: 69 6e 74 20 70 31 2c 20 20 20 20 20 20 20 20 20  int p1,         
22a0: 20 20 20 20 2f 2a 20 54 68 65 20 50 31 20 6f 70      /* The P1 op
22b0: 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70  erand */.  int p
22c0: 32 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  2,             /
22d0: 2a 20 54 68 65 20 50 32 20 6f 70 65 72 61 6e 64  * The P2 operand
22e0: 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c 20 20 20   */.  int p3,   
22f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2300: 20 50 33 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P3 operand */. 
2310: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50 34 2c 20   const u8 *zP4, 
2320: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 34 20 6f       /* The P4 o
2330: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2340: 70 34 74 79 70 65 20 20 20 20 20 20 20 20 20 20  p4type          
2350: 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64 20 74 79  /* P4 operand ty
2360: 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  pe */.){.  char 
2370: 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c 69 74 65  *p4copy = sqlite
2380: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e 4e 28 73  3DbMallocRawNN(s
2390: 71 6c 69 74 65 33 56 64 62 65 44 62 28 70 29 2c  qlite3VdbeDb(p),
23a0: 20 38 29 3b 0a 20 20 69 66 28 20 70 34 63 6f 70   8);.  if( p4cop
23b0: 79 20 29 20 6d 65 6d 63 70 79 28 70 34 63 6f 70  y ) memcpy(p4cop
23c0: 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20 20 72 65  y, zP4, 8);.  re
23d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
23e0: 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c 20 70 31  AddOp4(p, op, p1
23f0: 2c 20 70 32 2c 20 70 33 2c 20 70 34 63 6f 70 79  , p2, p3, p4copy
2400: 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  , p4type);.}../*
2410: 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50 5f 50 61  .** Add an OP_Pa
2420: 72 73 65 53 63 68 65 6d 61 20 6f 70 63 6f 64 65  rseSchema opcode
2430: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
2440: 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74 20 66 72  is broken out fr
2450: 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  om.** sqlite3Vdb
2460: 65 41 64 64 4f 70 34 28 29 20 73 69 6e 63 65 20  eAddOp4() since 
2470: 69 74 20 6e 65 65 64 73 20 74 6f 20 61 6c 73 6f  it needs to also
2480: 20 6e 65 65 64 73 20 74 6f 20 6d 61 72 6b 20 61   needs to mark a
2490: 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20 61 73 20  ll btrees.** as 
24a0: 68 61 76 69 6e 67 20 62 65 65 6e 20 75 73 65 64  having been used
24b0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 57 68 65  ..**.** The zWhe
24c0: 72 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 68  re string must h
24d0: 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65  ave been obtaine
24e0: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
24f0: 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54 68 69 73  alloc()..** This
2500: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 74 61   routine will ta
2510: 6b 65 20 6f 77 6e 65 72 73 68 69 70 20 6f 66 20  ke ownership of 
2520: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  the allocated me
2530: 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mory..*/.void sq
2540: 6c 69 74 65 33 56 64 62 65 41 64 64 50 61 72 73  lite3VdbeAddPars
2550: 65 53 63 68 65 6d 61 4f 70 28 56 64 62 65 20 2a  eSchemaOp(Vdbe *
2560: 70 2c 20 69 6e 74 20 69 44 62 2c 20 63 68 61 72  p, int iDb, char
2570: 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20 69 6e 74   *zWhere){.  int
2580: 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62   j;.  sqlite3Vdb
2590: 65 41 64 64 4f 70 34 28 70 2c 20 4f 50 5f 50 61  eAddOp4(p, OP_Pa
25a0: 72 73 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20  rseSchema, iDb, 
25b0: 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c 20 50 34  0, 0, zWhere, P4
25c0: 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72  _DYNAMIC);.  for
25d0: 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e  (j=0; j<p->db->n
25e0: 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33  Db; j++) sqlite3
25f0: 56 64 62 65 55 73 65 73 42 74 72 65 65 28 70 2c  VdbeUsesBtree(p,
2600: 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   j);.}../*.** Ad
2610: 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74  d an opcode that
2620: 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34   includes the p4
2630: 20 76 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74   value as an int
2640: 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eger..*/.int sql
2650: 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e  ite3VdbeAddOp4In
2660: 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  t(.  Vdbe *p,   
2670: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
2680: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
2690: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
26a0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
26b0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
26c0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
26d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
26e0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
26f0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
2700: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
2710: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
2720: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
2730: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
2740: 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20  d */.  int p4   
2750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2760: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20  e P4 operand as 
2770: 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b  an integer */.){
2780: 0a 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71  .  int addr = sq
2790: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
27a0: 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70  p, op, p1, p2, p
27b0: 33 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  3);.  sqlite3Vdb
27c0: 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64  eChangeP4(p, add
27d0: 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  r, SQLITE_INT_TO
27e0: 5f 50 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54  _PTR(p4), P4_INT
27f0: 33 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64  32);.  return ad
2800: 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73 65 72 74  dr;.}../* Insert
2810: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 63 6f   the end of a co
2820: 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76 6f 69 64  -routine.*/.void
2830: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 64 43   sqlite3VdbeEndC
2840: 6f 72 6f 75 74 69 6e 65 28 56 64 62 65 20 2a 76  oroutine(Vdbe *v
2850: 2c 20 69 6e 74 20 72 65 67 59 69 65 6c 64 29 7b  , int regYield){
2860: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  .  sqlite3VdbeAd
2870: 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e 64 43 6f  dOp1(v, OP_EndCo
2880: 72 6f 75 74 69 6e 65 2c 20 72 65 67 59 69 65 6c  routine, regYiel
2890: 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20  d);..  /* Clear 
28a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 72 65  the temporary re
28b0: 67 69 73 74 65 72 20 63 61 63 68 65 2c 20 74 68  gister cache, th
28c0: 65 72 65 62 79 20 65 6e 73 75 72 69 6e 67 20 74  ereby ensuring t
28d0: 68 61 74 20 65 61 63 68 0a 20 20 2a 2a 20 63 6f  hat each.  ** co
28e0: 2d 72 6f 75 74 69 6e 65 20 68 61 73 20 69 74 73  -routine has its
28f0: 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74   own independent
2900: 20 73 65 74 20 6f 66 20 72 65 67 69 73 74 65 72   set of register
2910: 73 2c 20 62 65 63 61 75 73 65 20 63 6f 2d 72 6f  s, because co-ro
2920: 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d 69 67 68  utines.  ** migh
2930: 74 20 65 78 70 65 63 74 20 74 68 65 69 72 20 72  t expect their r
2940: 65 67 69 73 74 65 72 73 20 74 6f 20 62 65 20 70  egisters to be p
2950: 72 65 73 65 72 76 65 64 20 61 63 72 6f 73 73 20  reserved across 
2960: 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20 61 6e 64  an OP_Yield, and
2970: 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f 75 6c 64  .  ** that could
2980: 20 63 61 75 73 65 20 70 72 6f 62 6c 65 6d 73 20   cause problems 
2990: 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 63  if two or more c
29a0: 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  o-routines are u
29b0: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 0a 20 20  sing the same.  
29c0: 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20 72 65 67  ** temporary reg
29d0: 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 76 2d  ister..  */.  v-
29e0: 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65  >pParse->nTempRe
29f0: 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70 50 61 72  g = 0;.  v->pPar
2a00: 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 3d 20  se->nRangeReg = 
2a10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
2a20: 74 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69  te a new symboli
2a30: 63 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69  c label for an i
2a40: 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20  nstruction that 
2a50: 68 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a  has yet to be.**
2a60: 20 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d   coded.  The sym
2a70: 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72  bolic label is r
2a80: 65 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67  eally just a neg
2a90: 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54  ative number.  T
2aa0: 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20  he.** label can 
2ab0: 62 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50  be used as the P
2ac0: 32 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70  2 value of an op
2ad0: 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c  eration.  Later,
2ae0: 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62   when.** the lab
2af0: 65 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74  el is resolved t
2b00: 6f 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64  o a specific add
2b10: 72 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77  ress, the VDBE w
2b20: 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f  ill scan.** thro
2b30: 75 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f  ugh its operatio
2b40: 6e 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67  n list and chang
2b50: 65 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20  e all values of 
2b60: 50 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a  P2 which match.*
2b70: 2a 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f  * the label into
2b80: 20 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64   the resolved ad
2b90: 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  dress..**.** The
2ba0: 20 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74   VDBE knows that
2bb0: 20 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61   a P2 value is a
2bc0: 20 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c   label because l
2bd0: 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77  abels are.** alw
2be0: 61 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64  ays negative and
2bf0: 20 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73   P2 values are s
2c00: 75 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e  uppose to be non
2c10: 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65  -negative..** He
2c20: 6e 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20  nce, a negative 
2c30: 50 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61  P2 value is a la
2c40: 62 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74  bel that has yet
2c50: 20 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e   to be resolved.
2c60: 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72  .**.** Zero is r
2c70: 65 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c  eturned if a mal
2c80: 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  loc() fails..*/.
2c90: 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d  int sqlite3VdbeM
2ca0: 61 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76  akeLabel(Vdbe *v
2cb0: 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20  ){.  Parse *p = 
2cc0: 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  v->pParse;.  int
2cd0: 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b   i = p->nLabel++
2ce0: 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d  ;.  assert( v->m
2cf0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
2d00: 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28  _INIT );.  if( (
2d10: 69 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b  i & (i-1))==0 ){
2d20: 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d  .    p->aLabel =
2d30: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
2d40: 63 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70  cOrFree(p->db, p
2d50: 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20  ->aLabel, .     
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d80: 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66    (i*2+1)*sizeof
2d90: 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b  (p->aLabel[0]));
2da0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c  .  }.  if( p->aL
2db0: 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61  abel ){.    p->a
2dc0: 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20  Label[i] = -1;. 
2dd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 41 44 44 52   }.  return ADDR
2de0: 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  (i);.}../*.** Re
2df0: 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22 78 22 20  solve label "x" 
2e00: 74 6f 20 62 65 20 74 68 65 20 61 64 64 72 65 73  to be the addres
2e10: 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e  s of the next in
2e20: 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20  struction to.** 
2e30: 62 65 20 69 6e 73 65 72 74 65 64 2e 20 20 54 68  be inserted.  Th
2e40: 65 20 70 61 72 61 6d 65 74 65 72 20 22 78 22 20  e parameter "x" 
2e50: 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f  must have been o
2e60: 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
2e70: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
2e80: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
2e90: 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  abel()..*/.void 
2ea0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
2eb0: 76 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 2c  veLabel(Vdbe *v,
2ec0: 20 69 6e 74 20 78 29 7b 0a 20 20 50 61 72 73 65   int x){.  Parse
2ed0: 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b   *p = v->pParse;
2ee0: 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44 44 52 28  .  int j = ADDR(
2ef0: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 2d  x);.  assert( v-
2f00: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
2f10: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
2f20: 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61 62 65 6c  ert( j<p->nLabel
2f30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3e   );.  assert( j>
2f40: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  =0 );.  if( p->a
2f50: 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e  Label ){.    p->
2f60: 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76 2d 3e 6e  aLabel[j] = v->n
2f70: 4f 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 46 69  Op;.  }.  p->iFi
2f80: 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f 70 20 2d  xedOp = v->nOp -
2f90: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72   1;.}../*.** Mar
2fa0: 6b 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e  k the VDBE as on
2fb0: 65 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20  e that can only 
2fc0: 62 65 20 72 75 6e 20 6f 6e 65 20 74 69 6d 65 2e  be run one time.
2fd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2fe0: 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e 63 65 28  VdbeRunOnlyOnce(
2ff0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
3000: 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 31 3b 0a  unOnlyOnce = 1;.
3010: 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 74 68  }../*.** Mark th
3020: 65 20 56 44 42 45 20 61 73 20 6f 6e 65 20 74 68  e VDBE as one th
3030: 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 72  at can only be r
3040: 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65  un multiple time
3050: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
3060: 65 33 56 64 62 65 52 65 75 73 61 62 6c 65 28 56  e3VdbeReusable(V
3070: 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 75  dbe *p){.  p->ru
3080: 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30 3b 0a 7d  nOnlyOnce = 0;.}
3090: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30a0: 44 45 42 55 47 20 2f 2a 20 73 71 6c 69 74 65 33  DEBUG /* sqlite3
30b0: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29  AssertMayAbort()
30c0: 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   logic */../*.**
30d0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
30e0: 79 70 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e  ype and function
30f0: 20 61 72 65 20 75 73 65 64 20 74 6f 20 69 74 65   are used to ite
3100: 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 6c 6c  rate through all
3110: 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69 6e 20 61   opcodes.** in a
3120: 20 56 64 62 65 20 6d 61 69 6e 20 70 72 6f 67 72   Vdbe main progr
3130: 61 6d 20 61 6e 64 20 65 61 63 68 20 6f 66 20 74  am and each of t
3140: 68 65 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20  he sub-programs 
3150: 28 74 72 69 67 67 65 72 73 29 20 69 74 20 6d 61  (triggers) it ma
3160: 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 64 69 72  y .** invoke dir
3170: 65 63 74 6c 79 20 6f 72 20 69 6e 64 69 72 65 63  ectly or indirec
3180: 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  tly. It should b
3190: 65 20 75 73 65 64 20 61 73 20 66 6f 6c 6c 6f 77  e used as follow
31a0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70 20 2a 70  s:.**.**   Op *p
31b0: 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65 4f 70 49  Op;.**   VdbeOpI
31c0: 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a 0a 2a 2a  ter sIter;.**.**
31d0: 20 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72     memset(&sIter
31e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65  , 0, sizeof(sIte
31f0: 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74 65 72 2e  r));.**   sIter.
3200: 76 20 3d 20 76 3b 20 20 20 20 20 20 20 20 20 20  v = v;          
3210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3220: 20 20 2f 2f 20 76 20 69 73 20 6f 66 20 74 79 70    // v is of typ
3230: 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20 20 77 68  e Vdbe* .**   wh
3240: 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74  ile( (pOp = opIt
3250: 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 20  erNext(&sIter)) 
3260: 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20 44 6f 20  ){.**     // Do 
3270: 73 6f 6d 65 74 68 69 6e 67 20 77 69 74 68 20 70  something with p
3280: 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20 20 20 73  Op.**   }.**   s
3290: 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
32a0: 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75 62 29  db, sIter.apSub)
32b0: 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65 64 65 66  ;.** .*/.typedef
32c0: 20 73 74 72 75 63 74 20 56 64 62 65 4f 70 49 74   struct VdbeOpIt
32d0: 65 72 20 56 64 62 65 4f 70 49 74 65 72 3b 0a 73  er VdbeOpIter;.s
32e0: 74 72 75 63 74 20 56 64 62 65 4f 70 49 74 65 72  truct VdbeOpIter
32f0: 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20   {.  Vdbe *v;   
3300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3310: 2f 2a 20 56 64 62 65 20 74 6f 20 69 74 65 72 61  /* Vdbe to itera
3320: 74 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 6f  te through the o
3330: 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a 20 20 53  pcodes of */.  S
3340: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
3350: 62 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72  b;        /* Arr
3360: 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61 6d  ay of subprogram
3370: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 3b  s */.  int nSub;
3380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3390: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
33a0: 6e 74 72 69 65 73 20 69 6e 20 61 70 53 75 62 20  ntries in apSub 
33b0: 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64 72 3b 20  */.  int iAddr; 
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d0: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
33e0: 78 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  xt instruction t
33f0: 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e  o return */.  in
3400: 74 20 69 53 75 62 3b 20 20 20 20 20 20 20 20 20  t iSub;         
3410: 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20 3d 20           /* 0 = 
3420: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20 31 20  main program, 1 
3430: 3d 20 66 69 72 73 74 20 73 75 62 2d 70 72 6f 67  = first sub-prog
3440: 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d 3b 0a 73  ram etc. */.};.s
3450: 74 61 74 69 63 20 4f 70 20 2a 6f 70 49 74 65 72  tatic Op *opIter
3460: 4e 65 78 74 28 56 64 62 65 4f 70 49 74 65 72 20  Next(VdbeOpIter 
3470: 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  *p){.  Vdbe *v =
3480: 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a 70 52 65   p->v;.  Op *pRe
3490: 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 61 4f 70  t = 0;.  Op *aOp
34a0: 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a 0a 20 20  ;.  int nOp;..  
34b0: 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d 70 2d 3e  if( p->iSub<=p->
34c0: 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20 69 66 28  nSub ){..    if(
34d0: 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29 7b 0a 20   p->iSub==0 ){. 
34e0: 20 20 20 20 20 61 4f 70 20 3d 20 76 2d 3e 61 4f       aOp = v->aO
34f0: 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20 3d 20 76  p;.      nOp = v
3500: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65 6c 73 65  ->nOp;.    }else
3510: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 70 2d  {.      aOp = p-
3520: 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31  >apSub[p->iSub-1
3530: 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f  ]->aOp;.      nO
3540: 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e  p = p->apSub[p->
3550: 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b 0a 20 20  iSub-1]->nOp;.  
3560: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
3570: 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20 29 3b 0a  p->iAddr<nOp );.
3580: 0a 20 20 20 20 70 52 65 74 20 3d 20 26 61 4f 70  .    pRet = &aOp
3590: 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20 20 20 20  [p->iAddr];.    
35a0: 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20 20 20 20  p->iAddr++;.    
35b0: 69 66 28 20 70 2d 3e 69 41 64 64 72 3d 3d 6e 4f  if( p->iAddr==nO
35c0: 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 53  p ){.      p->iS
35d0: 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70 2d 3e 69  ub++;.      p->i
35e0: 41 64 64 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  Addr = 0;.    }.
35f0: 20 20 0a 20 20 20 20 69 66 28 20 70 52 65 74 2d    .    if( pRet-
3600: 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50  >p4type==P4_SUBP
3610: 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20  ROGRAM ){.      
3620: 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 70 2d 3e  int nByte = (p->
3630: 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53  nSub+1)*sizeof(S
3640: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
3650: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
3660: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 6e 53  for(j=0; j<p->nS
3670: 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ub; j++){.      
3680: 20 20 69 66 28 20 70 2d 3e 61 70 53 75 62 5b 6a    if( p->apSub[j
3690: 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f  ]==pRet->p4.pPro
36a0: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
36b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
36c0: 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 20 20  j==p->nSub ){.  
36d0: 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 20 3d        p->apSub =
36e0: 20 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f   sqlite3DbReallo
36f0: 63 4f 72 46 72 65 65 28 76 2d 3e 64 62 2c 20 70  cOrFree(v->db, p
3700: 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74 65 29 3b  ->apSub, nByte);
3710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 2d  .        if( !p-
3720: 3e 61 70 53 75 62 20 29 7b 0a 20 20 20 20 20 20  >apSub ){.      
3730: 20 20 20 20 70 52 65 74 20 3d 20 30 3b 0a 20 20      pRet = 0;.  
3740: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
3750: 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75 62 5b         p->apSub[
3760: 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20 70 52 65  p->nSub++] = pRe
3770: 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  t->p4.pProgram;.
3780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3790: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
37a0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f  eturn pRet;.}../
37b0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
37c0: 65 20 70 72 6f 67 72 61 6d 20 73 74 6f 72 65 64  e program stored
37d0: 20 69 6e 20 74 68 65 20 56 4d 20 61 73 73 6f 63   in the VM assoc
37e0: 69 61 74 65 64 20 77 69 74 68 20 70 50 61 72 73  iated with pPars
37f0: 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f 77 20 61  e may.** throw a
3800: 6e 20 41 42 4f 52 54 20 65 78 63 65 70 74 69 6f  n ABORT exceptio
3810: 6e 20 28 63 61 75 73 69 6e 67 20 74 68 65 20 73  n (causing the s
3820: 74 61 74 65 6d 65 6e 74 2c 20 62 75 74 20 6e 6f  tatement, but no
3830: 74 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  t entire transac
3840: 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65 20 72 6f  tion.** to be ro
3850: 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54 68 69 73  lled back). This
3860: 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73 20 74 72   condition is tr
3870: 75 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20 70  ue if the main p
3880: 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79 0a 2a 2a  rogram or any.**
3890: 20 73 75 62 2d 70 72 6f 67 72 61 6d 73 20 63 6f   sub-programs co
38a0: 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66 20 74 68  ntains any of th
38b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
38c0: 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 20  **   *  OP_Halt 
38d0: 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f 43  with P1=SQLITE_C
38e0: 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50 32  ONSTRAINT and P2
38f0: 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20 20  =OE_Abort..**   
3900: 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c  *  OP_HaltIfNull
3910: 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54 45 5f   with P1=SQLITE_
3920: 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64 20 50  CONSTRAINT and P
3930: 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a 20 20  2=OE_Abort..**  
3940: 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f 79 0a 2a   *  OP_Destroy.*
3950: 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70 64 61 74  *   *  OP_VUpdat
3960: 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 52 65  e.**   *  OP_VRe
3970: 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  name.**   *  OP_
3980: 46 6b 43 6f 75 6e 74 65 72 20 77 69 74 68 20 50  FkCounter with P
3990: 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61 74 65 20  2==0 (immediate 
39a0: 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
39b0: 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20 2a 20 20  traint).**   *  
39c0: 4f 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 61  OP_CreateTable a
39d0: 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74  nd OP_InitCorout
39e0: 69 6e 65 20 28 66 6f 72 20 43 52 45 41 54 45 20  ine (for CREATE 
39f0: 54 41 42 4c 45 20 41 53 20 53 45 4c 45 43 54 20  TABLE AS SELECT 
3a00: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  ...).**.** Then 
3a10: 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 76  check that the v
3a20: 61 6c 75 65 20 6f 66 20 50 61 72 73 65 2e 6d 61  alue of Parse.ma
3a30: 79 41 62 6f 72 74 20 69 73 20 74 72 75 65 20 69  yAbort is true i
3a40: 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54 20 6d 61  f an.** ABORT ma
3a50: 79 20 62 65 20 74 68 72 6f 77 6e 2c 20 6f 72 20  y be thrown, or 
3a60: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
3a70: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3a80: 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61 74 63 68  it does.** match
3a90: 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72  , or false other
3aa0: 77 69 73 65 2e 20 54 68 69 73 20 66 75 6e 63 74  wise. This funct
3ab0: 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64 65 64 20  ion is intended 
3ac0: 74 6f 20 62 65 20 75 73 65 64 20 61 73 0a 2a 2a  to be used as.**
3ad0: 20 70 61 72 74 20 6f 66 20 61 6e 20 61 73 73 65   part of an asse
3ae0: 72 74 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20  rt statement in 
3af0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 53 69  the compiler. Si
3b00: 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20  milar to:.**.** 
3b10: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3b20: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
3b30: 6f 72 74 28 70 50 61 72 73 65 2d 3e 70 56 64 62  ort(pParse->pVdb
3b40: 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  e, pParse->mayAb
3b50: 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e 74 20 73  ort) );.*/.int s
3b60: 71 6c 69 74 65 33 56 64 62 65 41 73 73 65 72 74  qlite3VdbeAssert
3b70: 4d 61 79 41 62 6f 72 74 28 56 64 62 65 20 2a 76  MayAbort(Vdbe *v
3b80: 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72 74 29 7b  , int mayAbort){
3b90: 0a 20 20 69 6e 74 20 68 61 73 41 62 6f 72 74 20  .  int hasAbort 
3ba0: 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 46 6b  = 0;.  int hasFk
3bb0: 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 20 20 69  Counter = 0;.  i
3bc0: 6e 74 20 68 61 73 43 72 65 61 74 65 54 61 62 6c  nt hasCreateTabl
3bd0: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61 73  e = 0;.  int has
3be0: 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20  InitCoroutine = 
3bf0: 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  0;.  Op *pOp;.  
3c00: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
3c10: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73 49 74 65  ;.  memset(&sIte
3c20: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 49 74  r, 0, sizeof(sIt
3c30: 65 72 29 29 3b 0a 20 20 73 49 74 65 72 2e 76 20  er));.  sIter.v 
3c40: 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  = v;..  while( (
3c50: 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74  pOp = opIterNext
3c60: 28 26 73 49 74 65 72 29 29 21 3d 30 20 29 7b 0a  (&sIter))!=0 ){.
3c70: 20 20 20 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d      int opcode =
3c80: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20   pOp->opcode;.  
3c90: 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50    if( opcode==OP
3ca0: 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f  _Destroy || opco
3cb0: 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c  de==OP_VUpdate |
3cc0: 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65  | opcode==OP_VRe
3cd0: 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c 20 28 28  name .     || ((
3ce0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
3cf0: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
3d00: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
3d10: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
3d20: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
3d30: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
3d40: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
3d50: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
3d60: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
3d70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d80: 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 43  if( opcode==OP_C
3d90: 72 65 61 74 65 54 61 62 6c 65 20 29 20 68 61 73  reateTable ) has
3da0: 43 72 65 61 74 65 54 61 62 6c 65 20 3d 20 31 3b  CreateTable = 1;
3db0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3dc0: 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75 74 69 6e  =OP_InitCoroutin
3dd0: 65 20 29 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  e ) hasInitCorou
3de0: 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66 6e 64 65  tine = 1;.#ifnde
3df0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f  f SQLITE_OMIT_FO
3e00: 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20 20 69 66  REIGN_KEY.    if
3e10: 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 6b 43  ( opcode==OP_FkC
3e20: 6f 75 6e 74 65 72 20 26 26 20 70 4f 70 2d 3e 70  ounter && pOp->p
3e30: 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3d  1==0 && pOp->p2=
3e40: 3d 31 20 29 7b 0a 20 20 20 20 20 20 68 61 73 46  =1 ){.      hasF
3e50: 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 20 20  kCounter = 1;.  
3e60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20    }.#endif.  }. 
3e70: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 76   sqlite3DbFree(v
3e80: 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53 75  ->db, sIter.apSu
3e90: 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e  b);..  /* Return
3ea0: 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f 72   true if hasAbor
3eb0: 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72 20  t==mayAbort. Or 
3ec0: 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
3ed0: 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20 20  ure occurred..  
3ee0: 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ** If malloc fai
3ef0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77 68  led, then the wh
3f00: 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76 65  ile() loop above
3f10: 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69 74   may not have it
3f20: 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72 6f  erated.  ** thro
3f30: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ugh all opcodes 
3f40: 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61 79  and hasAbort may
3f50: 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65 63   be set incorrec
3f60: 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a 2a  tly. Return.  **
3f70: 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20 63   true for this c
3f80: 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20 74  ase to prevent t
3f90: 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20 74  he assert() in t
3fa0: 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d 65  he callers frame
3fb0: 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c 69  .  ** from faili
3fc0: 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ng.  */.  return
3fd0: 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63   ( v->db->malloc
3fe0: 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62 6f  Failed || hasAbo
3ff0: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 7c 7c 20  rt==mayAbort || 
4000: 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a 20 20 20  hasFkCounter.   
4010: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 68             || (h
4020: 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 26 26  asCreateTable &&
4030: 20 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e   hasInitCoroutin
4040: 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e) );.}.#endif /
4050: 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2d  * SQLITE_DEBUG -
4060: 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73 65   the sqlite3Asse
4070: 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75 6e  rtMayAbort() fun
4080: 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ction */../*.** 
4090: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
40a0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 61 6c 6c  called after all
40b0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
40c0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 20 20 49 74  en inserted.  It
40d0: 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72 6f 75 67   loops.** throug
40e0: 68 20 61 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65  h all the opcode
40f0: 73 20 61 6e 64 20 66 69 78 65 73 20 75 70 20 73  s and fixes up s
4100: 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  ome details..**.
4110: 2a 2a 20 28 31 29 20 46 6f 72 20 65 61 63 68 20  ** (1) For each 
4120: 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e  jump instruction
4130: 20 77 69 74 68 20 61 20 6e 65 67 61 74 69 76 65   with a negative
4140: 20 50 32 20 76 61 6c 75 65 20 28 61 20 6c 61 62   P2 value (a lab
4150: 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65 73 6f 6c  el).**     resol
4160: 76 65 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ve the P2 value 
4170: 74 6f 20 61 6e 20 61 63 74 75 61 6c 20 61 64 64  to an actual add
4180: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28 32 29 20  ress..**.** (2) 
4190: 43 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 78 69  Compute the maxi
41a0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
41b0: 67 75 6d 65 6e 74 73 20 75 73 65 64 20 62 79 20  guments used by 
41c0: 61 6e 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  any SQL function
41d0: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73 74 6f 72  .**     and stor
41e0: 65 20 74 68 61 74 20 76 61 6c 75 65 20 69 6e 20  e that value in 
41f0: 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 2e 0a 2a  *pMaxFuncArgs..*
4200: 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61 74 65 20  *.** (3) Update 
4210: 74 68 65 20 56 64 62 65 2e 72 65 61 64 4f 6e 6c  the Vdbe.readOnl
4220: 79 20 61 6e 64 20 56 64 62 65 2e 62 49 73 52 65  y and Vdbe.bIsRe
4230: 61 64 65 72 20 66 6c 61 67 73 20 74 6f 20 61 63  ader flags to ac
4240: 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20  curately.**     
4250: 69 6e 64 69 63 61 74 65 20 77 68 61 74 20 74 68  indicate what th
4260: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
4270: 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79 20 64 6f  ment actually do
4280: 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29 20 49 6e  es..**.** (4) In
4290: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 70 34 2e  itialize the p4.
42a0: 78 41 64 76 61 6e 63 65 20 70 6f 69 6e 74 65 72  xAdvance pointer
42b0: 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74 68 61 74   on opcodes that
42c0: 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 28   use it..**.** (
42d0: 35 29 20 52 65 63 6c 61 69 6d 20 74 68 65 20 6d  5) Reclaim the m
42e0: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 65 64 20  emory allocated 
42f0: 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c 61 62 65  for storing labe
4300: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ls..**.** This r
4310: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
4320: 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72 72 65 63   function correc
4330: 74 6c 79 20 69 66 20 74 68 65 20 6d 6b 6f 70 63  tly if the mkopc
4340: 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74  odeh.tcl generat
4350: 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20 6e 75 6d  or.** script num
4360: 62 65 72 73 20 74 68 65 20 6f 70 63 6f 64 65 73  bers the opcodes
4370: 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 43 68 61   correctly.  Cha
4380: 6e 67 65 73 20 74 6f 20 74 68 69 73 20 72 6f 75  nges to this rou
4390: 74 69 6e 65 20 6d 75 73 74 20 62 65 0a 2a 2a 20  tine must be.** 
43a0: 63 6f 6f 72 64 69 6e 61 74 65 64 20 77 69 74 68  coordinated with
43b0: 20 63 68 61 6e 67 65 73 20 74 6f 20 6d 6b 6f 70   changes to mkop
43c0: 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f 0a 73 74  codeh.tcl..*/.st
43d0: 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76  atic void resolv
43e0: 65 50 32 56 61 6c 75 65 73 28 56 64 62 65 20 2a  eP2Values(Vdbe *
43f0: 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63  p, int *pMaxFunc
4400: 41 72 67 73 29 7b 0a 20 20 69 6e 74 20 6e 4d 61  Args){.  int nMa
4410: 78 41 72 67 73 20 3d 20 2a 70 4d 61 78 46 75 6e  xArgs = *pMaxFun
4420: 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a 70 4f 70  cArgs;.  Op *pOp
4430: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
4440: 65 20 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20  e = p->pParse;. 
4450: 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20 3d 20 70   int *aLabel = p
4460: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20  Parse->aLabel;. 
4470: 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31   p->readOnly = 1
4480: 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72  ;.  p->bIsReader
4490: 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d 20 26 70   = 0;.  pOp = &p
44a0: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 3b  ->aOp[p->nOp-1];
44b0: 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a 0a 20 20  .  while(1){..  
44c0: 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d 50 20 6f    /* Only JUMP o
44d0: 70 63 6f 64 65 73 20 61 6e 64 20 74 68 65 20 73  pcodes and the s
44e0: 68 6f 72 74 20 6c 69 73 74 20 6f 66 20 73 70 65  hort list of spe
44f0: 63 69 61 6c 20 6f 70 63 6f 64 65 73 20 69 6e 20  cial opcodes in 
4500: 74 68 65 20 73 77 69 74 63 68 0a 20 20 20 20 2a  the switch.    *
4510: 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20 74 6f 20  * below need to 
4520: 62 65 20 63 6f 6e 73 69 64 65 72 65 64 2e 20 20  be considered.  
4530: 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63  The mkopcodeh.tc
4540: 6c 20 67 65 6e 65 72 61 74 6f 72 20 73 63 72 69  l generator scri
4550: 70 74 20 67 72 6f 75 70 73 0a 20 20 20 20 2a 2a  pt groups.    **
4560: 20 61 6c 6c 20 74 68 65 73 65 20 6f 70 63 6f 64   all these opcod
4570: 65 73 20 74 6f 67 65 74 68 65 72 20 6e 65 61 72  es together near
4580: 20 74 68 65 20 66 72 6f 6e 74 20 6f 66 20 74 68   the front of th
4590: 65 20 6f 70 63 6f 64 65 20 6c 69 73 74 2e 20 20  e opcode list.  
45a0: 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61 6e 79 20  Skip.    ** any 
45b0: 6f 70 63 6f 64 65 20 74 68 61 74 20 64 6f 65 73  opcode that does
45c0: 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f 63 65 73   not need proces
45d0: 73 69 6e 67 20 62 79 20 76 69 72 74 75 61 6c 20  sing by virtual 
45e0: 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61 74  of the fact that
45f0: 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6c 61  .    ** it is la
4600: 72 67 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  rger than SQLITE
4610: 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44 45 2c  _MX_JUMP_OPCODE,
4620: 20 61 73 20 61 20 70 65 72 66 6f 72 6d 61 6e 63   as a performanc
4630: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 0a  e optimization..
4640: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
4650: 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53 51 4c 49  Op->opcode<=SQLI
4660: 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f 44  TE_MX_JUMP_OPCOD
4670: 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 4f  E ){.      /* NO
4680: 54 45 3a 20 42 65 20 73 75 72 65 20 74 6f 20 75  TE: Be sure to u
4690: 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  pdate mkopcodeh.
46a0: 74 63 6c 20 77 68 65 6e 20 61 64 64 69 6e 67 20  tcl when adding 
46b0: 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20 20 20 20  or removing.    
46c0: 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f 6d 20    ** cases from 
46d0: 74 68 69 73 20 73 77 69 74 63 68 21 20 2a 2f 0a  this switch! */.
46e0: 20 20 20 20 20 20 73 77 69 74 63 68 28 20 70 4f        switch( pO
46f0: 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a 20 20 20  p->opcode ){.   
4700: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 54 72 61       case OP_Tra
4710: 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20 20 20 20  nsaction: {.    
4720: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
4730: 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64 4f 6e  2!=0 ) p->readOn
4740: 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ly = 0;.        
4750: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
4760: 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
4770: 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75 74 6f      case OP_Auto
4780: 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20 20 20  Commit:.        
4790: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
47a0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  t: {.          p
47b0: 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b  ->bIsReader = 1;
47c0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
47d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e  ;.        }.#ifn
47e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
47f0: 57 41 4c 0a 20 20 20 20 20 20 20 20 63 61 73 65  WAL.        case
4800: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 3a 0a   OP_Checkpoint:.
4810: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63  #endif.        c
4820: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
4830: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a         case OP_J
4840: 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20  ournalMode: {.  
4850: 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61 64 4f          p->readO
4860: 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nly = 0;.       
4870: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
4880: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
4890: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
48a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
48b0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
48c0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
48d0: 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20 20 20 20  _VUpdate: {.    
48e0: 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70        if( pOp->p
48f0: 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  2>nMaxArgs ) nMa
4900: 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 32 3b  xArgs = pOp->p2;
4910: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4920: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4930: 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46 69 6c      case OP_VFil
4940: 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ter: {.         
4950: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
4960: 20 20 61 73 73 65 72 74 28 20 28 70 4f 70 20 2d    assert( (pOp -
4970: 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33 20 29 3b   p->aOp) >= 3 );
4980: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
4990: 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63 6f 64  t( pOp[-1].opcod
49a0: 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20 29 3b  e==OP_Integer );
49b0: 0a 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 70  .          n = p
49c0: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
49d0: 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41       if( n>nMaxA
49e0: 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d  rgs ) nMaxArgs =
49f0: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   n;.          br
4a00: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
4a10: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 63 61  endif.        ca
4a20: 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20  se OP_Next:.    
4a30: 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78 74      case OP_Next
4a40: 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20 20 20 20  IfOpen:.        
4a50: 63 61 73 65 20 4f 50 5f 53 6f 72 74 65 72 4e 65  case OP_SorterNe
4a60: 78 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  xt: {.          
4a70: 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65  pOp->p4.xAdvance
4a80: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
4a90: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
4aa0: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
4ab0: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
4ac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ad0: 20 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65    }.        case
4ae0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
4af0: 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66    case OP_PrevIf
4b00: 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20  Open: {.        
4b10: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
4b20: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
4b30: 65 50 72 65 76 69 6f 75 73 3b 0a 20 20 20 20 20  ePrevious;.     
4b40: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
4b50: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
4b60: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
4b70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4b80: 7d 0a 20 20 20 20 20 20 69 66 28 20 28 73 71 6c  }.      if( (sql
4b90: 69 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72  ite3OpcodeProper
4ba0: 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20  ty[pOp->opcode] 
4bb0: 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30  & OPFLG_JUMP)!=0
4bc0: 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b   && pOp->p2<0 ){
4bd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
4be0: 20 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 3c 70   ADDR(pOp->p2)<p
4bf0: 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 20 29 3b  Parse->nLabel );
4c00: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 32  .        pOp->p2
4c10: 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44 52 28 70   = aLabel[ADDR(p
4c20: 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20 20 20 20  Op->p2)];.      
4c30: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4c40: 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29 20 62 72  pOp==p->aOp ) br
4c50: 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d 2d 3b 0a  eak;.    pOp--;.
4c60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
4c70: 72 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73  ree(p->db, pPars
4c80: 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50  e->aLabel);.  pP
4c90: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30  arse->aLabel = 0
4ca0: 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62  ;.  pParse->nLab
4cb0: 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46  el = 0;.  *pMaxF
4cc0: 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72  uncArgs = nMaxAr
4cd0: 67 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  gs;.  assert( p-
4ce0: 3e 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c  >bIsReader!=0 ||
4cf0: 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70   DbMaskAllZero(p
4d00: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a  ->btreeMask) );.
4d10: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4d20: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
4d30: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
4d40: 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74  ion to be insert
4d50: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
4d60: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
4d70: 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73  r(Vdbe *p){.  as
4d80: 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d  sert( p->magic==
4d90: 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20  VDBE_MAGIC_INIT 
4da0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e  );.  return p->n
4db0: 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 65 72  Op;.}../*.** Ver
4dc0: 69 66 79 20 74 68 61 74 20 61 74 20 6c 65 61 73  ify that at leas
4dd0: 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c 6f 74 73  t N opcode slots
4de0: 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 69   are available i
4df0: 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a 2a 20 68  n p without.** h
4e00: 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c 6f 63 20  aving to malloc 
4e10: 66 6f 72 20 6d 6f 72 65 20 73 70 61 63 65 20 28  for more space (
4e20: 65 78 63 65 70 74 20 77 68 65 6e 20 63 6f 6d 70  except when comp
4e30: 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a 20 53 51  iled using.** SQ
4e40: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
4e50: 43 5f 53 54 52 45 53 53 29 2e 20 20 54 68 69 73  C_STRESS).  This
4e60: 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 75 73   interface is us
4e70: 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
4e80: 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66 79 20 74  g.** to verify t
4e90: 68 61 74 20 63 65 72 74 61 69 6e 20 63 61 6c 6c  hat certain call
4ea0: 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  s to sqlite3Vdbe
4eb0: 41 64 64 4f 70 4c 69 73 74 28 29 20 63 61 6e 20  AddOpList() can 
4ec0: 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c 20 64 75  never.** fail du
4ed0: 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61 75 6c 74  e to a OOM fault
4ee0: 20 61 6e 64 20 68 65 6e 63 65 20 74 68 61 74 20   and hence that 
4ef0: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
4f00: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
4f10: 56 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20  VdbeAddOpList() 
4f20: 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 6e  will always be n
4f30: 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23 69 66 20  on-NULL..*/.#if 
4f40: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
4f50: 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
4f60: 64 28 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  d(SQLITE_TEST_RE
4f70: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29 0a 76 6f  ALLOC_STRESS).vo
4f80: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 56 65  id sqlite3VdbeVe
4f90: 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52 65 71 75  rifyNoMallocRequ
4fa0: 69 72 65 64 28 56 64 62 65 20 2a 70 2c 20 69 6e  ired(Vdbe *p, in
4fb0: 74 20 4e 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t N){.  assert( 
4fc0: 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d 20 70 2d  p->nOp + N <= p-
4fd0: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
4fe0: 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  c );.}.#endif../
4ff0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
5000: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
5010: 6e 74 65 72 20 74 6f 20 74 68 65 20 61 72 72 61  nter to the arra
5020: 79 20 6f 66 20 6f 70 63 6f 64 65 73 20 61 73 73  y of opcodes ass
5030: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
5040: 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64 20  the Vdbe passed 
5050: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
5060: 75 6d 65 6e 74 2e 20 49 74 20 69 73 20 74 68 65  ument. It is the
5070: 20 63 61 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73   callers respons
5080: 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72  ibility.** to ar
5090: 72 61 6e 67 65 20 66 6f 72 20 74 68 65 20 72 65  range for the re
50a0: 74 75 72 6e 65 64 20 61 72 72 61 79 20 74 6f 20  turned array to 
50b0: 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72  be eventually fr
50c0: 65 65 64 20 75 73 69 6e 67 20 74 68 65 20 0a 2a  eed using the .*
50d0: 2a 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  * vdbeFreeOpArra
50e0: 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  y() function..**
50f0: 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65 74 75 72  .** Before retur
5100: 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73  ning, *pnOp is s
5110: 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  et to the number
5120: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
5130: 68 65 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  he returned.** a
5140: 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d  rray. Also, *pnM
5150: 61 78 41 72 67 20 69 73 20 73 65 74 20 74 6f 20  axArg is set to 
5160: 74 68 65 20 6c 61 72 67 65 72 20 6f 66 20 69 74  the larger of it
5170: 73 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20  s current value 
5180: 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  and .** the numb
5190: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
51a0: 20 74 68 65 20 56 64 62 65 2e 61 70 41 72 67 5b   the Vdbe.apArg[
51b0: 5d 20 61 72 72 61 79 20 72 65 71 75 69 72 65 64  ] array required
51c0: 20 74 6f 20 65 78 65 63 75 74 65 20 74 68 65 20   to execute the 
51d0: 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 70 72 6f  .** returned pro
51e0: 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20  gram..*/.VdbeOp 
51f0: 2a 73 71 6c 69 74 65 33 56 64 62 65 54 61 6b 65  *sqlite3VdbeTake
5200: 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a 70 2c  OpArray(Vdbe *p,
5210: 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20   int *pnOp, int 
5220: 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20 20 56 64  *pnMaxArg){.  Vd
5230: 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61  beOp *aOp = p->a
5240: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 61 4f  Op;.  assert( aO
5250: 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c  p && !p->db->mal
5260: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20  locFailed );..  
5270: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 73 71  /* Check that sq
5280: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
5290: 65 65 28 29 20 77 61 73 20 6e 6f 74 20 63 61 6c  ee() was not cal
52a0: 6c 65 64 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a  led on this VM *
52b0: 2f 0a 20 20 61 73 73 65 72 74 28 20 44 62 4d 61  /.  assert( DbMa
52c0: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72  skAllZero(p->btr
52d0: 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65  eeMask) );..  re
52e0: 73 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 70 2c  solveP2Values(p,
52f0: 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70   pnMaxArg);.  *p
5300: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
5310: 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65  p->aOp = 0;.  re
5320: 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a  turn aOp;.}../*.
5330: 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c 65 20 6c  ** Add a whole l
5340: 69 73 74 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ist of operation
5350: 73 20 74 6f 20 74 68 65 20 6f 70 65 72 61 74 69  s to the operati
5360: 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65 74 75 72  on stack.  Retur
5370: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
5380: 6f 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72  o the first oper
5390: 61 74 69 6f 6e 20 69 6e 73 65 72 74 65 64 2e 0a  ation inserted..
53a0: 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 50  **.** Non-zero P
53b0: 32 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 6a  2 arguments to j
53c0: 75 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 73  ump instructions
53d0: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
53e0: 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a 2a 20 73  ly adjusted.** s
53f0: 6f 20 74 68 61 74 20 74 68 65 20 6a 75 6d 70 20  o that the jump 
5400: 74 61 72 67 65 74 20 69 73 20 72 65 6c 61 74 69  target is relati
5410: 76 65 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  ve to the first 
5420: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74  operation insert
5430: 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73  ed..*/.VdbeOp *s
5440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c  qlite3VdbeAddOpL
5450: 69 73 74 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ist(.  Vdbe *p, 
5460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5470: 20 20 20 20 2f 2a 20 41 64 64 20 6f 70 63 6f 64      /* Add opcod
5480: 65 73 20 74 6f 20 74 68 65 20 70 72 65 70 61 72  es to the prepar
5490: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  ed statement */.
54a0: 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20 20 20 20    int nOp,      
54b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
54c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f 70 63 6f  * Number of opco
54d0: 64 65 73 20 74 6f 20 61 64 64 20 2a 2f 0a 20 20  des to add */.  
54e0: 56 64 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74  VdbeOpList const
54f0: 20 2a 61 4f 70 2c 20 20 20 20 20 20 20 2f 2a 20   *aOp,       /* 
5500: 54 68 65 20 6f 70 63 6f 64 65 73 20 74 6f 20 62  The opcodes to b
5510: 65 20 61 64 64 65 64 20 2a 2f 0a 20 20 69 6e 74  e added */.  int
5520: 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20 20 20 20   iLineno        
5530: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6f 75            /* Sou
5540: 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65 20 6e 75  rce-file line nu
5550: 6d 62 65 72 20 6f 66 20 66 69 72 73 74 20 6f 70  mber of first op
5560: 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  code */.){.  int
5570: 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f   i;.  VdbeOp *pO
5580: 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a 20 20 61  ut, *pFirst;.  a
5590: 73 73 65 72 74 28 20 6e 4f 70 3e 30 20 29 3b 0a  ssert( nOp>0 );.
55a0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
55b0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
55c0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  NIT );.  if( p->
55d0: 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70 2d 3e 70  nOp + nOp > p->p
55e0: 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 20  Parse->nOpAlloc 
55f0: 26 26 20 67 72 6f 77 4f 70 41 72 72 61 79 28 70  && growOpArray(p
5600: 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20 20 72 65  , nOp) ){.    re
5610: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 46  turn 0;.  }.  pF
5620: 69 72 73 74 20 3d 20 70 4f 75 74 20 3d 20 26 70  irst = pOut = &p
5630: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d 3b 0a 20  ->aOp[p->nOp];. 
5640: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b   for(i=0; i<nOp;
5650: 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20 70 4f 75   i++, aOp++, pOu
5660: 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75 74 2d 3e  t++){.    pOut->
5670: 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d 3e 6f 70  opcode = aOp->op
5680: 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75 74 2d 3e  code;.    pOut->
5690: 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b 0a 20 20  p1 = aOp->p1;.  
56a0: 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61 4f 70    pOut->p2 = aOp
56b0: 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73 65 72 74  ->p2;.    assert
56c0: 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20 29 3b 0a  ( aOp->p2>=0 );.
56d0: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 33      if( (sqlite3
56e0: 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 61  OpcodeProperty[a
56f0: 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  Op->opcode] & OP
5700: 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20  FLG_JUMP)!=0 && 
5710: 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a 20 20 20  aOp->p2>0 ){.   
5720: 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b 3d 20 70     pOut->p2 += p
5730: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20  ->nOp;.    }.   
5740: 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61 4f 70 2d   pOut->p3 = aOp-
5750: 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p3;.    pOut->p
5760: 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53  4type = P4_NOTUS
5770: 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70 34  ED;.    pOut->p4
5780: 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 75 74  .p = 0;.    pOut
5790: 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65 66  ->p5 = 0;.#ifdef
57a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
57b0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
57c0: 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f 6d 6d 65      pOut->zComme
57d0: 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  nt = 0;.#endif.#
57e0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
57f0: 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 70  E_COVERAGE.    p
5800: 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20  Out->iSrcLine = 
5810: 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65 6c 73 65  iLineno+i;.#else
5820: 0a 20 20 20 20 28 76 6f 69 64 29 69 4c 69 6e 65  .    (void)iLine
5830: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  no;.#endif.#ifde
5840: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
5850: 20 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c     if( p->db->fl
5860: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62  ags & SQLITE_Vdb
5870: 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20  eAddopTrace ){. 
5880: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
5890: 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 70 2d 3e  PrintOp(0, i+p->
58a0: 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 70  nOp, &p->aOp[i+p
58b0: 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20 7d 0a 23  ->nOp]);.    }.#
58c0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70 2d 3e 6e  endif.  }.  p->n
58d0: 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20 72 65 74  Op += nOp;.  ret
58e0: 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d 0a 0a 23  urn pFirst;.}..#
58f0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5900: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
5910: 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20  ANSTATUS)./*.** 
5920: 41 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20  Add an entry to 
5930: 74 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75  the array of cou
5940: 6e 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79  nters managed by
5950: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
5960: 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76  anstatus()..*/.v
5970: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
5980: 63 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62  canStatus(.  Vdb
5990: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
59a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
59b0: 56 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74  VM to add scanst
59c0: 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69  atus() to */.  i
59d0: 6e 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20  nt addrExplain, 
59e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
59f0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f  * Address of OP_
5a00: 45 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a  Explain (or 0) *
5a10: 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70  /.  int addrLoop
5a20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5a30: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
5a40: 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  f loop counter *
5a50: 2f 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73  / .  int addrVis
5a60: 69 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  it,             
5a70: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
5a80: 6f 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20  of rows visited 
5a90: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67  counter */.  Log
5aa0: 45 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20  Est nEst,       
5ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5ac0: 45 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72  Estimated number
5ad0: 20 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20   of output rows 
5ae0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5af0: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20  *zName          
5b00: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
5b10: 74 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62  table or index b
5b20: 65 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a  eing scanned */.
5b30: 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  ){.  int nByte =
5b40: 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20   (p->nScan+1) * 
5b50: 73 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75  sizeof(ScanStatu
5b60: 73 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73  s);.  ScanStatus
5b70: 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d   *aNew;.  aNew =
5b80: 20 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71   (ScanStatus*)sq
5b90: 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70  lite3DbRealloc(p
5ba0: 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20  ->db, p->aScan, 
5bb0: 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e  nByte);.  if( aN
5bc0: 65 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74  ew ){.    ScanSt
5bd0: 61 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e  atus *pNew = &aN
5be0: 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a  ew[p->nScan++];.
5bf0: 20 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78      pNew->addrEx
5c00: 70 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c  plain = addrExpl
5c10: 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ain;.    pNew->a
5c20: 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f  ddrLoop = addrLo
5c30: 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  op;.    pNew->ad
5c40: 64 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69  drVisit = addrVi
5c50: 73 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e  sit;.    pNew->n
5c60: 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20  Est = nEst;.    
5c70: 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  pNew->zName = sq
5c80: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d  lite3DbStrDup(p-
5c90: 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  >db, zName);.   
5ca0: 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77   p->aScan = aNew
5cb0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
5cc0: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5cd0: 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6f  e value of the o
5ce0: 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c 20 50 32  pcode, or P1, P2
5cf0: 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f 70 65 72  , P3, or P5 oper
5d00: 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61 20 73 70  ands.** for a sp
5d10: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
5d20: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
5d30: 74 65 33 56 64 62 65 43 68 61 6e 67 65 4f 70 63  te3VdbeChangeOpc
5d40: 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 33 32  ode(Vdbe *p, u32
5d50: 20 61 64 64 72 2c 20 75 38 20 69 4e 65 77 4f 70   addr, u8 iNewOp
5d60: 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69 74 65 33  code){.  sqlite3
5d70: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5d80: 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69 4e 65 77  )->opcode = iNew
5d90: 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69 64 20 73  Opcode;.}.void s
5da0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5db0: 50 31 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P1(Vdbe *p, u32 
5dc0: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
5dd0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74    sqlite3VdbeGet
5de0: 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 31 20 3d  Op(p,addr)->p1 =
5df0: 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c   val;.}.void sql
5e00: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
5e10: 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64  (Vdbe *p, u32 ad
5e20: 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20  dr, int val){.  
5e30: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5e40: 28 70 2c 61 64 64 72 29 2d 3e 70 32 20 3d 20 76  (p,addr)->p2 = v
5e50: 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74  al;.}.void sqlit
5e60: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 56  e3VdbeChangeP3(V
5e70: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
5e80: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 73 71  , int val){.  sq
5e90: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 70  lite3VdbeGetOp(p
5ea0: 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20 76 61 6c  ,addr)->p3 = val
5eb0: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
5ec0: 56 64 62 65 43 68 61 6e 67 65 50 35 28 56 64 62  VdbeChangeP5(Vdb
5ed0: 65 20 2a 70 2c 20 75 38 20 70 35 29 7b 0a 20 20  e *p, u8 p5){.  
5ee0: 69 66 28 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  if( !p->db->mall
5ef0: 6f 63 46 61 69 6c 65 64 20 29 20 70 2d 3e 61 4f  ocFailed ) p->aO
5f00: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d  p[p->nOp-1].p5 =
5f10: 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   p5;.}../*.** Ch
5f20: 61 6e 67 65 20 74 68 65 20 50 32 20 6f 70 65 72  ange the P2 oper
5f30: 61 6e 64 20 6f 66 20 69 6e 73 74 72 75 63 74 69  and of instructi
5f40: 6f 6e 20 61 64 64 72 20 73 6f 20 74 68 61 74 20  on addr so that 
5f50: 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  it points to.** 
5f60: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
5f70: 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74  he next instruct
5f80: 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64 65 64 2e  ion to be coded.
5f90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5fa0: 56 64 62 65 4a 75 6d 70 48 65 72 65 28 56 64 62  VdbeJumpHere(Vdb
5fb0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
5fc0: 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46  .  p->pParse->iF
5fd0: 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70 20  ixedOp = p->nOp 
5fe0: 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  - 1;.  sqlite3Vd
5ff0: 62 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64  beChangeP2(p, ad
6000: 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 7d 0a 0a  dr, p->nOp);.}..
6010: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  ./*.** If the in
6020: 70 75 74 20 46 75 6e 63 44 65 66 20 73 74 72 75  put FuncDef stru
6030: 63 74 75 72 65 20 69 73 20 65 70 68 65 6d 65 72  cture is ephemer
6040: 61 6c 2c 20 74 68 65 6e 20 66 72 65 65 20 69 74  al, then free it
6050: 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20 46 75 6e  .  If.** the Fun
6060: 63 44 65 66 20 69 73 20 6e 6f 74 20 65 70 68 65  cDef is not ephe
6070: 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f 20 6e 6f  rmal, then do no
6080: 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  thing..*/.static
6090: 20 76 6f 69 64 20 66 72 65 65 45 70 68 65 6d 65   void freeEpheme
60a0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73 71 6c 69  ralFunction(sqli
60b0: 74 65 33 20 2a 64 62 2c 20 46 75 6e 63 44 65 66  te3 *db, FuncDef
60c0: 20 2a 70 44 65 66 29 7b 0a 20 20 69 66 28 20 28   *pDef){.  if( (
60d0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
60e0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 50  & SQLITE_FUNC_EP
60f0: 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20 20 20 73  HEM)!=0 ){.    s
6100: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
6110: 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d 0a 0a 73   pDef);.  }.}..s
6120: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46  tatic void vdbeF
6130: 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c 69 74  reeOpArray(sqlit
6140: 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69 6e 74 29  e3 *, Op *, int)
6150: 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  ;../*.** Delete 
6160: 61 20 50 34 20 76 61 6c 75 65 20 69 66 20 6e 65  a P4 value if ne
6170: 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73 74 61 74  cessary..*/.stat
6180: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
6190: 4e 45 20 76 6f 69 64 20 66 72 65 65 50 34 4d 65  NE void freeP4Me
61a0: 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4d  m(sqlite3 *db, M
61b0: 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d  em *p){.  if( p-
61c0: 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69  >szMalloc ) sqli
61d0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
61e0: 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 73 71 6c  >zMalloc);.  sql
61f0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
6200: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53 51 4c 49  );.}.static SQLI
6210: 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64  TE_NOINLINE void
6220: 20 66 72 65 65 50 34 46 75 6e 63 43 74 78 28 73   freeP4FuncCtx(s
6230: 71 6c 69 74 65 33 20 2a 64 62 2c 20 73 71 6c 69  qlite3 *db, sqli
6240: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 29 7b  te3_context *p){
6250: 0a 20 20 66 72 65 65 45 70 68 65 6d 65 72 61 6c  .  freeEphemeral
6260: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 2d 3e  Function(db, p->
6270: 70 46 75 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65  pFunc);.  sqlite
6280: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
6290: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
62a0: 65 65 50 34 28 73 71 6c 69 74 65 33 20 2a 64 62  eeP4(sqlite3 *db
62b0: 2c 20 69 6e 74 20 70 34 74 79 70 65 2c 20 76 6f  , int p4type, vo
62c0: 69 64 20 2a 70 34 29 7b 0a 20 20 61 73 73 65 72  id *p4){.  asser
62d0: 74 28 20 64 62 20 29 3b 0a 20 20 73 77 69 74 63  t( db );.  switc
62e0: 68 28 20 70 34 74 79 70 65 20 29 7b 0a 20 20 20  h( p4type ){.   
62f0: 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58   case P4_FUNCCTX
6300: 3a 20 7b 0a 20 20 20 20 20 20 66 72 65 65 50 34  : {.      freeP4
6310: 46 75 6e 63 43 74 78 28 64 62 2c 20 28 73 71 6c  FuncCtx(db, (sql
6320: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 70 34  ite3_context*)p4
6330: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6340: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
6350: 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63 61 73 65  4_REAL:.    case
6360: 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 63   P4_INT64:.    c
6370: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
6380: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 41      case P4_INTA
6390: 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 73 71  RRAY: {.      sq
63a0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
63b0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
63c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
63d0: 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20   P4_KEYINFO: {. 
63e0: 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42       if( db->pnB
63f0: 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73  ytesFreed==0 ) s
6400: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
6410: 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29 70 34 29  ef((KeyInfo*)p4)
6420: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6430: 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
6440: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
6450: 5f 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20  _HINTS.    case 
6460: 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20  P4_EXPR: {.     
6470: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
6480: 74 65 28 64 62 2c 20 28 45 78 70 72 2a 29 70 34  te(db, (Expr*)p4
6490: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
64a0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
64b0: 20 63 61 73 65 20 50 34 5f 4d 50 52 49 4e 54 46   case P4_MPRINTF
64c0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62  : {.      if( db
64d0: 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d  ->pnBytesFreed==
64e0: 30 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  0 ) sqlite3_free
64f0: 28 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  (p4);.      brea
6500: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6510: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
6520: 20 20 20 20 20 20 66 72 65 65 45 70 68 65 6d 65        freeEpheme
6530: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
6540: 28 46 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20  (FuncDef*)p4);. 
6550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6560: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45  }.    case P4_ME
6570: 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64  M: {.      if( d
6580: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
6590: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
65a0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 28  lite3ValueFree((
65b0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70  sqlite3_value*)p
65c0: 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  4);.      }else{
65d0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 50 34 4d  .        freeP4M
65e0: 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29 70 34 29  em(db, (Mem*)p4)
65f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6600: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
6610: 20 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20   case P4_VTAB : 
6620: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
6630: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
6640: 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c  ) sqlite3VtabUnl
6650: 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70 34  ock((VTable *)p4
6660: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6670: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
6680: 2a 2a 20 46 72 65 65 20 74 68 65 20 73 70 61 63  ** Free the spac
6690: 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20  e allocated for 
66a0: 61 4f 70 20 61 6e 64 20 61 6e 79 20 70 34 20 76  aOp and any p4 v
66b0: 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74 65 64 20  alues allocated 
66c0: 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64  for the.** opcod
66d0: 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74  es contained wit
66e0: 68 69 6e 2e 20 49 66 20 61 4f 70 20 69 73 20 6e  hin. If aOp is n
66f0: 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73 20 61 73  ot NULL it is as
6700: 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74 61 69 6e  sumed to contain
6710: 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72 69 65 73   .** nOp entries
6720: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  . .*/.static voi
6730: 64 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61  d vdbeFreeOpArra
6740: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4f  y(sqlite3 *db, O
6750: 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e 4f 70 29  p *aOp, int nOp)
6760: 7b 0a 20 20 69 66 28 20 61 4f 70 20 29 7b 0a 20  {.  if( aOp ){. 
6770: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 20 20     Op *pOp;.    
6780: 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20 70 4f 70  for(pOp=aOp; pOp
6790: 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70 4f 70 2b  <&aOp[nOp]; pOp+
67a0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4f  +){.      if( pO
67b0: 70 2d 3e 70 34 74 79 70 65 20 29 20 66 72 65 65  p->p4type ) free
67c0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
67d0: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
67e0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
67f0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
6800: 4d 45 4e 54 53 0a 20 20 20 20 20 20 73 71 6c 69  MENTS.      sqli
6810: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4f  te3DbFree(db, pO
6820: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 23 65  p->zComment);.#e
6830: 6e 64 69 66 20 20 20 20 20 0a 20 20 20 20 7d 0a  ndif     .    }.
6840: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46    }.  sqlite3DbF
6850: 72 65 65 28 64 62 2c 20 61 4f 70 29 3b 0a 7d 0a  ree(db, aOp);.}.
6860: 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74 68 65 20  ./*.** Link the 
6870: 53 75 62 50 72 6f 67 72 61 6d 20 6f 62 6a 65 63  SubProgram objec
6880: 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
6890: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
68a0: 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 0a  into the linked.
68b0: 2a 2a 20 6c 69 73 74 20 61 74 20 56 64 62 65 2e  ** list at Vdbe.
68c0: 70 53 75 62 50 72 6f 67 72 61 6d 2e 20 54 68 69  pSubProgram. Thi
68d0: 73 20 6c 69 73 74 20 69 73 20 75 73 65 64 20 74  s list is used t
68e0: 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20 73 75 62  o delete all sub
68f0: 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f 62 6a 65  -program.** obje
6900: 63 74 73 20 77 68 65 6e 20 74 68 65 20 56 4d 20  cts when the VM 
6910: 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 72 65 71  is no longer req
6920: 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73  uired..*/.void s
6930: 71 6c 69 74 65 33 56 64 62 65 4c 69 6e 6b 53 75  qlite3VdbeLinkSu
6940: 62 50 72 6f 67 72 61 6d 28 56 64 62 65 20 2a 70  bProgram(Vdbe *p
6950: 56 64 62 65 2c 20 53 75 62 50 72 6f 67 72 61 6d  Vdbe, SubProgram
6960: 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e 65 78 74   *p){.  p->pNext
6970: 20 3d 20 70 56 64 62 65 2d 3e 70 50 72 6f 67 72   = pVdbe->pProgr
6980: 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e 70 50 72  am;.  pVdbe->pPr
6990: 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a  ogram = p;.}../*
69a0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6f  .** Change the o
69b0: 70 63 6f 64 65 20 61 74 20 61 64 64 72 20 69 6e  pcode at addr in
69c0: 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f 0a 69 6e  to OP_Noop.*/.in
69d0: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  t sqlite3VdbeCha
69e0: 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62 65 20 2a  ngeToNoop(Vdbe *
69f0: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6a00: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
6a10: 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  f( p->db->malloc
6a20: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
6a30: 30 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64  0;.  assert( add
6a40: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
6a50: 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20 3d 20 26  nOp );.  pOp = &
6a60: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
6a70: 66 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f  freeP4(p->db, pO
6a80: 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e  p->p4type, pOp->
6a90: 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34  p4.p);.  pOp->p4
6aa0: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
6ab0: 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d  D;.  pOp->p4.z =
6ac0: 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63 6f 64   0;.  pOp->opcod
6ad0: 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20 72  e = OP_Noop;.  r
6ae0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
6af0: 2a 20 49 66 20 74 68 65 20 6c 61 73 74 20 6f 70  * If the last op
6b00: 63 6f 64 65 20 69 73 20 22 6f 70 22 20 61 6e 64  code is "op" and
6b10: 20 69 74 20 69 73 20 6e 6f 74 20 61 20 6a 75 6d   it is not a jum
6b20: 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a  p destination,.*
6b30: 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65 20 69 74  * then remove it
6b40: 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
6b50: 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 61 6e  f and only if an
6b60: 20 6f 70 63 6f 64 65 20 77 61 73 20 72 65 6d 6f   opcode was remo
6b70: 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
6b80: 74 65 33 56 64 62 65 44 65 6c 65 74 65 50 72 69  te3VdbeDeletePri
6b90: 6f 72 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70  orOpcode(Vdbe *p
6ba0: 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69 66 28 20  , u8 op){.  if( 
6bb0: 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70  (p->nOp-1)>(p->p
6bc0: 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f 70 29  Parse->iFixedOp)
6bd0: 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f   && p->aOp[p->nO
6be0: 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20  p-1].opcode==op 
6bf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
6c00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54  lite3VdbeChangeT
6c10: 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d  oNoop(p, p->nOp-
6c20: 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  1);.  }else{.   
6c30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d   return 0;.  }.}
6c40: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
6c50: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
6c60: 50 34 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P4 operand for a
6c70: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
6c80: 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72  ction..** This r
6c90: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c  outine is useful
6ca0: 20 77 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72   when a large pr
6cb0: 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20  ogram is loaded 
6cc0: 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63  from a.** static
6cd0: 20 61 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c   array using sql
6ce0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
6cf0: 74 20 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f  t but we want to
6d00: 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d   make a.** few m
6d10: 69 6e 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20  inor changes to 
6d20: 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a  the program..**.
6d30: 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20  ** If n>=0 then 
6d40: 74 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 69  the P4 operand i
6d50: 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69  s dynamic, meani
6d60: 6e 67 20 74 68 61 74 20 61 20 63 6f 70 79 20 6f  ng that a copy o
6d70: 66 0a 2a 2a 20 74 68 65 20 73 74 72 69 6e 67 20  f.** the string 
6d80: 69 73 20 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d  is made into mem
6d90: 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
6da0: 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
6db0: 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f  ()..** A value o
6dc0: 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70  f n==0 means cop
6dd0: 79 20 62 79 74 65 73 20 6f 66 20 7a 50 34 20 75  y bytes of zP4 u
6de0: 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69  p to and includi
6df0: 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72 73 74 20  ng the.** first 
6e00: 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49 66 20 6e  null byte.  If n
6e10: 3e 30 20 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31  >0 then copy n+1
6e20: 20 62 79 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a   bytes of zP4..*
6e30: 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75  * .** Other valu
6e40: 65 73 20 6f 66 20 6e 20 28 50 34 5f 53 54 41 54  es of n (P4_STAT
6e50: 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65  IC, P4_COLLSEQ e
6e60: 74 63 2e 29 20 69 6e 64 69 63 61 74 65 20 74 68  tc.) indicate th
6e70: 61 74 20 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a  at zP4 points.**
6e80: 20 74 6f 20 61 20 73 74 72 69 6e 67 20 6f 72 20   to a string or 
6e90: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 69  structure that i
6ea0: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
6eb0: 65 78 69 73 74 20 66 6f 72 20 74 68 65 20 6c 69  exist for the li
6ec0: 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65  fetime of.** the
6ed0: 20 56 64 62 65 2e 20 49 6e 20 74 68 65 73 65 20   Vdbe. In these 
6ee0: 63 61 73 65 73 20 77 65 20 63 61 6e 20 6a 75 73  cases we can jus
6ef0: 74 20 63 6f 70 79 20 74 68 65 20 70 6f 69 6e 74  t copy the point
6f00: 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64  er..**.** If add
6f10: 72 3c 30 20 74 68 65 6e 20 63 68 61 6e 67 65 20  r<0 then change 
6f20: 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  P4 on the most r
6f30: 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64  ecently inserted
6f40: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6f50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 53 51 4c  .static void SQL
6f60: 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76 64 62  ITE_NOINLINE vdb
6f70: 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 0a 20  eChangeP4Full(. 
6f80: 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f 70 20 2a   Vdbe *p,.  Op *
6f90: 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  pOp,.  const cha
6fa0: 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74 20 6e 0a  r *zP4,.  int n.
6fb0: 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 70 34  ){.  if( pOp->p4
6fc0: 74 79 70 65 20 29 7b 0a 20 20 20 20 66 72 65 65  type ){.    free
6fd0: 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70 2d 3e 70  P4(p->db, pOp->p
6fe0: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
6ff0: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
7000: 70 65 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70 2d  pe = 0;.    pOp-
7010: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 7d 0a 20  >p4.p = 0;.  }. 
7020: 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20 20 20 20   if( n<0 ){.    
7030: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
7040: 65 50 34 28 70 2c 20 28 69 6e 74 29 28 70 4f 70  eP4(p, (int)(pOp
7050: 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a 50 34 2c   - p->aOp), zP4,
7060: 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   n);.  }else{.  
7070: 20 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d    if( n==0 ) n =
7080: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7090: 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  (zP4);.    pOp->
70a0: 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62  p4.z = sqlite3Db
70b0: 53 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a  StrNDup(p->db, z
70c0: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d  P4, n);.    pOp-
70d0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e  >p4type = P4_DYN
70e0: 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64  AMIC;.  }.}.void
70f0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7100: 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20 69 6e  geP4(Vdbe *p, in
7110: 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20 63 68  t addr, const ch
7120: 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e 29 7b  ar *zP4, int n){
7130: 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 73 71  .  Op *pOp;.  sq
7140: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61 73 73  lite3 *db;.  ass
7150: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 64  ert( p!=0 );.  d
7160: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
7170: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
7180: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
7190: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ;.  assert( p->a
71a0: 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c  Op!=0 || db->mal
71b0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
71c0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
71d0: 6c 65 64 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  led ){.    if( n
71e0: 21 3d 50 34 5f 56 54 41 42 20 29 20 66 72 65 65  !=P4_VTAB ) free
71f0: 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64 2a  P4(db, n, (void*
7200: 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29 3b  )*(char**)&zP4);
7210: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7220: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
7230: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
7240: 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b 0a   addr<p->nOp );.
7250: 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a    if( addr<0 ){.
7260: 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f      addr = p->nO
7270: 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f 70  p - 1;.  }.  pOp
7280: 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d   = &p->aOp[addr]
7290: 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20 7c 7c 20  ;.  if( n>=0 || 
72a0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20  pOp->p4type ){. 
72b0: 20 20 20 76 64 62 65 43 68 61 6e 67 65 50 34 46     vdbeChangeP4F
72c0: 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a 50 34 2c  ull(p, pOp, zP4,
72d0: 20 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b   n);.    return;
72e0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 50 34  .  }.  if( n==P4
72f0: 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20 2f 2a  _INT32 ){.    /*
7300: 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61 73 74   Note: this cast
7310: 20 69 73 20 73 61 66 65 2c 20 62 65 63 61 75 73   is safe, becaus
7320: 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64 61 74  e the origin dat
7330: 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e 20 69  a point was an i
7340: 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 77  nt.    ** that w
7350: 61 73 20 63 61 73 74 20 74 6f 20 61 20 28 63 6f  as cast to a (co
7360: 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a 2f 0a  nst char *). */.
7370: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20 3d 20      pOp->p4.i = 
7380: 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
7390: 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d  T(zP4);.    pOp-
73a0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49 4e 54  >p4type = P4_INT
73b0: 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  32;.  }else if( 
73c0: 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20 20 61 73  zP4!=0 ){.    as
73d0: 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a 20 20 20  sert( n<0 );.   
73e0: 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f   pOp->p4.p = (vo
73f0: 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70  id*)zP4;.    pOp
7400: 2d 3e 70 34 74 79 70 65 20 3d 20 28 73 69 67 6e  ->p4type = (sign
7410: 65 64 20 63 68 61 72 29 6e 3b 0a 20 20 20 20 69  ed char)n;.    i
7420: 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42 20 29 20  f( n==P4_VTAB ) 
7430: 73 71 6c 69 74 65 33 56 74 61 62 4c 6f 63 6b 28  sqlite3VtabLock(
7440: 28 56 54 61 62 6c 65 2a 29 7a 50 34 29 3b 0a 20  (VTable*)zP4);. 
7450: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
7460: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
7470: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
7480: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
7490: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
74a0: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
74b0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
74c0: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
74d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
74e0: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
74f0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
7500: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
7510: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
7520: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
7530: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7540: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
7550: 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
7560: 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
7570: 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20   pIdx),.        
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
7590: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
75a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
75b0: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
75c0: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
75d0: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
75e0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
75f0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
7600: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
7610: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
7620: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
7630: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
7640: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
7650: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
7660: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
7670: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
7680: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
7690: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
76a0: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
76b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
76c0: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
76d0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
76e0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
76f0: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
7700: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
7710: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
7720: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
7730: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
7740: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
7750: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
7760: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
7770: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
7780: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
7790: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
77a0: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
77b0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
77c0: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
77d0: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
77e0: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
77f0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
7800: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
7810: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
7820: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
7830: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
7840: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
7850: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
7860: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
7870: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
7880: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
7890: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
78a0: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
78b0: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
78c0: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
78d0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
78e0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
78f0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
7900: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
7910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7920: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
7930: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
7940: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
7950: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
7960: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
7970: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
7980: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
7990: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
79a0: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
79b0: 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65  OVERAGE./*.** Se
79c0: 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74  t the value if t
79d0: 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c  he iSrcLine fiel
79e0: 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
79f0: 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  usly coded instr
7a00: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
7a10: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69  sqlite3VdbeSetLi
7a20: 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76  neNumber(Vdbe *v
7a30: 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20  , int iLine){.  
7a40: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
7a50: 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65  (v,-1)->iSrcLine
7a60: 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64   = iLine;.}.#end
7a70: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42  if /* SQLITE_VDB
7a80: 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f  E_COVERAGE */../
7a90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
7aa0: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
7ab0: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
7ac0: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
7ad0: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
7ae0: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
7af0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
7b00: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
7b10: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
7b20: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
7b30: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
7b40: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
7b50: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
7b60: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
7b70: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
7b80: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
7b90: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
7ba0: 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74   is readable but
7bb0: 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
7bc0: 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74  hough it is cast
7bd0: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76   to a writable v
7be0: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  alue..** The ret
7bf0: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f  urn of a dummy o
7c00: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
7c10: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
7c20: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a  e functioning.**
7c30: 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61   after an OOM fa
7c40: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
7c50: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
7c60: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
7c70: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
7c80: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
7c90: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
7ca0: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
7cb0: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
7cc0: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
7cd0: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
7ce0: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
7cf0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
7d00: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
7d10: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
7d20: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
7d30: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
7d40: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
7d50: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
7d60: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
7d70: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
7d80: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
7d90: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
7da0: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
7db0: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
7dc0: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
7dd0: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
7de0: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
7df0: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
7e00: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
7e10: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
7e20: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
7e30: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
7e40: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
7e50: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
7e60: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
7e70: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
7e80: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
7e90: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
7ea0: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
7eb0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7ec0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
7ed0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
7ee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
7ef0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
7f00: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7f10: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
7f20: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
7f30: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
7f40: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
7f50: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
7f60: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
7f70: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
7f80: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
7f90: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
7fa0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
7fb0: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
7fc0: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
7fd0: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
7fe0: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
7ff0: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
8000: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
8010: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
8020: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
8030: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
8040: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
8050: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
8060: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
8070: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
8080: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
8090: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
80a0: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
80b0: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
80c0: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
80d0: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
80e0: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
80f0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
8100: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
8110: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
8120: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
8130: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
8140: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
8150: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
8160: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
8170: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
8180: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
8190: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
81a0: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
81b0: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
81c0: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
81d0: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
81e0: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
81f0: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
8200: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
8210: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
8220: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
8230: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
8240: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
8250: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
8260: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
8270: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
8280: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
8290: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
82a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
82b0: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
82c0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
82d0: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
82e0: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
82f0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
8300: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
8310: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
8320: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
8330: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
8340: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
8350: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
8360: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
8370: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
8380: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
8390: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
83a0: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
83b0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
83c0: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
83d0: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
83e0: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  zOpName = sq
83f0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
8400: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20  pOp->opcode);.  
8410: 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  nOpName = sqlite
8420: 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d  3Strlen30(zOpNam
8430: 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d  e);.  if( zOpNam
8440: 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a  e[nOpName+1] ){.
8450: 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20      int seenCom 
8460: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  = 0;.    char c;
8470: 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d  .    zSynopsis =
8480: 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e   zOpName += nOpN
8490: 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72  ame + 1;.    for
84a0: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
84b0: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
84c0: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
84d0: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
84e0: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
84f0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
8500: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
8510: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
8520: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
8530: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
8540: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
8550: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
8560: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
8570: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
8580: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
8590: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
85a0: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
85b0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
85c0: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
85d0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
85e0: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
85f0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
8600: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
8610: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
8620: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
8630: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
8640: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
8650: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
8660: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
8670: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
8680: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
8690: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
86a0: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
86b0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
86c0: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
86d0: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
86e0: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
86f0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
8700: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
8710: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
8720: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
8730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
8740: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
8750: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
8760: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8770: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
8780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
8790: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
87a0: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
87b0: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
87c0: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
87d0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
87e0: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
87f0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
8800: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
8810: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
8820: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
8830: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
8840: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8850: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
8860: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
8870: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8880: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
8890: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
88a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
88b0: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
88c0: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
88d0: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
88e0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
88f0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8900: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
8910: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
8920: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
8930: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
8940: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
8950: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
8960: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
8970: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
8980: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
8990: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
89a0: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
89b0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
89c0: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
89d0: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
89e0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
89f0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
8a00: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
8a10: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
8a20: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
8a30: 42 55 47 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45  BUG */..#if VDBE
8a40: 5f 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64  _DISPLAY_P4 && d
8a50: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
8a60: 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54  ABLE_CURSOR_HINT
8a70: 53 29 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61  S)./*.** Transla
8a80: 74 65 20 74 68 65 20 50 34 2e 70 45 78 70 72 20  te the P4.pExpr 
8a90: 76 61 6c 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f  value for an OP_
8aa0: 43 75 72 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64  CursorHint opcod
8ab0: 65 20 69 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74  e into text.** t
8ac0: 68 61 74 20 63 61 6e 20 62 65 20 64 69 73 70 6c  hat can be displ
8ad0: 61 79 65 64 20 69 6e 20 74 68 65 20 50 34 20 63  ayed in the P4 c
8ae0: 6f 6c 75 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e  olumn of EXPLAIN
8af0: 20 6f 75 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74   output..*/.stat
8b00: 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 50  ic void displayP
8b10: 34 45 78 70 72 28 53 74 72 41 63 63 75 6d 20 2a  4Expr(StrAccum *
8b20: 70 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  p, Expr *pExpr){
8b30: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
8b40: 4f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68  Op = 0;.  switch
8b50: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
8b60: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
8b70: 47 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  G:.      sqlite3
8b80: 58 50 72 69 6e 74 66 28 70 2c 20 22 25 51 22 2c  XPrintf(p, "%Q",
8b90: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
8ba0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8bb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
8bc0: 47 45 52 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  GER:.      sqlit
8bd0: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 64  e3XPrintf(p, "%d
8be0: 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c  ", pExpr->u.iVal
8bf0: 75 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ue);.      break
8c00: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ;.    case TK_NU
8c10: 4c 4c 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LL:.      sqlite
8c20: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c  3XPrintf(p, "NUL
8c30: 4c 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  L");.      break
8c40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
8c50: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
8c60: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8c70: 2c 20 22 72 5b 25 64 5d 22 2c 20 70 45 78 70 72  , "r[%d]", pExpr
8c80: 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  ->iTable);.     
8c90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8ca0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
8cb0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
8cc0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29  xpr->iColumn<0 )
8cd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ce0: 33 58 50 72 69 6e 74 66 28 70 2c 20 22 72 6f 77  3XPrintf(p, "row
8cf0: 69 64 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  id");.      }els
8d00: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8d10: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 63 25  e3XPrintf(p, "c%
8d20: 64 22 2c 20 28 69 6e 74 29 70 45 78 70 72 2d 3e  d", (int)pExpr->
8d30: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
8d40: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8d50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8d60: 5f 4c 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20  _LT:      zOp = 
8d70: 22 4c 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b  "LT";      break
8d80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
8d90: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45  :      zOp = "LE
8da0: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8db0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
8dc0: 20 20 20 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20      zOp = "GT"; 
8dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8de0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
8df0: 20 7a 4f 70 20 3d 20 22 47 45 22 3b 20 20 20 20   zOp = "GE";    
8e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8e10: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f  e TK_NE:      zO
8e20: 70 20 3d 20 22 4e 45 22 3b 20 20 20 20 20 20 62  p = "NE";      b
8e30: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8e40: 4b 5f 45 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_EQ:      zOp =
8e50: 20 22 45 51 22 3b 20 20 20 20 20 20 62 72 65 61   "EQ";      brea
8e60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  k;.    case TK_I
8e70: 53 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 49  S:      zOp = "I
8e80: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
8e90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
8ea0: 54 3a 20 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f  T:   zOp = "ISNO
8eb0: 54 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  T";   break;.   
8ec0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20   case TK_AND:   
8ed0: 20 20 7a 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20    zOp = "AND";  
8ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8ef0: 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a  se TK_OR:      z
8f00: 4f 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 20  Op = "OR";      
8f10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8f20: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20  TK_PLUS:    zOp 
8f30: 3d 20 22 41 44 44 22 3b 20 20 20 20 20 62 72 65  = "ADD";     bre
8f40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8f50: 53 54 41 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22  STAR:    zOp = "
8f60: 4d 55 4c 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  MUL";     break;
8f70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
8f80: 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 53 55 42  US:   zOp = "SUB
8f90: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8fa0: 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20    case TK_REM:  
8fb0: 20 20 20 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20     zOp = "REM"; 
8fc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8fd0: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20  ase TK_BITAND:  
8fe0: 7a 4f 70 20 3d 20 22 42 49 54 41 4e 44 22 3b 20  zOp = "BITAND"; 
8ff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
9000: 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70   TK_BITOR:   zOp
9010: 20 3d 20 22 42 49 54 4f 52 22 3b 20 20 20 62 72   = "BITOR";   br
9020: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9030: 5f 53 4c 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20  _SLASH:   zOp = 
9040: 22 44 49 56 22 3b 20 20 20 20 20 62 72 65 61 6b  "DIV";     break
9050: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
9060: 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53  HIFT:  zOp = "LS
9070: 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HIFT";  break;. 
9080: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
9090: 54 3a 20 20 7a 4f 70 20 3d 20 22 52 53 48 49 46  T:  zOp = "RSHIF
90a0: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
90b0: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
90c0: 20 7a 4f 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b   zOp = "CONCAT";
90d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
90e0: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f  e TK_UMINUS:  zO
90f0: 70 20 3d 20 22 4d 49 4e 55 53 22 3b 20 20 20 62  p = "MINUS";   b
9100: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9110: 4b 5f 55 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d  K_UPLUS:   zOp =
9120: 20 22 50 4c 55 53 22 3b 20 20 20 20 62 72 65 61   "PLUS";    brea
9130: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
9140: 49 54 4e 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42  ITNOT:  zOp = "B
9150: 49 54 4e 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a  ITNOT";  break;.
9160: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
9170: 20 20 20 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22       zOp = "NOT"
9180: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
9190: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
91a0: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22    zOp = "ISNULL"
91b0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
91c0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  se TK_NOTNULL: z
91d0: 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
91e0: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61  break;..    defa
91f0: 75 6c 74 3a 0a 20 20 20 20 20 20 73 71 6c 69 74  ult:.      sqlit
9200: 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25 73  e3XPrintf(p, "%s
9210: 22 2c 20 22 65 78 70 72 22 29 3b 0a 20 20 20 20  ", "expr");.    
9220: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
9230: 69 66 28 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73  if( zOp ){.    s
9240: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
9250: 20 22 25 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20   "%s(", zOp);.  
9260: 20 20 64 69 73 70 6c 61 79 50 34 45 78 70 72 28    displayP4Expr(
9270: 70 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  p, pExpr->pLeft)
9280: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
9290: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
92a0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
92b0: 41 70 70 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31  Append(p, ",", 1
92c0: 29 3b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  );.      display
92d0: 50 34 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d  P4Expr(p, pExpr-
92e0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a  >pRight);.    }.
92f0: 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
9300: 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22 29 22  cumAppend(p, ")"
9310: 2c 20 31 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  , 1);.  }.}.#end
9320: 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c  if /* VDBE_DISPL
9330: 41 59 5f 50 34 20 26 26 20 64 65 66 69 6e 65 64  AY_P4 && defined
9340: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43  (SQLITE_ENABLE_C
9350: 55 52 53 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a  URSOR_HINTS) */.
9360: 0a 0a 23 69 66 20 56 44 42 45 5f 44 49 53 50 4c  ..#if VDBE_DISPL
9370: 41 59 5f 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  AY_P4./*.** Comp
9380: 75 74 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  ute a string tha
9390: 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
93a0: 50 34 20 70 61 72 61 6d 65 74 65 72 20 66 6f 72  P4 parameter for
93b0: 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55   an opcode..** U
93c0: 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79  se zTemp for any
93d0: 20 72 65 71 75 69 72 65 64 20 74 65 6d 70 6f 72   required tempor
93e0: 61 72 79 20 62 75 66 66 65 72 20 73 70 61 63 65  ary buffer space
93f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
9400: 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70 20 2a   *displayP4(Op *
9410: 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70  pOp, char *zTemp
9420: 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20  , int nTemp){.  
9430: 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d  char *zP4 = zTem
9440: 70 3b 0a 20 20 53 74 72 41 63 63 75 6d 20 78 3b  p;.  StrAccum x;
9450: 0a 20 20 61 73 73 65 72 74 28 20 6e 54 65 6d 70  .  assert( nTemp
9460: 3e 3d 32 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  >=20 );.  sqlite
9470: 33 53 74 72 41 63 63 75 6d 49 6e 69 74 28 26 78  3StrAccumInit(&x
9480: 2c 20 30 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d  , 0, zTemp, nTem
9490: 70 2c 20 30 29 3b 0a 20 20 73 77 69 74 63 68 28  p, 0);.  switch(
94a0: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a   pOp->p4type ){.
94b0: 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45 59 49      case P4_KEYI
94c0: 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  NFO: {.      int
94d0: 20 6a 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66   j;.      KeyInf
94e0: 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f  o *pKeyInfo = pO
94f0: 70 2d 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a  p->p4.pKeyInfo;.
9500: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4b        assert( pK
9510: 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
9520: 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  er!=0 );.      s
9530: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9540: 2c 20 22 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e  , "k(%d", pKeyIn
9550: 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20  fo->nField);.   
9560: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b     for(j=0; j<pK
9570: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20  eyInfo->nField; 
9580: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
9590: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
95a0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a  KeyInfo->aColl[j
95b0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ];.        const
95c0: 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70   char *zColl = p
95d0: 43 6f 6c 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e  Coll ? pColl->zN
95e0: 61 6d 65 20 3a 20 22 22 3b 0a 20 20 20 20 20 20  ame : "";.      
95f0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6f    if( strcmp(zCo
9600: 6c 6c 2c 20 22 42 49 4e 41 52 59 22 29 3d 3d 30  ll, "BINARY")==0
9610: 20 29 20 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a   ) zColl = "B";.
9620: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
9630: 50 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 73 25  Printf(&x, ",%s%
9640: 73 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  s", pKeyInfo->aS
9650: 6f 72 74 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d  ortOrder[j] ? "-
9660: 22 20 3a 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a  " : "", zColl);.
9670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
9680: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
9690: 65 6e 64 28 26 78 2c 20 22 29 22 2c 20 31 29 3b  end(&x, ")", 1);
96a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
96b0: 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
96c0: 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f  E_ENABLE_CURSOR_
96d0: 48 49 4e 54 53 0a 20 20 20 20 63 61 73 65 20 50  HINTS.    case P
96e0: 34 5f 45 58 50 52 3a 20 7b 0a 20 20 20 20 20 20  4_EXPR: {.      
96f0: 64 69 73 70 6c 61 79 50 34 45 78 70 72 28 26 78  displayP4Expr(&x
9700: 2c 20 70 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29  , pOp->p4.pExpr)
9710: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9720: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
9730: 63 61 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a  case P4_COLLSEQ:
9740: 20 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71   {.      CollSeq
9750: 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70   *pColl = pOp->p
9760: 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  4.pColl;.      s
9770: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78  qlite3XPrintf(&x
9780: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
9790: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
97a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
97b0: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
97c0: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
97d0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
97e0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
97f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9800: 26 78 2c 20 22 25 73 28 25 64 29 22 2c 20 70 44  &x, "%s(%d)", pD
9810: 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d  ef->zName, pDef-
9820: 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20 20 62 72  >nArg);.      br
9830: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65  eak;.    }.#ifde
9840: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
9850: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 43     case P4_FUNCC
9860: 54 58 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  TX: {.      Func
9870: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
9880: 3e 70 34 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b  >p4.pCtx->pFunc;
9890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
98a0: 72 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64  rintf(&x, "%s(%d
98b0: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
98c0: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
98d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
98e0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65  .#endif.    case
98f0: 20 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20   P4_INT64: {.   
9900: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9910: 66 28 26 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70  f(&x, "%lld", *p
9920: 4f 70 2d 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20  Op->p4.pI64);.  
9930: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9940: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
9950: 33 32 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  32: {.      sqli
9960: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9970: 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b  %d", pOp->p4.i);
9980: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9990: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
99a0: 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  REAL: {.      sq
99b0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
99c0: 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e   "%.16g", *pOp->
99d0: 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20 20 20 20  p4.pReal);.     
99e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
99f0: 20 20 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b    case P4_MEM: {
9a00: 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  .      Mem *pMem
9a10: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b   = pOp->p4.pMem;
9a20: 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
9a30: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72  >flags & MEM_Str
9a40: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
9a50: 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20  = pMem->z;.     
9a60: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d   }else if( pMem-
9a70: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  >flags & MEM_Int
9a80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
9a90: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9aa0: 25 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69  %lld", pMem->u.i
9ab0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
9ac0: 66 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26  f( pMem->flags &
9ad0: 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20   MEM_Real ){.   
9ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9af0: 6e 74 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c  ntf(&x, "%.16g",
9b00: 20 70 4d 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20   pMem->u.r);.   
9b10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65     }else if( pMe
9b20: 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  m->flags & MEM_N
9b30: 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ull ){.        z
9b40: 50 34 20 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20  P4 = "NULL";.   
9b50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9b60: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
9b70: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
9b80: 20 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   );.        zP4 
9b90: 3d 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20  = "(blob)";.    
9ba0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
9bb0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
9bc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
9bd0: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
9be0: 20 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20   P4_VTAB: {.    
9bf0: 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a    sqlite3_vtab *
9c00: 70 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e  pVtab = pOp->p4.
9c10: 70 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20  pVtab->pVtab;.  
9c20: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9c30: 74 66 28 26 78 2c 20 22 76 74 61 62 3a 25 70 22  tf(&x, "vtab:%p"
9c40: 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20 20  , pVtab);.      
9c50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
9c60: 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f  dif.    case P4_
9c70: 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20  INTARRAY: {.    
9c80: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
9c90: 6e 74 20 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34  nt *ai = pOp->p4
9ca0: 2e 61 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  .ai;.      int n
9cb0: 20 3d 20 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54   = ai[0];   /* T
9cc0: 68 65 20 66 69 72 73 74 20 65 6c 65 6d 65 6e 74  he first element
9cd0: 20 6f 66 20 61 6e 20 49 4e 54 41 52 52 41 59 20   of an INTARRAY 
9ce0: 69 73 20 61 6c 77 61 79 73 20 74 68 65 0a 20 20  is always the.  
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66       ** count of
9d10: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
9d20: 6c 65 6d 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f  lements to follo
9d30: 77 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69  w */.      for(i
9d40: 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =1; i<n; i++){. 
9d50: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
9d60: 72 69 6e 74 66 28 26 78 2c 20 22 2c 25 64 22 2c  rintf(&x, ",%d",
9d70: 20 61 69 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d   ai[i]);.      }
9d80: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
9d90: 3d 20 27 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c  = '[';.      sql
9da0: 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65  ite3StrAccumAppe
9db0: 6e 64 28 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a  nd(&x, "]", 1);.
9dc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9dd0: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53   }.    case P4_S
9de0: 55 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20  UBPROGRAM: {.   
9df0: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9e00: 66 28 26 78 2c 20 22 70 72 6f 67 72 61 6d 22 29  f(&x, "program")
9e10: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9e20: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
9e30: 5f 41 44 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20  _ADVANCE: {.    
9e40: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
9e50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9e60: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 54   }.    case P4_T
9e70: 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ABLE: {.      sq
9e80: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
9e90: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70   "%s", pOp->p4.p
9ea0: 54 61 62 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Tab->zName);.   
9eb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9ec0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
9ed0: 20 20 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e       zP4 = pOp->
9ee0: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20  p4.z;.      if( 
9ef0: 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zP4==0 ){.      
9f00: 20 20 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20    zP4 = zTemp;. 
9f10: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20         zTemp[0] 
9f20: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
9f30: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
9f40: 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68 28 26  StrAccumFinish(&
9f50: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 7a 50  x);.  assert( zP
9f60: 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  4!=0 );.  return
9f70: 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   zP4;.}.#endif /
9f80: 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50  * VDBE_DISPLAY_P
9f90: 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  4 */../*.** Decl
9fa0: 61 72 65 20 74 6f 20 74 68 65 20 56 64 62 65 20  are to the Vdbe 
9fb0: 74 68 61 74 20 74 68 65 20 42 54 72 65 65 20 6f  that the BTree o
9fc0: 62 6a 65 63 74 20 61 74 20 64 62 2d 3e 61 44 62  bject at db->aDb
9fd0: 5b 69 5d 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a  [i] is used..**.
9fe0: 2a 2a 20 54 68 65 20 70 72 65 70 61 72 65 64 20  ** The prepared 
9ff0: 73 74 61 74 65 6d 65 6e 74 73 20 6e 65 65 64 20  statements need 
a000: 74 6f 20 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e  to know in advan
a010: 63 65 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20  ce the complete 
a020: 73 65 74 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68  set of.** attach
a030: 65 64 20 64 61 74 61 62 61 73 65 73 20 74 68 61  ed databases tha
a040: 74 20 77 69 6c 6c 20 62 65 20 75 73 65 2e 20 20  t will be use.  
a050: 41 20 6d 61 73 6b 20 6f 66 20 74 68 65 73 65 20  A mask of these 
a060: 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 69 73 20  databases.** is 
a070: 6d 61 69 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d  maintained in p-
a080: 3e 62 74 72 65 65 4d 61 73 6b 2e 20 20 54 68 65  >btreeMask.  The
a090: 20 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c   p->lockMask val
a0a0: 75 65 20 69 73 20 74 68 65 20 73 75 62 73 65 74  ue is the subset
a0b0: 20 6f 66 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d   of.** p->btreeM
a0c0: 61 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65 73  ask of databases
a0d0: 20 74 68 61 74 20 77 69 6c 6c 20 72 65 71 75 69   that will requi
a0e0: 72 65 20 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f  re a lock..*/.vo
a0f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 55 73  id sqlite3VdbeUs
a100: 65 73 42 74 72 65 65 28 56 64 62 65 20 2a 70 2c  esBtree(Vdbe *p,
a110: 20 69 6e 74 20 69 29 7b 0a 20 20 61 73 73 65 72   int i){.  asser
a120: 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e  t( i>=0 && i<p->
a130: 64 62 2d 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e  db->nDb && i<(in
a140: 74 29 73 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b  t)sizeof(yDbMask
a150: 29 2a 38 20 29 3b 0a 20 20 61 73 73 65 72 74 28  )*8 );.  assert(
a160: 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 70   i<(int)sizeof(p
a170: 2d 3e 62 74 72 65 65 4d 61 73 6b 29 2a 38 20 29  ->btreeMask)*8 )
a180: 3b 0a 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d  ;.  DbMaskSet(p-
a190: 3e 62 74 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a  >btreeMask, i);.
a1a0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 73 71    if( i!=1 && sq
a1b0: 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 61 62  lite3BtreeSharab
a1c0: 6c 65 28 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d  le(p->db->aDb[i]
a1d0: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 44 62 4d  .pBt) ){.    DbM
a1e0: 61 73 6b 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61  askSet(p->lockMa
a1f0: 73 6b 2c 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  sk, i);.  }.}..#
a200: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a210: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a220: 41 43 48 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ACHE)./*.** If S
a230: 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65  QLite is compile
a240: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61  d to support sha
a250: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61  red-cache mode a
a260: 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73  nd to be threads
a270: 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75  afe,.** this rou
a280: 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65  tine obtains the
a290: 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65   mutex associate
a2a0: 64 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68  d with each BtSh
a2b0: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a  ared structure.*
a2c0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63  * that may be ac
a2d0: 63 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d  cessed by the VM
a2e0: 20 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72   passed as an ar
a2f0: 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67  gument. In doing
a300: 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73   so it also.** s
a310: 65 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64  ets the BtShared
a320: 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61  .db member of ea
a330: 63 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72  ch of the BtShar
a340: 65 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65  ed structures, e
a350: 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20  nsuring.** that 
a360: 74 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79  the correct busy
a370: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
a380: 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20  k is invoked if 
a390: 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  required..**.** 
a3a0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
a3b0: 20 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20   threadsafe but 
a3c0: 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61  does support sha
a3d0: 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20  red-cache mode, 
a3e0: 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42  then.** sqlite3B
a3f0: 74 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69  treeEnter() is i
a400: 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68  nvoked to set th
a410: 65 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61  e BtShared.db va
a420: 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c  riables.** of al
a430: 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74  l of BtShared st
a440: 72 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69  ructures accessi
a450: 62 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61  ble via the data
a460: 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20  base handle .** 
a470: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
a480: 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66  the VM..**.** If
a490: 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74   SQLite is not t
a4a0: 68 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f  hreadsafe and do
a4b0: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73  es not support s
a4c0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
a4d0: 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
a4e0: 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  on is a no-op..*
a4f0: 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65  *.** The p->btre
a500: 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61  eMask field is a
a510: 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20   bitmask of all 
a520: 62 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20  btrees that the 
a530: 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61  prepared .** sta
a540: 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76  tement p will ev
a550: 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62  er use.  Let N b
a560: 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  e the number of 
a570: 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65  bits in p->btree
a580: 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f  Mask.** correspo
a590: 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20  nding to btrees 
a5a0: 74 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20  that use shared 
a5b0: 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65  cache.  Then the
a5c0: 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74   runtime of.** t
a5d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e  his routine is N
a5e0: 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73  *N.  But as N is
a5f0: 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61   rarely more tha
a600: 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64  n 1, this should
a610: 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f   not.** be a pro
a620: 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  blem..*/.void sq
a630: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56  lite3VdbeEnter(V
a640: 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69  dbe *p){.  int i
a650: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
a660: 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e  .  Db *aDb;.  in
a670: 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d  t nDb;.  if( DbM
a680: 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f  askAllZero(p->lo
a690: 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e  ckMask) ) return
a6a0: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e  ;  /* The common
a6b0: 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20   case */.  db = 
a6c0: 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64  p->db;.  aDb = d
a6d0: 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20  b->aDb;.  nDb = 
a6e0: 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69  db->nDb;.  for(i
a6f0: 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b  =0; i<nDb; i++){
a700: 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26  .    if( i!=1 &&
a710: 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c   DbMaskTest(p->l
a720: 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c  ockMask,i) && AL
a730: 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21  WAYS(aDb[i].pBt!
a740: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  =0) ){.      sql
a750: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61  ite3BtreeEnter(a
a760: 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[i].pBt);.    
a770: 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  }.  }.}.#endif..
a780: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a790: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
a7a0: 43 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45  CACHE) && SQLITE
a7b0: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a  _THREADSAFE>0./*
a7c0: 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f  .** Unlock all o
a7d0: 66 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65  f the btrees pre
a7e0: 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62  viously locked b
a7f0: 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  y a call to sqli
a800: 74 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a  te3VdbeEnter()..
a810: 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
a820: 5f 4e 4f 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76  _NOINLINE void v
a830: 64 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70  dbeLeave(Vdbe *p
a840: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
a850: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20  lite3 *db;.  Db 
a860: 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b  *aDb;.  int nDb;
a870: 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  .  db = p->db;. 
a880: 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a   aDb = db->aDb;.
a890: 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b    nDb = db->nDb;
a8a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44  .  for(i=0; i<nD
a8b0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  b; i++){.    if(
a8c0: 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b 54   i!=1 && DbMaskT
a8d0: 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  est(p->lockMask,
a8e0: 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44 62  i) && ALWAYS(aDb
a8f0: 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20  [i].pBt!=0) ){. 
a900: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
a910: 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70 42  eLeave(aDb[i].pB
a920: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  t);.    }.  }.}.
a930: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
a940: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
a950: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
a960: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
a970: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
a980: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
a990: 2f 0a 20 20 76 64 62 65 4c 65 61 76 65 28 70 29  /.  vdbeLeave(p)
a9a0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
a9b0: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
a9c0: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
a9d0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
a9e0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
a9f0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
aa00: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
aa10: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
aa20: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
aa30: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
aa40: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
aa50: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
aa60: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
aa70: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
aa80: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
aa90: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
aaa0: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
aab0: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
aac0: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
aad0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
aae0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
aaf0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
ab00: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
ab10: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
ab20: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
ab30: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
ab40: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
ab50: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
ab60: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
ab70: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
ab80: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65   zCom[0] = 0;.#e
ab90: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54  ndif.  /* NB:  T
aba0: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
abb0: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Name() function 
abc0: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
abd0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20  y code created. 
abe0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63   ** by the mkopc
abf0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f  odeh.awk and mko
ac00: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70  pcodec.awk scrip
ac10: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74  ts which extract
ac20: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d   the.  ** inform
ac30: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76  ation from the v
ac40: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78  dbe.c source tex
ac50: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70  t */.  fprintf(p
ac60: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
ac70: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
ac80: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
ac90: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
aca0: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
acb0: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
acc0: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20  5,.      zCom.  
acd0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
ace0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
acf0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
ad00: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
ad10: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
ad20: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
ad30: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
ad40: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
ad50: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
ad60: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
ad70: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
ad80: 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  >db;.    if( db-
ad90: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 20 29 7b  >pnBytesFreed ){
ada0: 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
adb0: 20 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c     if( p->szMall
adc0: 6f 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72  oc ) sqlite3DbFr
add0: 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f  ee(db, p->zMallo
ade0: 63 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  c);.      }while
adf0: 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a  ( (++p)<pEnd );.
ae00: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
ae10: 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
ae20: 20 20 61 73 73 65 72 74 28 20 28 26 70 5b 31 5d    assert( (&p[1]
ae30: 29 3d 3d 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e  )==pEnd || p[0].
ae40: 64 62 3d 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20  db==p[1].db );. 
ae50: 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c       assert( sql
ae60: 69 74 65 33 56 64 62 65 43 68 65 63 6b 4d 65 6d  ite3VdbeCheckMem
ae70: 49 6e 76 61 72 69 61 6e 74 73 28 70 29 20 29 3b  Invariants(p) );
ae80: 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  ..      /* This 
ae90: 62 6c 6f 63 6b 20 69 73 20 72 65 61 6c 6c 79 20  block is really 
aea0: 61 6e 20 69 6e 6c 69 6e 65 64 20 76 65 72 73 69  an inlined versi
aeb0: 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
aec0: 65 4d 65 6d 52 65 6c 65 61 73 65 28 29 0a 20 20  eMemRelease().  
aed0: 20 20 20 20 2a 2a 20 74 68 61 74 20 74 61 6b 65      ** that take
aee0: 73 20 61 64 76 61 6e 74 61 67 65 20 6f 66 20 74  s advantage of t
aef0: 68 65 20 66 61 63 74 20 74 68 61 74 20 74 68 65  he fact that the
af00: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c   memory cell val
af10: 75 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  ue is .      ** 
af20: 62 65 69 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c  being set to NUL
af30: 4c 20 61 66 74 65 72 20 72 65 6c 65 61 73 69 6e  L after releasin
af40: 67 20 61 6e 79 20 64 79 6e 61 6d 69 63 20 72 65  g any dynamic re
af50: 73 6f 75 72 63 65 73 2e 0a 20 20 20 20 20 20 2a  sources..      *
af60: 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  *.      ** The j
af70: 75 73 74 69 66 69 63 61 74 69 6f 6e 20 66 6f 72  ustification for
af80: 20 64 75 70 6c 69 63 61 74 69 6e 67 20 63 6f 64   duplicating cod
af90: 65 20 69 73 20 74 68 61 74 20 61 63 63 6f 72 64  e is that accord
afa0: 69 6e 67 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  ing to .      **
afb0: 20 63 61 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73   callgrind, this
afc0: 20 63 61 75 73 65 73 20 61 20 63 65 72 74 61 69   causes a certai
afd0: 6e 20 74 65 73 74 20 63 61 73 65 20 74 6f 20 68  n test case to h
afe0: 69 74 20 74 68 65 20 43 50 55 20 34 2e 37 20 0a  it the CPU 4.7 .
aff0: 20 20 20 20 20 20 2a 2a 20 70 65 72 63 65 6e 74        ** percent
b000: 20 6c 65 73 73 20 28 78 38 36 20 6c 69 6e 75 78   less (x86 linux
b010: 2c 20 67 63 63 20 76 65 72 73 69 6f 6e 20 34 2e  , gcc version 4.
b020: 31 2e 32 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69  1.2, -O6) than i
b030: 66 20 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  f .      ** sqli
b040: 74 65 33 4d 65 6d 52 65 6c 65 61 73 65 28 29 20  te3MemRelease() 
b050: 77 65 72 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d  were called from
b060: 20 68 65 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c   here. With -O2,
b070: 20 74 68 69 73 20 6a 75 6d 70 73 0a 20 20 20 20   this jumps.    
b080: 20 20 2a 2a 20 74 6f 20 36 2e 36 20 70 65 72 63    ** to 6.6 perc
b090: 65 6e 74 2e 20 54 68 65 20 74 65 73 74 20 63 61  ent. The test ca
b0a0: 73 65 20 69 73 20 69 6e 73 65 72 74 69 6e 67 20  se is inserting 
b0b0: 31 30 30 30 20 72 6f 77 73 20 69 6e 74 6f 20 61  1000 rows into a
b0c0: 20 74 61 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a   table .      **
b0d0: 20 77 69 74 68 20 6e 6f 20 69 6e 64 65 78 65 73   with no indexes
b0e0: 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20   using a single 
b0f0: 70 72 65 70 61 72 65 64 20 49 4e 53 45 52 54 20  prepared INSERT 
b100: 73 74 61 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28  statement, bind(
b110: 29 20 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20  ) .      ** and 
b120: 72 65 73 65 74 28 29 2e 20 49 6e 73 65 72 74 73  reset(). Inserts
b130: 20 61 72 65 20 67 72 6f 75 70 65 64 20 69 6e 74   are grouped int
b140: 6f 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  o a transaction.
b150: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
b160: 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61  testcase( p->fla
b170: 67 73 20 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a  gs & MEM_Agg );.
b180: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
b190: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44  p->flags & MEM_D
b1a0: 79 6e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  yn );.      test
b1b0: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
b1c0: 20 4d 45 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20   MEM_Frame );.  
b1d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d      testcase( p-
b1e0: 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77  >flags & MEM_Row
b1f0: 53 65 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  Set );.      if(
b200: 20 70 2d 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41   p->flags&(MEM_A
b210: 67 67 7c 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46  gg|MEM_Dyn|MEM_F
b220: 72 61 6d 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29  rame|MEM_RowSet)
b230: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b240: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
b250: 65 28 70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  e(p);.      }els
b260: 65 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f  e if( p->szMallo
b270: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
b280: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
b290: 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20  ->zMalloc);.    
b2a0: 20 20 20 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20      p->szMalloc 
b2b0: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
b2c0: 20 20 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d      p->flags = M
b2d0: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
b2e0: 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c    }while( (++p)<
b2f0: 70 45 6e 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  pEnd );.  }.}../
b300: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64  *.** Delete a Vd
b310: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61  beFrame object a
b320: 6e 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e  nd its contents.
b330: 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63   VdbeFrame objec
b340: 74 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61  ts are.** alloca
b350: 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72  ted by the OP_Pr
b360: 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20  ogram opcode in 
b370: 73 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28  sqlite3VdbeExec(
b380: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
b390: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
b3a0: 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b  e(VdbeFrame *p){
b3b0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20  .  int i;.  Mem 
b3c0: 2a 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d  *aMem = VdbeFram
b3d0: 65 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43  eMem(p);.  VdbeC
b3e0: 75 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20  ursor **apCsr = 
b3f0: 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26  (VdbeCursor **)&
b400: 61 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65  aMem[p->nChildMe
b410: 6d 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  m];.  for(i=0; i
b420: 3c 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69  <p->nChildCsr; i
b430: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
b440: 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70  VdbeFreeCursor(p
b450: 2d 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a  ->v, apCsr[i]);.
b460: 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d    }.  releaseMem
b470: 41 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e  Array(aMem, p->n
b480: 43 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c  ChildMem);.  sql
b490: 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
b4a0: 78 44 61 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20  xData(p->v->db, 
b4b0: 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
b4c0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  , 0);.  sqlite3D
b4d0: 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20  bFree(p->v->db, 
b4e0: 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  p);.}..#ifndef S
b4f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
b500: 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20  IN./*.** Give a 
b510: 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20 70  listing of the p
b520: 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76 69  rogram in the vi
b530: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a  rtual machine..*
b540: 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66 61  *.** The interfa
b550: 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ce is the same a
b560: 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 65  s sqlite3VdbeExe
b570: 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65 61  c().  But instea
b580: 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20  d of.** running 
b590: 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e 76  the code, it inv
b5a0: 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61 63  okes the callbac
b5b0: 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  k once for each 
b5c0: 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20  instruction..** 
b5d0: 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73 20  This feature is 
b5e0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
b5f0: 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a  t "EXPLAIN"..**.
b600: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
b610: 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73 74  in==1, each inst
b620: 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74 65  ruction is liste
b630: 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65  d.  When.** p->e
b640: 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20  xplain==2, only 
b650: 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74 72  OP_Explain instr
b660: 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73 74  uctions are list
b670: 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20  ed and these.** 
b680: 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20 64  are shown in a d
b690: 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e  ifferent format.
b6a0: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20    p->explain==2 
b6b0: 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  is used to imple
b6c0: 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  ment.** EXPLAIN 
b6d0: 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a  QUERY PLAN..**.*
b6e0: 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69  * When p->explai
b6f0: 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65 20  n==1, first the 
b700: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73 20  main program is 
b710: 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61 63  listed, then eac
b720: 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69 67  h of.** the trig
b730: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
b740: 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20 62  are listed one b
b750: 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y one..*/.int sq
b760: 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a 20  lite3VdbeList(. 
b770: 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20 20   Vdbe *p        
b780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
b790: 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69  e VDBE */.){.  i
b7a0: 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20 20  nt nRow;        
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e      /* Stop when
b7d0: 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63 68   row count reach
b7e0: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74  es this */.  int
b7f0: 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20   nSub = 0;      
b800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b810: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73    /* Number of s
b820: 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73 6f  ub-vdbes seen so
b830: 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f   far */.  SubPro
b840: 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30  gram **apSub = 0
b850: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
b860: 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d 76  * Array of sub-v
b870: 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  dbes */.  Mem *p
b880: 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Sub = 0;        
b890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8a0: 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f  * Memory cell ho
b8b0: 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62 70  ld array of subp
b8c0: 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  rogs */.  sqlite
b8d0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20  3 *db = p->db;  
b8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8f0: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  * The database c
b900: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
b910: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
b920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b930: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
b940: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
b950: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
b960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b970: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
b980: 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70    Mem *pMem = &p
b990: 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20  ->aMem[1];      
b9a0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
b9b0: 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73 65  Mem of result se
b9c0: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
b9d0: 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20  p->explain );.  
b9e0: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
b9f0: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  ==VDBE_MAGIC_RUN
ba00: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
ba10: 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
ba20: 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  | p->rc==SQLITE_
ba30: 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53  BUSY || p->rc==S
ba40: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a  QLITE_NOMEM );..
ba50: 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67 68    /* Even though
ba60: 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f 65   this opcode doe
ba70: 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d 69  s not use dynami
ba80: 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20 20  c strings for.  
ba90: 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20 72  ** the result, r
baa0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61  esult columns ma
bab0: 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63  y become dynamic
bac0: 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61 6c   if the user cal
bad0: 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  ls.  ** sqlite3_
bae0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c  column_text16(),
baf0: 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e 73   causing a trans
bb00: 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36  lation to UTF-16
bb10: 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a   encoding..  */.
bb20: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
bb30: 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d  y(pMem, 8);.  p-
bb40: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
bb50: 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53  ..  if( p->rc==S
bb60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
bb70: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
bb80: 68 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c  happens if a mal
bb90: 6c 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63  loc() inside a c
bba0: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  all to sqlite3_c
bbb0: 6f 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a  olumn_text() or.
bbc0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
bbd0: 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66  olumn_text16() f
bbe0: 61 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73  ailed.  */.    s
bbf0: 71 6c 69 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64  qlite3OomFault(d
bc00: 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
bc10: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
bc20: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
bc30: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
bc40: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
bc50: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
bc60: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
bc70: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
bc80: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
bc90: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
bca0: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
bcb0: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
bcc0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
bcd0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
bce0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
bcf0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
bd00: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
bd10: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
bd20: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
bd30: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
bd40: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
bd50: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
bd60: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
bd70: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
bd80: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
bd90: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
bda0: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
bdb0: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
bdc0: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
bdd0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
bde0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
bdf0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
be00: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
be10: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
be20: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
be30: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
be40: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
be50: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
be60: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
be70: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
be80: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
be90: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
bea0: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
beb0: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
bec0: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
bed0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
bee0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
bef0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
bf00: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
bf10: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
bf20: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
bf30: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
bf40: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
bf50: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
bf60: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
bf70: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
bf80: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
bf90: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
bfa0: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
bfb0: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
bfc0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
bfd0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
bfe0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
bff0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
c000: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
c010: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
c020: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
c030: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
c040: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
c050: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
c060: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
c070: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
c080: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
c090: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
c0a0: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
c0b0: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
c0c0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
c0d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
c0e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c0f0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
c100: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
c110: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
c120: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
c130: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
c140: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
c150: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72     sqlite3VdbeEr
c160: 72 6f 72 28 70 2c 20 73 71 6c 69 74 65 33 45 72  ror(p, sqlite3Er
c170: 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20  rStr(p->rc));.  
c180: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20  }else{.    char 
c190: 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f  *zP4;.    Op *pO
c1a0: 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d 3e  p;.    if( i<p->
c1b0: 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  nOp ){.      /* 
c1c0: 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65 20  The output line 
c1d0: 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c 20  number is small 
c1e0: 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20 61  enough that we a
c1f0: 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a  re still in the.
c200: 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72        ** main pr
c210: 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20  ogram. */.      
c220: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d  pOp = &p->aOp[i]
c230: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
c240: 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75 72     /* We are cur
c250: 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20 73  rently listing s
c260: 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69 67  ubprograms.  Fig
c270: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f 6e  ure out which on
c280: 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70  e and.      ** p
c290: 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72 6f  ick up the appro
c2a0: 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a  priate opcode. *
c2b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  /.      int j;. 
c2c0: 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70       i -= p->nOp
c2d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
c2e0: 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f   i>=apSub[j]->nO
c2f0: 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; j++){.       
c300: 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e   i -= apSub[j]->
c310: 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nOp;.      }.   
c320: 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62 5b     pOp = &apSub[
c330: 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20  j]->aOp[i];.    
c340: 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  }.    if( p->exp
c350: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
c360: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c370: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d  EM_Int;.      pM
c380: 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20  em->u.i = i;    
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
c3b0: 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a  rogram counter *
c3c0: 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  /.      pMem++;.
c3d0: 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66    .      pMem->f
c3e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69  lags = MEM_Stati
c3f0: 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65  c|MEM_Str|MEM_Te
c400: 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  rm;.      pMem->
c410: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
c420: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70  e3OpcodeName(pOp
c430: 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70  ->opcode); /* Op
c440: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61 73  code */.      as
c450: 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30  sert( pMem->z!=0
c460: 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   );.      pMem->
c470: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
c480: 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20  n30(pMem->z);.  
c490: 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
c4a0: 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20  SQLITE_UTF8;.   
c4b0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c4c0: 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f    /* When an OP_
c4d0: 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20 69  Program opcode i
c4e0: 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68 65  s encounter (the
c4f0: 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68 61   only opcode tha
c500: 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20 61  t has.      ** a
c510: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 61   P4_SUBPROGRAM a
c520: 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64  rgument), expand
c530: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
c540: 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f   array of subpro
c550: 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b  grams.      ** k
c560: 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39  ept in p->aMem[9
c570: 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ].z to hold the 
c580: 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61 73  new program - as
c590: 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62 70  suming this subp
c5a0: 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20  rogram.      ** 
c5b0: 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  has not already 
c5c0: 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20  been seen..     
c5d0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4f   */.      if( pO
c5e0: 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53 55  p->p4type==P4_SU
c5f0: 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20  BPROGRAM ){.    
c600: 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
c610: 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28  (nSub+1)*sizeof(
c620: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
c630: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
c640: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
c650: 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  nSub; j++){.    
c660: 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62 5b        if( apSub[
c670: 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f  j]==pOp->p4.pPro
c680: 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20  gram ) break;.  
c690: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c6a0: 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53  if( j==nSub && S
c6b0: 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65  QLITE_OK==sqlite
c6c0: 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53 75  3VdbeMemGrow(pSu
c6d0: 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d  b, nByte, nSub!=
c6e0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
c6f0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
c700: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
c710: 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62 5b            apSub[
c720: 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70  nSub++] = pOp->p
c730: 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20  4.pProgram;.    
c740: 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61 67        pSub->flag
c750: 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20  s |= MEM_Blob;. 
c760: 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e 6e           pSub->n
c770: 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53   = nSub*sizeof(S
c780: 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20  ubProgram*);.   
c790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
c7a0: 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e     }..    pMem->
c7b0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c7c0: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
c7d0: 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20 20   pOp->p1;       
c7e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7f0: 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20     /* P1 */.    
c800: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
c810: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
c820: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
c830: 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20  i = pOp->p2;    
c840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c850: 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20        /* P2 */. 
c860: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c870: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
c880: 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d  M_Int;.    pMem-
c890: 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20  >u.i = pOp->p3; 
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20 2a           /* P3 *
c8c0: 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20  /.    pMem++;.. 
c8d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64     if( sqlite3Vd
c8e0: 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73  beMemClearAndRes
c8f0: 69 7a 65 28 70 4d 65 6d 2c 20 31 30 30 29 20 29  ize(pMem, 100) )
c900: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
c910: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
c920: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
c930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c940: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
c950: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
c960: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
c970: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
c980: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
c990: 65 6d 2d 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d  em->z, pMem->szM
c9a0: 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  alloc);.    if( 
c9b0: 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a  zP4!=pMem->z ){.
c9c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c9d0: 65 4d 65 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c  eMemSetStr(pMem,
c9e0: 20 7a 50 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zP4, -1, SQLITE
c9f0: 5f 55 54 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d  _UTF8, 0);.    }
ca00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
ca10: 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29  rt( pMem->z!=0 )
ca20: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20  ;.      pMem->n 
ca30: 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
ca40: 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20  0(pMem->z);.    
ca50: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
ca60: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d  LITE_UTF8;.    }
ca70: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
ca80: 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e    if( p->explain
ca90: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==1 ){.      if(
caa0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43   sqlite3VdbeMemC
cab0: 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d  learAndResize(pM
cac0: 65 6d 2c 20 34 29 20 29 7b 0a 20 20 20 20 20 20  em, 4) ){.      
cad0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
cae0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
caf0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cb00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
cb10: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
cb20: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
cb30: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
cb40: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20    pMem->n = 2;. 
cb50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
cb60: 72 69 6e 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a  rintf(3, pMem->z
cb70: 2c 20 22 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70  , "%.2x", pOp->p
cb80: 35 29 3b 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20  5);   /* P5 */. 
cb90: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
cba0: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
cbb0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23      pMem++;.  .#
cbc0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
cbd0: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
cbe0: 45 4e 54 53 0a 20 20 20 20 20 20 69 66 28 20 73  ENTS.      if( s
cbf0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65  qlite3VdbeMemCle
cc00: 61 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d  arAndResize(pMem
cc10: 2c 20 35 30 30 29 20 29 7b 0a 20 20 20 20 20 20  , 500) ){.      
cc20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d    assert( p->db-
cc30: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
cc40: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
cc50: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
cc60: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d      }.      pMem
cc70: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74  ->flags = MEM_St
cc80: 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20  r|MEM_Term;.    
cc90: 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70    pMem->n = disp
cca0: 6c 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20  layComment(pOp, 
ccb0: 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30  zP4, pMem->z, 50
ccc0: 30 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  0);.      pMem->
ccd0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
cce0: 38 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  8;.#else.      p
ccf0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
cd00: 5f 4e 75 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  _Null;          
cd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cd20: 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69  Comment */.#endi
cd30: 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e  f.    }..    p->
cd40: 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d  nResColumn = 8 -
cd50: 20 34 2a 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31   4*(p->explain-1
cd60: 29 3b 0a 20 20 20 20 70 2d 3e 70 52 65 73 75 6c  );.    p->pResul
cd70: 74 53 65 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  tSet = &p->aMem[
cd80: 31 5d 3b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20  1];.    p->rc = 
cd90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72  SQLITE_OK;.    r
cda0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  c = SQLITE_ROW;.
cdb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
cdc0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
cdd0: 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
cde0: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
cdf0: 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
ce00: 72 69 6e 74 20 74 68 65 20 53 51 4c 20 74 68 61  rint the SQL tha
ce10: 74 20 77 61 73 20 75 73 65 64 20 74 6f 20 67 65  t was used to ge
ce20: 6e 65 72 61 74 65 20 61 20 56 44 42 45 20 70 72  nerate a VDBE pr
ce30: 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ogram..*/.void s
ce40: 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 53  qlite3VdbePrintS
ce50: 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 63  ql(Vdbe *p){.  c
ce60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 30  onst char *z = 0
ce70: 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20  ;.  if( p->zSql 
ce80: 29 7b 0a 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53  ){.    z = p->zS
ce90: 71 6c 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ql;.  }else if( 
cea0: 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20  p->nOp>=1 ){.   
ceb0: 20 63 6f 6e 73 74 20 56 64 62 65 4f 70 20 2a 70   const VdbeOp *p
cec0: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b  Op = &p->aOp[0];
ced0: 0a 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70  .    if( pOp->op
cee0: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26  code==OP_Init &&
cef0: 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b   pOp->p4.z!=0 ){
cf00: 0a 20 20 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e  .      z = pOp->
cf10: 70 34 2e 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c  p4.z;.      whil
cf20: 65 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63  e( sqlite3Isspac
cf30: 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
cf40: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 20 29   }.  }.  if( z )
cf50: 20 70 72 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25   printf("SQL: [%
cf60: 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e  s]\n", z);.}.#en
cf70: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
cf80: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
cf90: 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  ACE) && defined(
cfa0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
cfb0: 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69  TRACE)./*.** Pri
cfc0: 6e 74 20 61 6e 20 49 4f 54 52 41 43 45 20 6d 65  nt an IOTRACE me
cfd0: 73 73 61 67 65 20 73 68 6f 77 69 6e 67 20 53 51  ssage showing SQ
cfe0: 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f  L content..*/.vo
cff0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 49 4f  id sqlite3VdbeIO
d000: 54 72 61 63 65 53 71 6c 28 56 64 62 65 20 2a 70  TraceSql(Vdbe *p
d010: 29 7b 0a 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70  ){.  int nOp = p
d020: 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20  ->nOp;.  VdbeOp 
d030: 2a 70 4f 70 3b 0a 20 20 69 66 28 20 73 71 6c 69  *pOp;.  if( sqli
d040: 74 65 33 49 6f 54 72 61 63 65 3d 3d 30 20 29 20  te3IoTrace==0 ) 
d050: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f  return;.  if( nO
d060: 70 3c 31 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  p<1 ) return;.  
d070: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d  pOp = &p->aOp[0]
d080: 3b 0a 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63  ;.  if( pOp->opc
d090: 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20  ode==OP_Init && 
d0a0: 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a  pOp->p4.z!=0 ){.
d0b0: 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20      int i, j;.  
d0c0: 20 20 63 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a    char z[1000];.
d0d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
d0e0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20  intf(sizeof(z), 
d0f0: 7a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34  z, "%s", pOp->p4
d100: 2e 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  .z);.    for(i=0
d110: 3b 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ; sqlite3Isspace
d120: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
d130: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d     for(j=0; z[i]
d140: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
d150: 28 20 73 71 6c 69 74 65 33 49 73 73 70 61 63 65  ( sqlite3Isspace
d160: 28 7a 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20  (z[i]) ){.      
d170: 20 20 69 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20    if( z[i-1]!=' 
d180: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a  ' ){.          z
d190: 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20  [j++] = ' ';.   
d1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
d1b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b  se{.        z[j+
d1c0: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20  +] = z[i];.     
d1d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
d1e0: 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  ] = 0;.    sqlit
d1f0: 65 33 49 6f 54 72 61 63 65 28 22 53 51 4c 20 25  e3IoTrace("SQL %
d200: 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a  s\n", z);.  }.}.
d210: 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54  #endif /* !SQLIT
d220: 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 26 26 20  E_OMIT_TRACE && 
d230: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
d240: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20  TRACE */../* An 
d250: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
d260: 20 6f 62 6a 65 63 74 20 64 65 73 63 72 69 62 65   object describe
d270: 73 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76  s bulk memory av
d280: 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 0a  ailable for use.
d290: 2a 2a 20 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65  ** by subcompone
d2a0: 6e 74 73 20 6f 66 20 61 20 70 72 65 70 61 72 65  nts of a prepare
d2b0: 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 53 70  d statement.  Sp
d2c0: 61 63 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ace is allocated
d2d0: 20 6f 75 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75   out.** of a Reu
d2e0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d2f0: 74 20 62 79 20 74 68 65 20 61 6c 6c 6f 63 53 70  t by the allocSp
d300: 61 63 65 28 29 20 72 6f 75 74 69 6e 65 20 62 65  ace() routine be
d310: 6c 6f 77 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52  low..*/.struct R
d320: 65 75 73 61 62 6c 65 53 70 61 63 65 20 7b 0a 20  eusableSpace {. 
d330: 20 75 38 20 2a 70 53 70 61 63 65 3b 20 20 20 20   u8 *pSpace;    
d340: 20 20 20 20 20 20 2f 2a 20 41 76 61 69 6c 61 62        /* Availab
d350: 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69  le memory */.  i
d360: 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20  nt nFree;       
d370: 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
d380: 61 76 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79  available memory
d390: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65   */.  int nNeede
d3a0: 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f  d;         /* To
d3b0: 74 61 6c 20 62 79 74 65 73 20 74 68 61 74 20 63  tal bytes that c
d3c0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f  ould not be allo
d3d0: 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20  cated */.};../* 
d3e0: 54 72 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  Try to allocate 
d3f0: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 38  nByte bytes of 8
d400: 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20 62 75  -byte aligned bu
d410: 6c 6b 20 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42  lk memory for pB
d420: 75 66 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52  uf.** from the R
d430: 65 75 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a  eusableSpace obj
d440: 65 63 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70  ect.  Return a p
d450: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 6c  ointer to the al
d460: 6c 6f 63 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72  located.** memor
d470: 79 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  y on success.  I
d480: 66 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 6d  f insufficient m
d490: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
d4a0: 6c 65 20 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75  le in the.** Reu
d4b0: 73 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63  sableSpace objec
d4c0: 74 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20  t, increase the 
d4d0: 52 65 75 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e  ReusableSpace.nN
d4e0: 65 65 64 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62  eeded.** value b
d4f0: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65  y the amount nee
d500: 64 65 64 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ded and return N
d510: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42  ULL..**.** If pB
d520: 75 66 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61  uf is not initia
d530: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d  lly NULL, that m
d540: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 6d 65  eans that the me
d550: 6d 6f 72 79 20 68 61 73 20 61 6c 72 65 61 64 79  mory has already
d560: 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  .** been allocat
d570: 65 64 20 62 79 20 61 20 70 72 69 6f 72 20 63 61  ed by a prior ca
d580: 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
d590: 6e 65 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ne, so just retu
d5a0: 72 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20  rn a copy.** of 
d5b0: 70 42 75 66 20 61 6e 64 20 6c 65 61 76 65 20 52  pBuf and leave R
d5c0: 65 75 73 61 62 6c 65 53 70 61 63 65 20 75 6e 63  eusableSpace unc
d5d0: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  hanged..**.** Th
d5e0: 69 73 20 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20  is allocator is 
d5f0: 65 6d 70 6c 6f 79 65 64 20 74 6f 20 72 65 70 75  employed to repu
d600: 72 70 6f 73 65 20 75 6e 75 73 65 64 20 73 6c 6f  rpose unused slo
d610: 74 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ts at the end of
d620: 20 74 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61   the.** opcode a
d630: 72 72 61 79 20 6f 66 20 70 72 65 70 61 72 65 64  rray of prepared
d640: 20 73 74 61 74 65 20 66 6f 72 20 6f 74 68 65 72   state for other
d650: 20 6d 65 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66   memory needs of
d660: 20 74 68 65 20 70 72 65 70 61 72 65 64 0a 2a 2a   the prepared.**
d670: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73   statement..*/.s
d680: 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f  tatic void *allo
d690: 63 53 70 61 63 65 28 0a 20 20 73 74 72 75 63 74  cSpace(.  struct
d6a0: 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20 2a   ReusableSpace *
d6b0: 70 2c 20 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f  p,  /* Bulk memo
d6c0: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
d6d0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
d6e0: 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
d6f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
d700: 69 6e 74 65 72 20 74 6f 20 61 20 70 72 69 6f 72  inter to a prior
d710: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20   allocation */. 
d720: 20 69 6e 74 20 6e 42 79 74 65 20 20 20 20 20 20   int nByte      
d730: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
d740: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65  tes of memory ne
d750: 65 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73  eded */.){.  ass
d760: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
d770: 41 4c 49 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70  ALIGNMENT(p->pSp
d780: 61 63 65 29 20 29 3b 0a 20 20 69 66 28 20 70 42  ace) );.  if( pB
d790: 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79  uf==0 ){.    nBy
d7a0: 74 65 20 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74  te = ROUND8(nByt
d7b0: 65 29 3b 0a 20 20 20 20 69 66 28 20 6e 42 79 74  e);.    if( nByt
d7c0: 65 20 3c 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b  e <= p->nFree ){
d7d0: 0a 20 20 20 20 20 20 70 2d 3e 6e 46 72 65 65 20  .      p->nFree 
d7e0: 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  -= nByte;.      
d7f0: 70 42 75 66 20 3d 20 26 70 2d 3e 70 53 70 61 63  pBuf = &p->pSpac
d800: 65 5b 70 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20  e[p->nFree];.   
d810: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d   }else{.      p-
d820: 3e 6e 4e 65 65 64 65 64 20 2b 3d 20 6e 42 79 74  >nNeeded += nByt
d830: 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  e;.    }.  }.  a
d840: 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
d850: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66  E_ALIGNMENT(pBuf
d860: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  ) );.  return pB
d870: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77  uf;.}../*.** Rew
d880: 69 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63  ind the VDBE bac
d890: 6b 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69  k to the beginni
d8a0: 6e 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ng in preparatio
d8b0: 6e 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67  n for.** running
d8c0: 20 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c   it..*/.void sql
d8d0: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56  ite3VdbeRewind(V
d8e0: 64 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66  dbe *p){.#if def
d8f0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
d900: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44  G) || defined(VD
d910: 42 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e  BE_PROFILE).  in
d920: 74 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73  t i;.#endif.  as
d930: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
d940: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
d950: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
d960: 54 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65  T );..  /* There
d970: 20 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65   should be at le
d980: 61 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a  ast one opcode..
d990: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
d9a0: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a  ->nOp>0 );..  /*
d9b0: 20 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74   Set the magic t
d9c0: 6f 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  o VDBE_MAGIC_RUN
d9d0: 20 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74   sooner rather t
d9e0: 68 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20  han later. */.  
d9f0: 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f  p->magic = VDBE_
da00: 4d 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64  MAGIC_RUN;..#ifd
da10: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
da20: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
da30: 6e 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nMem; i++){.    
da40: 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b  assert( p->aMem[
da50: 69 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a  i].db==p->db );.
da60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
da70: 70 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63  pc = -1;.  p->rc
da80: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
da90: 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d  p->errorAction =
daa0: 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e   OE_Abort;.  p->
dab0: 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70  nChange = 0;.  p
dac0: 2d 3e 63 61 63 68 65 43 74 72 20 3d 20 31 3b 0a  ->cacheCtr = 1;.
dad0: 20 20 70 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c    p->minWriteFil
dae0: 65 46 6f 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20  eFormat = 255;. 
daf0: 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d   p->iStatement =
db00: 20 30 3b 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73   0;.  p->nFkCons
db10: 74 72 61 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64  traint = 0;.#ifd
db20: 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a  ef VDBE_PROFILE.
db30: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
db40: 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  nOp; i++){.    p
db50: 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30  ->aOp[i].cnt = 0
db60: 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e  ;.    p->aOp[i].
db70: 63 79 63 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a  cycles = 0;.  }.
db80: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
db90: 50 72 65 70 61 72 65 20 61 20 76 69 72 74 75 61  Prepare a virtua
dba0: 6c 20 6d 61 63 68 69 6e 65 20 66 6f 72 20 65 78  l machine for ex
dbb0: 65 63 75 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ecution for the 
dbc0: 66 69 72 73 74 20 74 69 6d 65 20 61 66 74 65 72  first time after
dbd0: 0a 2a 2a 20 63 72 65 61 74 69 6e 67 20 74 68 65  .** creating the
dbe0: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
dbf0: 2e 20 20 54 68 69 73 20 69 6e 76 6f 6c 76 65 73  .  This involves
dc00: 20 74 68 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20   things such.** 
dc10: 61 73 20 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65  as allocating re
dc20: 67 69 73 74 65 72 73 20 61 6e 64 20 69 6e 69 74  gisters and init
dc30: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 70 72 6f  ializing the pro
dc40: 67 72 61 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a  gram counter..**
dc50: 20 41 66 74 65 72 20 74 68 65 20 56 44 42 45 20   After the VDBE 
dc60: 68 61 73 20 62 65 20 70 72 65 70 70 65 64 2c 20  has be prepped, 
dc70: 69 74 20 63 61 6e 20 62 65 20 65 78 65 63 75 74  it can be execut
dc80: 65 64 20 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72  ed by one or mor
dc90: 65 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  e.** calls to sq
dca0: 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e  lite3VdbeExec().
dcb0: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75    .**.** This fu
dcc0: 6e 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 63 61  nction may be ca
dcd0: 6c 6c 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63  lled exactly onc
dce0: 65 20 6f 6e 20 65 61 63 68 20 76 69 72 74 75 61  e on each virtua
dcf0: 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66  l machine..** Af
dd00: 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ter this routine
dd10: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 56   is called the V
dd20: 4d 20 68 61 73 20 62 65 65 6e 20 22 70 61 63 6b  M has been "pack
dd30: 61 67 65 64 22 20 61 6e 64 20 69 73 20 72 65 61  aged" and is rea
dd40: 64 79 0a 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41  dy.** to run.  A
dd50: 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
dd60: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 66 75 72  e is called, fur
dd70: 74 68 65 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a  ther calls to .*
dd80: 2a 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64  * sqlite3VdbeAdd
dd90: 4f 70 28 29 20 66 75 6e 63 74 69 6f 6e 73 20 61  Op() functions a
dda0: 72 65 20 70 72 6f 68 69 62 69 74 65 64 2e 20 20  re prohibited.  
ddb0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 69 73  This routine dis
ddc0: 63 6f 6e 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20  connects.** the 
ddd0: 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 50 61  Vdbe from the Pa
dde0: 72 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20  rse object that 
ddf0: 68 65 6c 70 65 64 20 67 65 6e 65 72 61 74 65 20  helped generate 
de00: 69 74 20 73 6f 20 74 68 61 74 20 74 68 65 0a 2a  it so that the.*
de10: 2a 20 74 68 65 20 56 64 62 65 20 62 65 63 6f 6d  * the Vdbe becom
de20: 65 73 20 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e  es an independen
de30: 74 20 65 6e 74 69 74 79 20 61 6e 64 20 74 68 65  t entity and the
de40: 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20 63 61   Parse object ca
de50: 6e 20 62 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65  n be.** destroye
de60: 64 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  d..**.** Use the
de70: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69   sqlite3VdbeRewi
de80: 6e 64 28 29 20 70 72 6f 63 65 64 75 72 65 20 74  nd() procedure t
de90: 6f 20 72 65 73 74 6f 72 65 20 61 20 76 69 72 74  o restore a virt
dea0: 75 61 6c 20 6d 61 63 68 69 6e 65 20 62 61 63 6b  ual machine back
deb0: 0a 2a 2a 20 74 6f 20 69 74 73 20 69 6e 69 74 69  .** to its initi
dec0: 61 6c 20 73 74 61 74 65 20 61 66 74 65 72 20 69  al state after i
ded0: 74 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a  t has been run..
dee0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
def0: 64 62 65 4d 61 6b 65 52 65 61 64 79 28 0a 20 20  dbeMakeReady(.  
df00: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
df10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df20: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 20 20  * The VDBE */.  
df30: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 20 20  Parse *pParse   
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
df50: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
df60: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
df70: 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
df80: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
df90: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
dfa0: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61  ion */.  int nVa
dfb0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
dfc0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
dfd0: 72 20 6f 66 20 70 61 72 61 6d 65 74 65 72 73 20  r of parameters 
dfe0: 2a 2f 0a 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20  */.  int nMem;  
dff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e000: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
e010: 20 56 4d 20 6d 65 6d 6f 72 79 20 72 65 67 69 73   VM memory regis
e020: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  ters */.  int nC
e030: 75 72 73 6f 72 3b 20 20 20 20 20 20 20 20 20 20  ursor;          
e040: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e050: 65 72 20 6f 66 20 63 75 72 73 6f 72 73 20 72 65  er of cursors re
e060: 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
e070: 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  nArg;           
e080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e090: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
e0a0: 73 20 69 6e 20 73 75 62 70 72 6f 67 72 61 6d 73  s in subprograms
e0b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b   */.  int nOnce;
e0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e0e0: 66 20 4f 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75  f OP_Once instru
e0f0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ctions */.  int 
e100: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
e110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
e120: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
e130: 73 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53  struct ReusableS
e140: 70 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f  pace x;        /
e150: 2a 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20  * Reusable bulk 
e160: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73  memory */..  ass
e170: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
e180: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20  ssert( p->nOp>0 
e190: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
e1a0: 72 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  rse!=0 );.  asse
e1b0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
e1c0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
e1d0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73  .  assert( pPars
e1e0: 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a  e==p->pParse );.
e1f0: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
e200: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
e210: 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20  ocFailed==0 );. 
e220: 20 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e   nVar = pParse->
e230: 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70  nVar;.  nMem = p
e240: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e  Parse->nMem;.  n
e250: 43 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d  Cursor = pParse-
e260: 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20  >nTab;.  nArg = 
e270: 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b  pParse->nMaxArg;
e280: 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73  .  nOnce = pPars
e290: 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20  e->nOnce;.  if( 
e2a0: 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65  nOnce==0 ) nOnce
e2b0: 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20   = 1; /* Ensure 
e2c0: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 62 79 74  at least one byt
e2d0: 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61  e in p->aOnceFla
e2e0: 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 45  g[] */.  .  /* E
e2f0: 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73 20  ach cursor uses 
e300: 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20  a memory cell.  
e310: 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f 72  The first cursor
e320: 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e 0a   (cursor 0) can.
e330: 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d    ** use aMem[0]
e340: 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f 74   which is not ot
e350: 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79 20  herwise used by 
e360: 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61 6d  the VDBE program
e370: 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  .  Allocate.  **
e380: 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65 6e   space at the en
e390: 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20  d of aMem[] for 
e3a0: 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67 72  cursors 1 and gr
e3b0: 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20  eater..  ** See 
e3c0: 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75  also: allocateCu
e3d0: 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e  rsor()..  */.  n
e3e0: 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a  Mem += nCursor;.
e3f0: 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30    if( nCursor==0
e400: 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65   && nMem>0 ) nMe
e410: 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20 66  m++;  /* Space f
e420: 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20  or aMem[0] even 
e430: 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a  if not used */..
e440: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
e450: 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62 6c  how much reusabl
e460: 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61 69  e memory is avai
e470: 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e 64  lable at the end
e480: 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63   of the.  ** opc
e490: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
e4a0: 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77 69   extra memory wi
e4b0: 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74 65  ll be reallocate
e4c0: 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d  d for other elem
e4d0: 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65  ents.  ** of the
e4e0: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
e4f0: 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20  ent..  */.  n = 
e500: 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70  ROUND8(sizeof(Op
e510: 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20  )*p->nOp);      
e520: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
e530: 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72   of opcode memor
e540: 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53  y used */.  x.pS
e550: 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70 2d  pace = &((u8*)p-
e560: 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20  >aOp)[n];       
e570: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65          /* Unuse
e580: 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20  d opcode memory 
e590: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49 47  */.  assert( EIG
e5a0: 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e  HT_BYTE_ALIGNMEN
e5b0: 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a 20  T(x.pSpace) );. 
e5c0: 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44   x.nFree = ROUND
e5d0: 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a  DOWN8(pParse->sz
e5e0: 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f  OpAlloc - n);  /
e5f0: 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73 65  * Bytes of unuse
e600: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  d memory */.  as
e610: 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30  sert( x.nFree>=0
e620: 20 29 3b 0a 20 20 69 66 28 20 78 2e 6e 46 72 65   );.  if( x.nFre
e630: 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  e>0 ){.    memse
e640: 74 28 78 2e 70 53 70 61 63 65 2c 20 30 2c 20 78  t(x.pSpace, 0, x
e650: 2e 6e 46 72 65 65 29 3b 0a 20 20 20 20 61 73 73  .nFree);.    ass
e660: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
e670: 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70  ALIGNMENT(&x.pSp
e680: 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b  ace[x.nFree]) );
e690: 0a 20 20 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50  .  }..  resolveP
e6a0: 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67  2Values(p, &nArg
e6b0: 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74  );.  p->usesStmt
e6c0: 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70  Journal = (u8)(p
e6d0: 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72  Parse->isMultiWr
e6e0: 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d  ite && pParse->m
e6f0: 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20  ayAbort);.  if( 
e700: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20  pParse->explain 
e710: 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20  && nMem<10 ){.  
e720: 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d    nMem = 10;.  }
e730: 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20  .  p->expired = 
e740: 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20  0;..  /* Memory 
e750: 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20 70  for registers, p
e760: 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73 6f  arameters, curso
e770: 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63  r, etc, is alloc
e780: 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74  ated in one or t
e790: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
e7a0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
e7b0: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
e7c0: 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72  use unused memor
e7d0: 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65  y at the .  ** e
e7e0: 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65  nd of the opcode
e7f0: 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61   array.  If we a
e800: 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74  re unable to sat
e810: 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a  isfy all memory.
e820: 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74    ** requirement
e830: 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65  s by reusing the
e840: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61   opcode array ta
e850: 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63  il, then the sec
e860: 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69  ond.  ** pass wi
e870: 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72  ll fill in the r
e880: 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20 61  emainder using a
e890: 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c   fresh memory al
e8a0: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
e8b0: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
e8c0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
e8d0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
e8e0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
e8f0: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
e900: 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72  e leftover memor
e910: 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  y at the end of 
e920: 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79  the opcode array
e930: 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67 6e  .  This can sign
e940: 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72  ificantly.  ** r
e950: 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e 74  educe the amount
e960: 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20   of memory held 
e970: 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73 74  by a prepared st
e980: 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20  atement..  */.  
e990: 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64  do {.    x.nNeed
e9a0: 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61  ed = 0;.    p->a
e9b0: 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Mem = allocSpace
e9c0: 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  (&x, p->aMem, nM
e9d0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b  em*sizeof(Mem));
e9e0: 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20 61  .    p->aVar = a
e9f0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
ea00: 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65  >aVar, nVar*size
ea10: 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d  of(Mem));.    p-
ea20: 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70  >apArg = allocSp
ea30: 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72 67  ace(&x, p->apArg
ea40: 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65  , nArg*sizeof(Me
ea50: 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43  m*));.    p->apC
ea60: 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28  sr = allocSpace(
ea70: 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43  &x, p->apCsr, nC
ea80: 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62  ursor*sizeof(Vdb
ea90: 65 43 75 72 73 6f 72 2a 29 29 3b 0a 20 20 20 20  eCursor*));.    
eaa0: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
eab0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
eac0: 3e 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63  >aOnceFlag, nOnc
ead0: 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e);.#ifdef SQLIT
eae0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
eaf0: 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d 3e  ANSTATUS.    p->
eb00: 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70  anExec = allocSp
eb10: 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65  ace(&x, p->anExe
eb20: 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  c, p->nOp*sizeof
eb30: 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (i64));.#endif. 
eb40: 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65 64     if( x.nNeeded
eb50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
eb60: 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e 70   x.pSpace = p->p
eb70: 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  Free = sqlite3Db
eb80: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 78  MallocZero(db, x
eb90: 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20 78  .nNeeded);.    x
eba0: 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64  .nFree = x.nNeed
ebb0: 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21 64  ed;.  }while( !d
ebc0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
ebd0: 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72  );..  p->nCursor
ebe0: 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d   = nCursor;.  p-
ebf0: 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e  >nOnceFlag = nOn
ec00: 63 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61  ce;.  if( p->aVa
ec10: 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72  r ){.    p->nVar
ec20: 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a   = (ynVar)nVar;.
ec30: 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e      for(n=0; n<n
ec40: 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20  Var; n++){.     
ec50: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67   p->aVar[n].flag
ec60: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20  s = MEM_Null;.  
ec70: 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64      p->aVar[n].d
ec80: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
ec90: 7d 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70  }.  p->nzVar = p
eca0: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
ecb0: 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61 72 73  p->azVar = pPars
ecc0: 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61 72  e->azVar;.  pPar
ecd0: 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a  se->nzVar =  0;.
ece0: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 20    pParse->azVar 
ecf0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d  = 0;.  if( p->aM
ed00: 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 65  em ){.    p->nMe
ed10: 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 66 6f  m = nMem;.    fo
ed20: 72 28 6e 3d 30 3b 20 6e 3c 6e 4d 65 6d 3b 20 6e  r(n=0; n<nMem; n
ed30: 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d  ++){.      p->aM
ed40: 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45  em[n].flags = ME
ed50: 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20  M_Undefined;.   
ed60: 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62     p->aMem[n].db
ed70: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
ed80: 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20  .  p->explain = 
ed90: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b  pParse->explain;
eda0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  .  sqlite3VdbeRe
edb0: 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  wind(p);.}../*.*
edc0: 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63  * Close a VDBE c
edd0: 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73  ursor and releas
ede0: 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72  e all the resour
edf0: 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20  ces that cursor 
ee00: 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68  .** happens to h
ee10: 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  old..*/.void sql
ee20: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
ee30: 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65  or(Vdbe *p, Vdbe
ee40: 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20  Cursor *pCx){.  
ee50: 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20  if( pCx==0 ){.  
ee60: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
ee70: 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42 74  assert( pCx->pBt
ee80: 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72  ==0 || pCx->eCur
ee90: 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
eea0: 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68 28  REE );.  switch(
eeb0: 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20 29   pCx->eCurType )
eec0: 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59  {.    case CURTY
eed0: 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20  PE_SORTER: {.   
eee0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 6f     sqlite3VdbeSo
eef0: 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c  rterClose(p->db,
ef00: 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72 65   pCx);.      bre
ef10: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ef20: 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45 45  se CURTYPE_BTREE
ef30: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43  : {.      if( pC
ef40: 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  x->pBt ){.      
ef50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ef60: 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20  ose(pCx->pBt);. 
ef70: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 43         /* The pC
ef80: 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c 20  x->pCursor will 
ef90: 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74  be close automat
efa0: 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65 78  ically, if it ex
efb0: 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20 20  ists, by.       
efc0: 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f   ** the call abo
efd0: 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ve. */.      }el
efe0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
eff0: 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75 72  rt( pCx->uc.pCur
f000: 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  sor!=0 );.      
f010: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
f020: 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 75  oseCursor(pCx->u
f030: 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20 20  c.pCursor);.    
f040: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
f050: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
f060: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
f070: 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65  ALTABLE.    case
f080: 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20 7b   CURTYPE_VTAB: {
f090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
f0a0: 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43 75  tab_cursor *pVCu
f0b0: 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43 75  r = pCx->uc.pVCu
f0c0: 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 73  r;.      const s
f0d0: 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70  qlite3_module *p
f0e0: 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e  Module = pVCur->
f0f0: 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a  pVtab->pModule;.
f100: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 56        assert( pV
f110: 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66  Cur->pVtab->nRef
f120: 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43 75  >0 );.      pVCu
f130: 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d  r->pVtab->nRef--
f140: 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d  ;.      pModule-
f150: 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a  >xClose(pVCur);.
f160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
f170: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a   }.#endif.  }.}.
f180: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
f190: 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65 20   cursors in the 
f1a0: 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a  current frame..*
f1b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
f1c0: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
f1d0: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66  e(Vdbe *p){.  if
f1e0: 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20  ( p->apCsr ){.  
f1f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
f200: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73  (i=0; i<p->nCurs
f210: 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  or; i++){.      
f220: 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20 3d  VdbeCursor *pC =
f230: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20   p->apCsr[i];.  
f240: 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20 20      if( pC ){.  
f250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
f260: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20 70  eFreeCursor(p, p
f270: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  C);.        p->a
f280: 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20  pCsr[i] = 0;.   
f290: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
f2a0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
f2b0: 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69   values stored i
f2c0: 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65 20  n the VdbeFrame 
f2d0: 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74 73  structure to its
f2e0: 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69   Vdbe. This.** i
f2f0: 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61 6d  s used, for exam
f300: 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69 67  ple, when a trig
f310: 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  ger sub-program 
f320: 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65 73  is halted to res
f330: 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20  tore.** control 
f340: 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67  to the main prog
f350: 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ram..*/.int sqli
f360: 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74  te3VdbeFrameRest
f370: 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a 70  ore(VdbeFrame *p
f380: 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a  Frame){.  Vdbe *
f390: 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20  v = pFrame->v;. 
f3a0: 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46   closeCursorsInF
f3b0: 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66 20  rame(v);.#ifdef 
f3c0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
f3d0: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20  MT_SCANSTATUS.  
f3e0: 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72 61  v->anExec = pFra
f3f0: 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64  me->anExec;.#end
f400: 69 66 0a 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61  if.  v->aOnceFla
f410: 67 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63  g = pFrame->aOnc
f420: 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63  eFlag;.  v->nOnc
f430: 65 46 6c 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e  eFlag = pFrame->
f440: 6e 4f 6e 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e  nOnceFlag;.  v->
f450: 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f  aOp = pFrame->aO
f460: 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46  p;.  v->nOp = pF
f470: 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e  rame->nOp;.  v->
f480: 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61  aMem = pFrame->a
f490: 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d  Mem;.  v->nMem =
f4a0: 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20   pFrame->nMem;. 
f4b0: 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72 61   v->apCsr = pFra
f4c0: 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e  me->apCsr;.  v->
f4d0: 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d 65  nCursor = pFrame
f4e0: 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e  ->nCursor;.  v->
f4f0: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20  db->lastRowid = 
f500: 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69  pFrame->lastRowi
f510: 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20  d;.  v->nChange 
f520: 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67  = pFrame->nChang
f530: 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61  e;.  v->db->nCha
f540: 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44  nge = pFrame->nD
f550: 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74  bChange;.  sqlit
f560: 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44  e3VdbeDeleteAuxD
f570: 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70  ata(v->db, &v->p
f580: 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b  AuxData, -1, 0);
f590: 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20 3d  .  v->pAuxData =
f5a0: 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61 74   pFrame->pAuxDat
f5b0: 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41 75  a;.  pFrame->pAu
f5c0: 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65 74  xData = 0;.  ret
f5d0: 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a  urn pFrame->pc;.
f5e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
f5f0: 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a  ll cursors..**.*
f600: 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20 61  * Also release a
f610: 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  ny dynamic memor
f620: 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56 4d  y held by the VM
f630: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d 65   in the Vdbe.aMe
f640: 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c  m memory .** cel
f650: 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69 73  l array. This is
f660: 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74 68   necessary as th
f670: 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72  e memory cell ar
f680: 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a  ray may contain.
f690: 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 56  ** pointers to V
f6a0: 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73  dbeFrame objects
f6b0: 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20 74  , which may in t
f6c0: 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e  urn contain poin
f6d0: 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20  ters to.** open 
f6e0: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74  cursors..*/.stat
f6f0: 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c  ic void closeAll
f700: 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70 29  Cursors(Vdbe *p)
f710: 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61 6d  {.  if( p->pFram
f720: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
f730: 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20  me *pFrame;.    
f740: 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46  for(pFrame=p->pF
f750: 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50  rame; pFrame->pP
f760: 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46  arent; pFrame=pF
f770: 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a  rame->pParent);.
f780: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46      sqlite3VdbeF
f790: 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72 61  rameRestore(pFra
f7a0: 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61  me);.    p->pFra
f7b0: 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e  me = 0;.    p->n
f7c0: 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Frame = 0;.  }. 
f7d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72 61   assert( p->nFra
f7e0: 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65  me==0 );.  close
f7f0: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 70  CursorsInFrame(p
f800: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d  );.  if( p->aMem
f810: 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 4d   ){.    releaseM
f820: 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c  emArray(p->aMem,
f830: 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20   p->nMem);.  }. 
f840: 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46   while( p->pDelF
f850: 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65  rame ){.    Vdbe
f860: 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d  Frame *pDel = p-
f870: 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20  >pDelFrame;.    
f880: 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20 70  p->pDelFrame = p
f890: 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  Del->pParent;.  
f8a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61    sqlite3VdbeFra
f8b0: 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a  meDelete(pDel);.
f8c0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65    }..  /* Delete
f8d0: 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c 6c   any auxdata all
f8e0: 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ocations made by
f8f0: 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28   the VM */.  if(
f900: 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20 73   p->pAuxData ) s
f910: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
f920: 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20 26  AuxData(p->db, &
f930: 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c  p->pAuxData, -1,
f940: 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
f950: 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29 3b  ->pAuxData==0 );
f960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  .}../*.** Clean 
f970: 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72 20  up the VM after 
f980: 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f  a single run..*/
f990: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c 65  .static void Cle
f9a0: 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a 20  anup(Vdbe *p){. 
f9b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
f9c0: 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53 51  ->db;..#ifdef SQ
f9d0: 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
f9e0: 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28 29  Execute assert()
f9f0: 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65   statements to e
fa00: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 56  nsure that the V
fa10: 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20  dbe.apCsr[] and 
fa20: 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b  .  ** Vdbe.aMem[
fa30: 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61 6c  ] arrays have al
fa40: 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61 6e  ready been clean
fa50: 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74  ed up.  */.  int
fa60: 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70 43   i;.  if( p->apC
fa70: 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c  sr ) for(i=0; i<
fa80: 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29  p->nCursor; i++)
fa90: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43 73   assert( p->apCs
faa0: 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28  r[i]==0 );.  if(
fab0: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
fac0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d  for(i=0; i<p->nM
fad0: 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74 28  em; i++) assert(
fae0: 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67   p->aMem[i].flag
faf0: 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64  s==MEM_Undefined
fb00: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   );.  }.#endif..
fb10: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
fb20: 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
fb30: 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  .  p->zErrMsg = 
fb40: 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53  0;.  p->pResultS
fb50: 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  et = 0;.}../*.**
fb60: 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72 20   Set the number 
fb70: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
fb80: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  s that will be r
fb90: 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20  eturned by this 
fba0: 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  SQL.** statement
fbb0: 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73 65  . This is now se
fbc0: 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d  t at compile tim
fbd0: 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20 64  e, rather than d
fbe0: 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69  uring.** executi
fbf0: 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20 70  on of the vdbe p
fc00: 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20 73  rogram so that s
fc10: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
fc20: 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20  unt() can.** be 
fc30: 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c  called on an SQL
fc40: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f 72   statement befor
fc50: 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  e sqlite3_step()
fc60: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
fc70: 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28  3VdbeSetNumCols(
fc80: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65  Vdbe *p, int nRe
fc90: 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20  sColumn){.  Mem 
fca0: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74  *pColName;.  int
fcb0: 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   n;.  sqlite3 *d
fcc0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65  b = p->db;..  re
fcd0: 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
fce0: 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52  >aColName, p->nR
fcf0: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
fd00: 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  _N);.  sqlite3Db
fd10: 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c  Free(db, p->aCol
fd20: 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65  Name);.  n = nRe
fd30: 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
fd40: 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  N;.  p->nResColu
fd50: 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43 6f  mn = (u16)nResCo
fd60: 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e  lumn;.  p->aColN
fd70: 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d  ame = pColName =
fd80: 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44 62   (Mem*)sqlite3Db
fd90: 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73  MallocZero(db, s
fda0: 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a  izeof(Mem)*n );.
fdb0: 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d    if( p->aColNam
fdc0: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
fdd0: 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20   while( n-- > 0 
fde0: 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  ){.    pColName-
fdf0: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c  >flags = MEM_Nul
fe00: 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d  l;.    pColName-
fe10: 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  >db = p->db;.   
fe20: 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d   pColName++;.  }
fe30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
fe40: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 64  e name of the id
fe50: 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62  x'th column to b
fe60: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  e returned by th
fe70: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
fe80: 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62  .** zName must b
fe90: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
fea0: 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64 20   nul terminated 
feb0: 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  string..**.** Th
fec0: 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65 20  is call must be 
fed0: 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61 6c  made after a cal
fee0: 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65  l to sqlite3Vdbe
fef0: 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a  SetNumCols()..**
ff00: 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70 61  .** The final pa
ff10: 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d  rameter, xDel, m
ff20: 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53 51  ust be one of SQ
ff30: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51  LITE_DYNAMIC, SQ
ff40: 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f  LITE_STATIC.** o
ff50: 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  r SQLITE_TRANSIE
ff60: 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51 4c  NT. If it is SQL
ff70: 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65  ITE_DYNAMIC, the
ff80: 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  n the buffer poi
ff90: 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e  nted.** to by zN
ffa0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65 65  ame will be free
ffb0: 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46 72  d by sqlite3DbFr
ffc0: 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76 64  ee() when the vd
ffd0: 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64 2e  be is destroyed.
ffe0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
fff0: 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20  dbeSetColName(. 
10000 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20   Vdbe *p,       
10010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10020 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67 20    /* Vdbe being 
10030 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20 20  configured */.  
10040 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20 20  int idx,        
10050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10060 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c   /* Index of col
10070 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65  umn zName applie
10080 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61  s to */.  int va
10090 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
100a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
100b0 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45  e of the COLNAME
100c0 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  _* constants */.
100d0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
100e0 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ame,            
100f0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
10100 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
10110 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69  ng name */.  voi
10120 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29  d (*xDel)(void*)
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10140 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65   Memory manageme
10150 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72 20  nt strategy for 
10160 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e  zName */.){.  in
10170 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f  t rc;.  Mem *pCo
10180 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74 28  lName;.  assert(
10190 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75   idx<p->nResColu
101a0 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  mn );.  assert( 
101b0 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b  var<COLNAME_N );
101c0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
101d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
101e0 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d 65    assert( !zName
101f0 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54 45   || xDel!=SQLITE
10200 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20  _DYNAMIC );.    
10210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10220 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  MEM_BKPT;.  }.  
10230 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e  assert( p->aColN
10240 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c  ame!=0 );.  pCol
10250 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c  Name = &(p->aCol
10260 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e  Name[idx+var*p->
10270 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20  nResColumn]);.  
10280 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
10290 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61  MemSetStr(pColNa
102a0 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53  me, zName, -1, S
102b0 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c  QLITE_UTF8, xDel
102c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
102d0 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20  =0 || !zName || 
102e0 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73  (pColName->flags
102f0 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b  &MEM_Term)!=0 );
10300 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10310 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72  ./*.** A read or
10320 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10330 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f  on may or may no
10340 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64  t be active on d
10350 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
10360 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73  * db. If a trans
10370 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
10380 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20  , commit it. If 
10390 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72  there is a.** wr
103a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
103b0 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68  spanning more th
103c0 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20  an one database 
103d0 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69  file, this routi
103e0 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65  ne.** takes care
103f0 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a   of the master j
10400 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e  ournal trickery.
10410 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
10420 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65  dbeCommit(sqlite
10430 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
10440 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
10450 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20  nTrans = 0;  /* 
10460 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61  Number of databa
10470 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69  ses with an acti
10480 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  ve write-transac
10490 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  tion.           
104a0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
104b0 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20 66  are candidates f
104c0 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  or a two-phase c
104d0 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20 20  ommit using a.  
104e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
104f0 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
10500 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  al */.  int rc =
10510 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
10520 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20  t needXcommit = 
10530 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  0;..#ifdef SQLIT
10540 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
10550 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74 68  BLE.  /* With th
10560 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74  is option, sqlit
10570 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73 20  e3VtabSync() is 
10580 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73 69  defined to be si
10590 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54  mply .  ** SQLIT
105a0 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74  E_OK so p is not
105b0 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55   used. .  */.  U
105c0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
105d0 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  p);.#endif..  /*
105e0 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   Before doing an
105f0 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c  ything else, cal
10600 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63 61  l the xSync() ca
10610 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20  llback for any. 
10620 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64 75   ** virtual modu
10630 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74 65  le tables writte
10640 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61  n in this transa
10650 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73 20  ction. This has 
10660 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20  to.  ** be done 
10670 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e 69  before determini
10680 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61 73  ng whether a mas
10690 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
106a0 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69 72   is .  ** requir
106b0 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63 28  ed, as an xSync(
106c0 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61  ) callback may a
106d0 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20 64  dd an attached d
106e0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20  atabase.  ** to 
106f0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
10700 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
10710 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62 2c  ite3VtabSync(db,
10720 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20   p);..  /* This 
10730 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73 20  loop determines 
10740 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d 69  (a) if the commi
10750 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65  t hook should be
10760 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a   invoked and.  *
10770 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20 64  * (b) how many d
10780 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68 61  atabase files ha
10790 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72  ve open write tr
107a0 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20  ansactions, not 
107b0 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20  .  ** including 
107c0 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61 73  the temp databas
107d0 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72 74  e. (b) is import
107e0 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20 6d  ant because if m
107f0 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f  ore than .  ** o
10800 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ne database file
10810 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72 69   has an open wri
10820 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te transaction, 
10830 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10840 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72 65  .  ** file is re
10850 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61 74  quired for an at
10860 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a  omic commit..  *
10870 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  / .  for(i=0; rc
10880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
10890 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
108a0 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
108b0 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
108c0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
108d0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
108e0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  pBt) ){.      /*
108f0 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   Whether or not 
10900 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68 74  a database might
10910 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20 6a   need a master j
10920 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20 75  ournal depends u
10930 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74 73  pon.      ** its
10940 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61   journal mode (a
10950 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e 67  mong other thing
10960 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69 78  s).  This matrix
10970 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69 63   determines whic
10980 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  h.      ** journ
10990 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20 6d  al modes use a m
109a0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
109b0 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a  d which do not *
109c0 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63  /.      static c
109d0 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64 65  onst u8 aMJNeede
109e0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  d[] = {.        
109f0 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20 20  /* DELETE   */  
10a00 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 45  1,.        /* PE
10a10 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20  RSIST   */ 1,.  
10a20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20 20        /* OFF    
10a30 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20     */ 0,.       
10a40 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a 2f   /* TRUNCATE  */
10a50 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d   1,.        /* M
10a60 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20  EMORY    */ 0,. 
10a70 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20 20         /* WAL   
10a80 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d      */ 0.      }
10a90 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70  ;.      Pager *p
10aa0 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67 65  Pager;   /* Page
10ab0 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  r associated wit
10ac0 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e  h pBt */.      n
10ad0 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
10ae0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10af0 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20 20  eeEnter(pBt);.  
10b00 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
10b10 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
10b20 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 64  Bt);.      if( d
10b30 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74 79  b->aDb[i].safety
10b40 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53 59  _level!=PAGER_SY
10b50 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20  NCHRONOUS_OFF.  
10b60 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64 65       && aMJNeede
10b70 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  d[sqlite3PagerGe
10b80 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61  tJournalMode(pPa
10b90 67 65 72 29 5d 0a 20 20 20 20 20 20 29 7b 20 0a  ger)].      ){ .
10ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10bb0 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  i!=1 );.        
10bc0 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20  nTrans++;.      
10bd0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
10be0 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73 69  ite3PagerExclusi
10bf0 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  veLock(pPager);.
10c00 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
10c10 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20 20  eeLeave(pBt);.  
10c20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
10c30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10c40 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10c50 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65  }..  /* If there
10c60 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d 74   are any write-t
10c70 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20 61  ransactions at a
10c80 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 63  ll, invoke the c
10c90 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20  ommit hook */.  
10ca0 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20  if( needXcommit 
10cb0 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61  && db->xCommitCa
10cc0 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72 63  llback ){.    rc
10cd0 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61   = db->xCommitCa
10ce0 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d  llback(db->pComm
10cf0 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28 20  itArg);.    if( 
10d00 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
10d10 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  rn SQLITE_CONSTR
10d20 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b  AINT_COMMITHOOK;
10d30 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10d40 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73 65   The simple case
10d50 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20   - no more than 
10d60 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
10d70 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20  e (not counting 
10d80 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61  the.  ** TEMP da
10d90 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74 72  tabase) has a tr
10da0 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76 65  ansaction active
10db0 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20  .   There is no 
10dc0 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20 2a  need for the.  *
10dd0 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  * master-journal
10de0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74  ..  **.  ** If t
10df0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
10e00 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  of sqlite3BtreeG
10e10 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73 20  etFilename() is 
10e20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20  a zero length.  
10e30 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65  ** string, it me
10e40 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ans the main dat
10e50 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79  abase is :memory
10e60 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c 65  : or a temp file
10e70 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74  .  In .  ** that
10e80 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74 20   case we do not 
10e90 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d  support atomic m
10ea0 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74  ulti-file commit
10eb0 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a 20  s, so use the . 
10ec0 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65 20   ** simple case 
10ed0 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  then too..  */. 
10ee0 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
10ef0 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 42  trlen30(sqlite3B
10f00 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
10f10 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29  db->aDb[0].pBt))
10f20 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31  .   || nTrans<=1
10f30 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  .  ){.    for(i=
10f40 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
10f50 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
10f60 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
10f70 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10f80 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10f90 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
10fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10fb0 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
10fc0 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  (pBt, 0);.      
10fd0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
10fe0 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e  Do the commit on
10ff0 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62 61  ly if all databa
11000 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ses successfully
11010 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65 20   complete phase 
11020 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e  1. .    ** If on
11030 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43 6f  e of the BtreeCo
11040 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
11050 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69 73  alls fails, this
11060 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20 20   indicates an.  
11070 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77 68    ** IO error wh
11080 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72 20  ile deleting or 
11090 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75  truncating a jou
110a0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69 73  rnal file. It is
110b0 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a   unlikely,.    *
110c0 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70 70  * but could happ
110d0 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  en. In this case
110e0 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73   abandon process
110f0 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ing and return t
11100 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f  he error..    */
11110 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63  .    for(i=0; rc
11120 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
11130 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
11140 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11150 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11160 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11170 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11180 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11190 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
111a0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
111b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
111c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
111d0 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d    sqlite3VtabCom
111e0 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20  mit(db);.    }. 
111f0 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d   }..  /* The com
11200 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65 72  plex case - Ther
11210 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c  e is a multi-fil
11220 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
11230 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a  ion active..  **
11240 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20 61   This requires a
11250 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11260 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20 74  file to ensure t
11270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
11280 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  s.  ** committed
11290 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a   atomically..  *
112a0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
112b0 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65  _OMIT_DISKIO.  e
112c0 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
112d0 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62 2d  _vfs *pVfs = db-
112e0 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72 20  >pVfs;.    char 
112f0 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20  *zMaster = 0;   
11300 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72  /* File-name for
11310 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
11320 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20  nal */.    char 
11330 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65  const *zMainFile
11340 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
11350 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61  etFilename(db->a
11360 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20  Db[0].pBt);.    
11370 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
11380 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69  aster = 0;.    i
11390 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
113a0 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
113b0 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d  int retryCount =
113c0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69   0;.    int nMai
113d0 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53  nFile;..    /* S
113e0 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a  elect a master j
113f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
11400 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c   */.    nMainFil
11410 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
11420 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  n30(zMainFile);.
11430 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71      zMaster = sq
11440 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
11450 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58   "%s-mjXXXXXX9XX
11460 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a  z", zMainFile);.
11470 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d      if( zMaster=
11480 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
11490 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20  TE_NOMEM_BKPT;. 
114a0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75 33     do {.      u3
114b0 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20  2 iRandom;.     
114c0 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74 20   if( retryCount 
114d0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
114e0 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b  etryCount>100 ){
114f0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
11500 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
11510 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20  LL, "MJ delete: 
11520 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
11530 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
11540 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
11550 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
11560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
11570 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
11580 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a  etryCount==1 ){.
11590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
115a0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c  3_log(SQLITE_FUL
115b0 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20  L, "MJ collide: 
115c0 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  %s", zMaster);. 
115d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
115e0 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75 6e  .      retryCoun
115f0 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t++;.      sqlit
11600 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
11610 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26  zeof(iRandom), &
11620 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20  iRandom);.      
11630 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
11640 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d  (13, &zMaster[nM
11650 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30  ainFile], "-mj%0
11660 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20 20  6X9%02X",.      
11670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11680 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64 6f           (iRando
11690 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c 20  m>>8)&0xffffff, 
116a0 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20  iRandom&0xff);. 
116b0 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74 69       /* The anti
116c0 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61 72  penultimate char
116d0 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61 73  acter of the mas
116e0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
116f0 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62   must.      ** b
11700 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20 6e  e "9" to avoid n
11710 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77  ame collisions w
11720 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66 69  hen using 8+3 fi
11730 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20  lenames. */.    
11740 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74 65    assert( zMaste
11750 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  r[sqlite3Strlen3
11760 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27  0(zMaster)-3]=='
11770 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  9' );.      sqli
11780 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28 7a  te3FileSuffix3(z
11790 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65  MainFile, zMaste
117a0 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  r);.      rc = s
117b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
117c0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
117d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
117e0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20 7d  TS, &res);.    }
117f0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11800 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a 20  E_OK && res );. 
11810 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
11830 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72   Open the master
11840 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20   journal. */.   
11850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11860 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73  sOpenMalloc(pVfs
11870 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61 73  , zMaster, &pMas
11880 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ter, .          
11890 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
118a0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
118b0 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20 20  N_CREATE|.      
118c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
118d0 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
118e0 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
118f0 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b  RNAL, 0.      );
11900 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
11910 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11920 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
11930 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
11940 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
11950 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f  c;.    }. .    /
11960 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65  * Write the name
11970 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61 73   of each databas
11980 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74 72  e file in the tr
11990 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74  ansaction into t
119a0 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61  he new.    ** ma
119b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
119c0 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  e. If an error o
119d0 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
119e0 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  int close.    **
119f0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
11a00 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11a10 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64  ile. All the ind
11a20 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20  ividual journal 
11a30 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74 69  files.    ** sti
11a40 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20 61  ll have 'null' a
11a50 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
11a60 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f  rnal pointer, so
11a70 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a   they will roll.
11a80 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65      ** back inde
11a90 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20 66  pendently if a f
11aa0 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a 20  ailure occurs.. 
11ab0 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
11ac0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
11ad0 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20  +){.      Btree 
11ae0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
11af0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
11b00 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
11b10 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a 20  nTrans(pBt) ){. 
11b20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
11b30 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74  t *zFile = sqlit
11b40 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61  e3BtreeGetJourna
11b50 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20 20  lname(pBt);.    
11b60 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30      if( zFile==0
11b70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
11b80 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f  ntinue;  /* Igno
11b90 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d  re TEMP and :mem
11ba0 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20 2a  ory: databases *
11bb0 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
11bc0 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
11bd0 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20  e[0]!=0 );.     
11be0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11bf0 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c 20  sWrite(pMaster, 
11c00 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53 74  zFile, sqlite3St
11c10 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c  rlen30(zFile)+1,
11c20 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20   offset);.      
11c30 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c 69    offset += sqli
11c40 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
11c50 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69 66  e)+1;.        if
11c60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
11c80 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
11c90 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  pMaster);.      
11ca0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c      sqlite3OsDel
11cb0 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
11cc0 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 0);.         
11cd0 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
11ce0 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
11cf0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11d00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11d10 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
11d20 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74 65  * Sync the maste
11d30 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
11d40 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51  If the IOCAP_SEQ
11d50 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a 20  UENTIAL device. 
11d60 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65     ** flag is se
11d70 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72 65  t this is not re
11d80 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
11d90 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69 74     if( 0==(sqlit
11da0 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
11db0 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74 65  teristics(pMaste
11dc0 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  r)&SQLITE_IOCAP_
11dd0 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20 20  SEQUENTIAL).    
11de0 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   && SQLITE_OK!=(
11df0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
11e00 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c 49  nc(pMaster, SQLI
11e10 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29  TE_SYNC_NORMAL))
11e20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71  .    ){.      sq
11e30 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
11e40 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
11e50 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11e60 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11e70 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
11e80 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
11e90 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ter);.      retu
11ea0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
11eb0 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68    /* Sync all th
11ec0 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c  e db files invol
11ed0 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ved in the trans
11ee0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65  action. The same
11ef0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74   call.    ** set
11f00 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
11f10 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20  rnal pointer in 
11f20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c 20  each individual 
11f30 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
11f40 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
11f50 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20  rs here, do not 
11f60 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11f70 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
11f80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
11f90 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75 72   the error occur
11fa0 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69 72  s during the fir
11fb0 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  st call to.    *
11fc0 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  * sqlite3BtreeCo
11fd0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c 20  mmitPhaseOne(), 
11fe0 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61 20  then there is a 
11ff0 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65 0a  chance that the.
12000 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
12010 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
12020 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75 74  be orphaned. But
12030 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74   we cannot delet
12040 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20  e it,.    ** in 
12050 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72 20  case the master 
12060 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
12070 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69 6e  e was written in
12080 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
12090 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72     ** file befor
120a0 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f 63  e the failure oc
120b0 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  curred..    */. 
120c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
120d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
120e0 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20  b->nDb; i++){ . 
120f0 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20       Btree *pBt 
12100 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
12110 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20  ;.      if( pBt 
12120 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12130 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12140 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20  itPhaseOne(pBt, 
12150 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
12160 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
12170 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70  te3OsCloseFree(p
12180 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73 73  Master);.    ass
12190 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
121a0 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28 20  BUSY );.    if( 
121b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
121c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
121d0 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
121e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
121f0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
12200 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61 73  * Delete the mas
12210 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12220 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20 74  . This commits t
12230 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
12240 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69  After.    ** doi
12250 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72 65  ng this the dire
12260 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64 20  ctory is synced 
12270 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e 79  again before any
12280 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20 20   individual.    
12290 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66  ** transaction f
122a0 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65 64  iles are deleted
122b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
122c0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  = sqlite3OsDelet
122d0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
122e0 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   1);.    sqlite3
122f0 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74  DbFree(db, zMast
12300 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
12310 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
12320 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
12330 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
12340 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64  /* All files and
12350 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61 76   directories hav
12360 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73  e already been s
12370 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f  ynced, so the fo
12380 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63  llowing.    ** c
12390 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
123a0 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
123b0 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c  wo() are only cl
123c0 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a  osing files and.
123d0 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20      ** deleting 
123e0 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f  or truncating jo
123f0 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74  urnals. If somet
12400 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20  hing goes wrong 
12410 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
12420 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77  s is happening w
12430 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63  e don't really c
12440 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69  are. The integri
12450 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ty of the.    **
12460 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
12470 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74 65  already guarante
12480 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72  ed, but some str
12490 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61  ay 'cold' journa
124a0 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65  ls.    ** may be
124b0 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52   lying around. R
124c0 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f  eturning an erro
124d0 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c  r code won't hel
124e0 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a  p matters..    *
124f0 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69  /.    disable_si
12500 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
12510 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s();.    sqlite3
12520 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f  BeginBenignMallo
12530 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  c();.    for(i=0
12540 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
12550 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65 20  ){ .      Btree 
12560 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
12570 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
12580 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
12590 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
125a0 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20  itPhaseTwo(pBt, 
125b0 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
125c0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64  }.    sqlite3End
125d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
125e0 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c      enable_simul
125f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
12600 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74  ;..    sqlite3Vt
12610 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20  abCommit(db);.  
12620 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
12630 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a  rn rc;.}../* .**
12640 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
12650 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73 71  ecks that the sq
12660 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76  lite3.nVdbeActiv
12670 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65  e count variable
12680 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20  .** matches the 
12690 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73  number of vdbe's
126a0 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c   in the list sql
126b0 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74 20  ite3.pVdbe that 
126c0 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  are.** currently
126d0 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65   active. An asse
126e0 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74  rtion fails if t
126f0 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f  he two counts do
12700 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54   not match..** T
12710 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e  his is an intern
12720 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e  al self-check on
12730 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61  ly - it is not a
12740 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63  n essential proc
12750 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a  essing.** step..
12760 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  **.** This is a 
12770 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20  no-op if NDEBUG 
12780 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
12790 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
127a0 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41  atic void checkA
127b0 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c  ctiveVdbeCnt(sql
127c0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
127d0 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20  e *p;.  int cnt 
127e0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  = 0;.  int nWrit
127f0 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65  e = 0;.  int nRe
12800 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62  ad = 0;.  p = db
12810 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65  ->pVdbe;.  while
12820 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73  ( p ){.    if( s
12830 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
12840 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29  ((sqlite3_stmt*)
12850 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b  p) ){.      cnt+
12860 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  +;.      if( p->
12870 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57  readOnly==0 ) nW
12880 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  rite++;.      if
12890 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29  ( p->bIsReader )
128a0 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a   nRead++;.    }.
128b0 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
128c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
128d0 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63  cnt==db->nVdbeAc
128e0 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tive );.  assert
128f0 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56  ( nWrite==db->nV
12900 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73  dbeWrite );.  as
12910 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d  sert( nRead==db-
12920 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a  >nVdbeRead );.}.
12930 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68  #else.#define ch
12940 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74  eckActiveVdbeCnt
12950 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
12960 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70 61  * If the Vdbe pa
12970 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
12980 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65  t argument opene
12990 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72  d a statement-tr
129a0 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c  ansaction,.** cl
129b0 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75  ose it now. Argu
129c0 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65  ment eOp must be
129d0 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e   either SAVEPOIN
129e0 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a  T_ROLLBACK or.**
129f0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
12a00 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  SE. If it is SAV
12a10 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
12a20 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d   then the statem
12a30 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
12a40 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63  on is rolled bac
12a50 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41 56  k. If eOp is SAV
12a60 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
12a70 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61  then the .** sta
12a80 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12a90 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
12aa0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20  .**.** If an IO 
12ab0 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
12ac0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58   SQLITE_IOERR_XX
12ad0 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  X error code is 
12ae0 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74  returned. .** Ot
12af0 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
12b00 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
12b10 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12b20 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ent(Vdbe *p, int
12b30 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33   eOp){.  sqlite3
12b40 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e   *const db = p->
12b50 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  db;.  int rc = S
12b60 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
12b70 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  If p->iStatement
12b80 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12b90 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73   zero, then this
12ba0 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a   Vdbe opened a .
12bb0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74    ** statement t
12bc0 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20  ransaction that 
12bd0 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64  should be closed
12be0 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20   here. The only 
12bf0 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69  exception.  ** i
12c00 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72  s that an IO err
12c10 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75  or may have occu
12c20 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e  rred, causing an
12c30 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62   emergency rollb
12c40 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69  ack..  ** In thi
12c50 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61  s case (db->nSta
12c60 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20  tement==0), and 
12c70 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67  there is nothing
12c80 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69   to do..  */.  i
12c90 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  f( db->nStatemen
12ca0 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65  t && p->iStateme
12cb0 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  nt ){.    int i;
12cc0 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69  .    const int i
12cd0 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69  Savepoint = p->i
12ce0 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20  Statement-1;..  
12cf0 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53    assert( eOp==S
12d00 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12d10 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f  K || eOp==SAVEPO
12d20 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20  INT_RELEASE);.  
12d30 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53    assert( db->nS
12d40 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20  tatement>0 );.  
12d50 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74    assert( p->iSt
12d60 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53  atement==(db->nS
12d70 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61  tatement+db->nSa
12d80 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20  vepoint) );..   
12d90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
12da0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
12db0 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49    int rc2 = SQLI
12dc0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72  TE_OK;.      Btr
12dd0 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
12de0 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
12df0 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
12e00 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45     if( eOp==SAVE
12e10 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29  POINT_ROLLBACK )
12e20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32 20  {.          rc2 
12e30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 61  = sqlite3BtreeSa
12e40 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56  vepoint(pBt, SAV
12e50 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
12e60 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12e70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12e80 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f  if( rc2==SQLITE_
12e90 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
12ea0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72  rc2 = sqlite3Btr
12eb0 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c  eeSavepoint(pBt,
12ec0 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
12ed0 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
12ee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12ef0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12f00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12f10 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
12f20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
12f30 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61    }.    db->nSta
12f40 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d  tement--;.    p-
12f50 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
12f60 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
12f70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12f80 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
12f90 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
12fa0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12fb0 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e  ite3VtabSavepoin
12fc0 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f  t(db, SAVEPOINT_
12fd0 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
12fe0 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  oint);.      }. 
12ff0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
13000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13010 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74    rc = sqlite3Vt
13020 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20  abSavepoint(db, 
13030 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
13040 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  E, iSavepoint);.
13050 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
13060 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
13070 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13080 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  on is being roll
13090 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65  ed back, also re
130a0 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a  store the .    *
130b0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
130c0 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73  es deferred cons
130d0 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74  traint counter t
130e0 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20 68  o the value it h
130f0 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20  ad when .    ** 
13100 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
13110 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70  ansaction was op
13120 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  ened.  */.    if
13130 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
13140 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
13150 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
13160 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44  Cons = p->nStmtD
13170 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62  efCons;.      db
13180 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
13190 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
131a0 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20  ImmCons;.    }. 
131b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
131c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
131d0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
131e0 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
131f0 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68  ion opened by th
13200 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68  e database .** h
13210 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64  andle associated
13220 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61 73   with the VM pas
13230 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65  sed as an argume
13240 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62  nt is about to b
13250 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e  e .** committed.
13260 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
13270 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72  tstanding deferr
13280 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ed foreign key c
13290 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f  onstraint.** vio
132a0 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20  lations, return 
132b0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74  SQLITE_ERROR. Ot
132c0 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f  herwise, SQLITE_
132d0 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
132e0 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
132f0 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73  ng FK violations
13300 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
13310 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  on returns .** S
13320 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74  QLITE_ERROR, set
13330 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74   the result of t
13340 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f  he VM to SQLITE_
13350 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
13360 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69  GNKEY.** and wri
13370 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  te an error mess
13380 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20  age to it. Then 
13390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
133a0 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ROR..*/.#ifndef 
133b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45  SQLITE_OMIT_FORE
133c0 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69  IGN_KEY.int sqli
133d0 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56  te3VdbeCheckFk(V
133e0 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65  dbe *p, int defe
133f0 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  rred){.  sqlite3
13400 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20   *db = p->db;.  
13410 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26 26  if( (deferred &&
13420 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43   (db->nDeferredC
13430 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65  ons+db->nDeferre
13440 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20  dImmCons)>0) .  
13450 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20 26   || (!deferred &
13460 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69  & p->nFkConstrai
13470 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20  nt>0) .  ){.    
13480 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43  p->rc = SQLITE_C
13490 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
134a0 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72  NKEY;.    p->err
134b0 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62  orAction = OE_Ab
134c0 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ort;.    sqlite3
134d0 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46 4f  VdbeError(p, "FO
134e0 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72  REIGN KEY constr
134f0 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a 20  aint failed");. 
13500 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13510 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
13520 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13530 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
13540 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
13550 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e 20  called the when 
13560 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f 20  a VDBE tries to 
13570 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56 44  halt.  If the VD
13580 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20 63  BE.** has made c
13590 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69 6e  hanges and is in
135a0 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65   autocommit mode
135b0 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68  , then commit th
135c0 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20  ose.** changes. 
135d0 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69   If a rollback i
135e0 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20 64  s needed, then d
135f0 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  o the rollback..
13600 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
13610 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 77  ne is the only w
13620 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20 73  ay to move the s
13630 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72 6f  tate of a VM fro
13640 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49  m.** SQLITE_MAGI
13650 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f  C_RUN to SQLITE_
13660 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74 20  MAGIC_HALT.  It 
13670 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a  is harmless to.*
13680 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61  * call this on a
13690 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20 74   VM that is in t
136a0 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  he SQLITE_MAGIC_
136b0 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  HALT state..**.*
136c0 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  * Return an erro
136d0 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65 20  r code.  If the 
136e0 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74  commit could not
136f0 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75 73   complete becaus
13700 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e  e of.** lock con
13710 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20  tention, return 
13720 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49 66  SQLITE_BUSY.  If
13730 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
13740 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20  returned, it.** 
13750 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65 20  means the close 
13760 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20 61  did not happen a
13770 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  nd needs to be r
13780 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  epeated..*/.int 
13790 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74 28  sqlite3VdbeHalt(
137a0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
137b0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
137c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
137d0 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72 61  sed to store tra
137e0 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63 6f  nsient return co
137f0 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  des */.  sqlite3
13800 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20   *db = p->db;.. 
13810 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
13820 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c  n contains the l
13830 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72 6d  ogic that determ
13840 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65 6d  ines if a statem
13850 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e  ent or.  ** tran
13860 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
13870 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c  committed or rol
13880 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
13890 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a  sult of the.  **
138a0 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68   execution of th
138b0 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  is virtual machi
138c0 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ne. .  **.  ** I
138d0 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  f any of the fol
138e0 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f 63  lowing errors oc
138f0 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  cur:.  **.  **  
13900 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a     SQLITE_NOMEM.
13910 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f    **     SQLITE_
13920 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20 53  IOERR.  **     S
13930 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20  QLITE_FULL.  ** 
13940 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45 52      SQLITE_INTER
13950 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  RUPT.  **.  ** T
13960 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  hen the internal
13970 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61 76   cache might hav
13980 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20 61  e been left in a
13990 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20  n inconsistent. 
139a0 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20 6e   ** state.  We n
139b0 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20  eed to rollback 
139c0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72  the statement tr
139d0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74 68  ansaction, if th
139e0 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c  ere is.  ** one,
139f0 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   or the complete
13a00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
13a10 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61 74  there is no stat
13a20 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
13a30 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20 64  n..  */..  if( d
13a40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13a50 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53  ){.    p->rc = S
13a60 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
13a70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  ;.  }.  if( p->a
13a80 4f 6e 63 65 46 6c 61 67 20 29 20 6d 65 6d 73 65  OnceFlag ) memse
13a90 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 2c 20  t(p->aOnceFlag, 
13aa0 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61 67 29  0, p->nOnceFlag)
13ab0 3b 0a 20 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73  ;.  closeAllCurs
13ac0 6f 72 73 28 70 29 3b 0a 20 20 69 66 28 20 70 2d  ors(p);.  if( p-
13ad0 3e 6d 61 67 69 63 21 3d 56 44 42 45 5f 4d 41 47  >magic!=VDBE_MAG
13ae0 49 43 5f 52 55 4e 20 29 7b 0a 20 20 20 20 72 65  IC_RUN ){.    re
13af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13b00 20 20 7d 0a 20 20 63 68 65 63 6b 41 63 74 69 76    }.  checkActiv
13b10 65 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20  eVdbeCnt(db);.. 
13b20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72   /* No commit or
13b30 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64   rollback needed
13b40 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20   if the program 
13b50 6e 65 76 65 72 20 73 74 61 72 74 65 64 20 6f 72  never started or
13b60 20 69 66 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c   if the.  ** SQL
13b70 20 73 74 61 74 65 6d 65 6e 74 20 64 6f 65 73 20   statement does 
13b80 6e 6f 74 20 72 65 61 64 20 6f 72 20 77 72 69 74  not read or writ
13b90 65 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  e a database fil
13ba0 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  e.  */.  if( p->
13bb0 70 63 3e 3d 30 20 26 26 20 70 2d 3e 62 49 73 52  pc>=0 && p->bIsR
13bc0 65 61 64 65 72 20 29 7b 0a 20 20 20 20 69 6e 74  eader ){.    int
13bd0 20 6d 72 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61   mrc;   /* Prima
13be0 72 79 20 65 72 72 6f 72 20 63 6f 64 65 20 66 72  ry error code fr
13bf0 6f 6d 20 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20  om p->rc */.    
13c00 69 6e 74 20 65 53 74 61 74 65 6d 65 6e 74 4f 70  int eStatementOp
13c10 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 73   = 0;.    int is
13c20 53 70 65 63 69 61 6c 45 72 72 6f 72 3b 20 20 20  SpecialError;   
13c30 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
13c40 74 6f 20 74 72 75 65 20 69 66 20 61 20 27 73 70  to true if a 'sp
13c50 65 63 69 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a  ecial' error */.
13c60 0a 20 20 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c  .    /* Lock all
13c70 20 62 74 72 65 65 73 20 75 73 65 64 20 62 79 20   btrees used by 
13c80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  the statement */
13c90 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
13ca0 45 6e 74 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f  Enter(p);..    /
13cb0 2a 20 43 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20  * Check for one 
13cc0 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 65  of the special e
13cd0 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63  rrors */.    mrc
13ce0 20 3d 20 70 2d 3e 72 63 20 26 20 30 78 66 66 3b   = p->rc & 0xff;
13cf0 0a 20 20 20 20 69 73 53 70 65 63 69 61 6c 45 72  .    isSpecialEr
13d00 72 6f 72 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54  ror = mrc==SQLIT
13d10 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
13d20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 20  SQLITE_IOERR.   
13d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d40 20 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45    || mrc==SQLITE
13d50 5f 49 4e 54 45 52 52 55 50 54 20 7c 7c 20 6d 72  _INTERRUPT || mr
13d60 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  c==SQLITE_FULL;.
13d70 20 20 20 20 69 66 28 20 69 73 53 70 65 63 69 61      if( isSpecia
13d80 6c 45 72 72 6f 72 20 29 7b 0a 20 20 20 20 20 20  lError ){.      
13d90 2f 2a 20 49 66 20 74 68 65 20 71 75 65 72 79 20  /* If the query 
13da0 77 61 73 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e  was read-only an
13db0 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  d the error code
13dc0 20 69 73 20 53 51 4c 49 54 45 5f 49 4e 54 45 52   is SQLITE_INTER
13dd0 52 55 50 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20  RUPT, .      ** 
13de0 6e 6f 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e  no rollback is n
13df0 65 63 65 73 73 61 72 79 2e 20 4f 74 68 65 72 77  ecessary. Otherw
13e00 69 73 65 2c 20 61 74 20 6c 65 61 73 74 20 61 20  ise, at least a 
13e10 73 61 76 65 70 6f 69 6e 74 20 0a 20 20 20 20 20  savepoint .     
13e20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
13e30 6d 75 73 74 20 62 65 20 72 6f 6c 6c 65 64 20 62  must be rolled b
13e40 61 63 6b 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ack to restore t
13e50 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 61  he database to a
13e60 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69   .      ** consi
13e70 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
13e80 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45     **.      ** E
13e90 76 65 6e 20 69 66 20 74 68 65 20 73 74 61 74 65  ven if the state
13ea0 6d 65 6e 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c  ment is read-onl
13eb0 79 2c 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  y, it is importa
13ec0 6e 74 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20  nt to perform.  
13ed0 20 20 20 20 2a 2a 20 61 20 73 74 61 74 65 6d 65      ** a stateme
13ee0 6e 74 20 6f 72 20 74 72 61 6e 73 61 63 74 69 6f  nt or transactio
13ef0 6e 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61  n rollback opera
13f00 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 65 72 72  tion. If the err
13f10 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63  or .      ** occ
13f20 75 72 72 65 64 20 77 68 69 6c 65 20 77 72 69 74  urred while writ
13f30 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
13f40 61 6c 2c 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  al, sub-journal 
13f50 6f 72 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  or database.    
13f60 20 20 2a 2a 20 66 69 6c 65 20 61 73 20 70 61 72    ** file as par
13f70 74 20 6f 66 20 61 6e 20 65 66 66 6f 72 74 20 74  t of an effort t
13f80 6f 20 66 72 65 65 20 75 70 20 63 61 63 68 65 20  o free up cache 
13f90 73 70 61 63 65 20 28 73 65 65 20 66 75 6e 63 74  space (see funct
13fa0 69 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  ion.      ** pag
13fb0 65 72 53 74 72 65 73 73 28 29 20 69 6e 20 70 61  erStress() in pa
13fc0 67 65 72 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c  ger.c), the roll
13fd0 62 61 63 6b 20 69 73 20 72 65 71 75 69 72 65 64  back is required
13fe0 20 74 6f 20 72 65 73 74 6f 72 65 20 0a 20 20 20   to restore .   
13ff0 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20     ** the pager 
14000 74 6f 20 61 20 63 6f 6e 73 69 73 74 65 6e 74 20  to a consistent 
14010 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  state..      */.
14020 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 72 65        if( !p->re
14030 61 64 4f 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53  adOnly || mrc!=S
14040 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
14050 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  ){.        if( (
14060 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
14070 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
14080 5f 46 55 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65  _FULL) && p->use
14090 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a  sStmtJournal ){.
140a0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
140b0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
140c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
140d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
140e0 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20        /* We are 
140f0 66 6f 72 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62  forced to roll b
14100 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 74  ack the active t
14110 72 61 6e 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f  ransaction. Befo
14120 72 65 20 64 6f 69 6e 67 0a 20 20 20 20 20 20 20  re doing.       
14130 20 20 20 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20     ** so, abort 
14140 61 6e 79 20 6f 74 68 65 72 20 73 74 61 74 65 6d  any other statem
14150 65 6e 74 73 20 74 68 69 73 20 68 61 6e 64 6c 65  ents this handle
14160 20 63 75 72 72 65 6e 74 6c 79 20 68 61 73 20 61   currently has a
14170 63 74 69 76 65 2e 0a 20 20 20 20 20 20 20 20 20  ctive..         
14180 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
14190 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
141a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52  (db, SQLITE_ABOR
141b0 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20  T_ROLLBACK);.   
141c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
141d0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
141e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d  );.          db-
141f0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
14200 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  .          p->nC
14210 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
14220 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
14230 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
14240 20 66 6f 72 20 69 6d 6d 65 64 69 61 74 65 20 66   for immediate f
14250 6f 72 65 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61  oreign key viola
14260 74 69 6f 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66  tions. */.    if
14270 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14280 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
14290 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70  te3VdbeCheckFk(p
142a0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  , 0);.    }.  . 
142b0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75 74     /* If the aut
142c0 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73  o-commit flag is
142d0 20 73 65 74 20 61 6e 64 20 74 68 69 73 20 69 73   set and this is
142e0 20 74 68 65 20 6f 6e 6c 79 20 61 63 74 69 76 65   the only active
142f0 20 77 72 69 74 65 72 20 0a 20 20 20 20 2a 2a 20   writer .    ** 
14300 56 4d 2c 20 74 68 65 6e 20 77 65 20 64 6f 20 65  VM, then we do e
14310 69 74 68 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f  ither a commit o
14320 72 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68  r rollback of th
14330 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61  e current transa
14340 63 74 69 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20  ction. .    **. 
14350 20 20 20 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73     ** Note: This
14360 20 62 6c 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73   block also runs
14370 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 73   if one of the s
14380 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20 68 61  pecial errors ha
14390 6e 64 6c 65 64 20 0a 20 20 20 20 2a 2a 20 61 62  ndled .    ** ab
143a0 6f 76 65 20 68 61 73 20 6f 63 63 75 72 72 65 64  ove has occurred
143b0 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  . .    */.    if
143c0 28 20 21 73 71 6c 69 74 65 33 56 74 61 62 49 6e  ( !sqlite3VtabIn
143d0 53 79 6e 63 28 64 62 29 20 0a 20 20 20 20 20 26  Sync(db) .     &
143e0 26 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74  & db->autoCommit
143f0 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e 6e 56   .     && db->nV
14400 64 62 65 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65  dbeWrite==(p->re
14410 61 64 4f 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20  adOnly==0) .    
14420 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
14430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14440 20 28 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e   (p->errorAction
14450 3d 3d 4f 45 5f 46 61 69 6c 20 26 26 20 21 69 73  ==OE_Fail && !is
14460 53 70 65 63 69 61 6c 45 72 72 6f 72 29 20 29 7b  SpecialError) ){
14470 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
14480 6c 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b  lite3VdbeCheckFk
14490 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  (p, 1);.        
144a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
144b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  K ){.          i
144c0 66 28 20 4e 45 56 45 52 28 70 2d 3e 72 65 61 64  f( NEVER(p->read
144d0 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 20  Only) ){.       
144e0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
144f0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
14500 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14510 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
14520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14530 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e   rc = SQLITE_CON
14540 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
14550 45 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  EY;.        }els
14560 65 7b 20 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  e{ .          /*
14570 20 54 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74   The auto-commit
14580 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
14590 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
145a0 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 20 0a  was successful .
145b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20            ** or 
145c0 68 69 74 20 61 6e 20 27 4f 52 20 46 41 49 4c 27  hit an 'OR FAIL'
145d0 20 63 6f 6e 73 74 72 61 69 6e 74 20 61 6e 64 20   constraint and 
145e0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 64 65 66  there are no def
145f0 65 72 72 65 64 20 66 6f 72 65 69 67 6e 0a 20 20  erred foreign.  
14600 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 63          ** key c
14610 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 68 6f  onstraints to ho
14620 6c 64 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  ld up the transa
14630 63 74 69 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e  ction. This mean
14640 73 20 61 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20  s a commit .    
14650 20 20 20 20 20 20 2a 2a 20 69 73 20 72 65 71 75        ** is requ
14660 69 72 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ired. */.       
14670 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d     rc = vdbeComm
14680 69 74 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20  it(db, p);.     
14690 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
146a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
146b0 20 26 26 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20   && p->readOnly 
146c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
146d0 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70 29  ite3VdbeLeave(p)
146e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
146f0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
14700 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
14710 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ){.          p->
14730 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 20  rc = rc;.       
14740 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
14750 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
14760 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  _OK);.          
14770 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14780 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
14790 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65           db->nDe
147a0 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a  ferredCons = 0;.
147b0 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6e 44            db->nD
147c0 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d  eferredImmCons =
147d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62   0;.          db
147e0 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49  ->flags &= ~SQLI
147f0 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 20 20 20  TE_DeferFKs;.   
14800 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f         sqlite3Co
14810 6d 6d 69 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e  mmitInternalChan
14820 67 65 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  ges(db);.       
14830 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
14840 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14850 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14860 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
14870 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20     p->nChange = 
14880 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
14890 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
148a0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
148b0 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d  f( eStatementOp=
148c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
148d0 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  p->rc==SQLITE_OK
148e0 20 7c 7c 20 70 2d 3e 65 72 72 6f 72 41 63 74 69   || p->errorActi
148f0 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20  on==OE_Fail ){. 
14900 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
14910 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
14920 52 45 4c 45 41 53 45 3b 0a 20 20 20 20 20 20 7d  RELEASE;.      }
14930 65 6c 73 65 20 69 66 28 20 70 2d 3e 65 72 72 6f  else if( p->erro
14940 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72  rAction==OE_Abor
14950 74 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  t ){.        eSt
14960 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
14970 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a  POINT_ROLLBACK;.
14980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14990 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
149a0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
149b0 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
149c0 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  K);.        sqli
149d0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
149e0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
149f0 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
14a00 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e   1;.        p->n
14a10 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
14a20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
14a30 20 2f 2a 20 49 66 20 65 53 74 61 74 65 6d 65 6e   /* If eStatemen
14a40 74 4f 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  tOp is non-zero,
14a50 20 74 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   then a statemen
14a60 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65  t transaction ne
14a70 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
14a80 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
14a90 6c 6c 65 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20  lled back. Call 
14aa0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
14ab0 53 74 61 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20  Statement() to. 
14ac0 20 20 20 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20     ** do so. If 
14ad0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 72  this operation r
14ae0 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c  eturns an error,
14af0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
14b00 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a   statement.    *
14b10 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
14b20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c  SQLITE_OK or SQL
14b30 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
14b40 74 68 65 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65  then promote the
14b50 0a 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 20  .    ** current 
14b60 73 74 61 74 65 6d 65 6e 74 20 65 72 72 6f 72 20  statement error 
14b70 63 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  code..    */.   
14b80 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f   if( eStatementO
14b90 70 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  p ){.      rc = 
14ba0 73 71 6c 69 74 65 33 56 64 62 65 43 6c 6f 73 65  sqlite3VdbeClose
14bb0 53 74 61 74 65 6d 65 6e 74 28 70 2c 20 65 53 74  Statement(p, eSt
14bc0 61 74 65 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20  atementOp);.    
14bd0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
14be0 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14bf0 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e  QLITE_OK || (p->
14c00 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
14c10 5f 43 4f 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20  _CONSTRAINT ){. 
14c20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d           p->rc =
14c30 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73   rc;.          s
14c40 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14c50 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
14c60 20 20 20 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d          p->zErrM
14c70 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
14c80 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
14c90 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
14ca0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
14cb0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
14cc0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
14cd0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14ce0 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14cf0 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14d00 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14d10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14d20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73   .    /* If this
14d30 20 77 61 73 20 61 6e 20 49 4e 53 45 52 54 2c 20   was an INSERT, 
14d40 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
14d50 20 61 6e 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e   and no statemen
14d60 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  t transaction.  
14d70 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 6f    ** has been ro
14d80 6c 6c 65 64 20 62 61 63 6b 2c 20 75 70 64 61 74  lled back, updat
14d90 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  e the database c
14da0 6f 6e 6e 65 63 74 69 6f 6e 20 63 68 61 6e 67 65  onnection change
14db0 2d 63 6f 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a  -counter. .    *
14dc0 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 63 68 61  /.    if( p->cha
14dd0 6e 67 65 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20  ngeCntOn ){.    
14de0 20 20 69 66 28 20 65 53 74 61 74 65 6d 65 6e 74    if( eStatement
14df0 4f 70 21 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op!=SAVEPOINT_RO
14e00 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
14e10 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74    sqlite3VdbeSet
14e20 43 68 61 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e  Changes(db, p->n
14e30 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d  Change);.      }
14e40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14e50 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61 6e  lite3VdbeSetChan
14e60 67 65 73 28 64 62 2c 20 30 29 3b 0a 20 20 20 20  ges(db, 0);.    
14e70 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68    }.      p->nCh
14e80 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ange = 0;.    }.
14e90 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
14ea0 74 68 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20  the locks */.   
14eb0 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76   sqlite3VdbeLeav
14ec0 65 28 70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(p);.  }..  /* 
14ed0 57 65 20 68 61 76 65 20 73 75 63 63 65 73 73 66  We have successf
14ee0 75 6c 6c 79 20 68 61 6c 74 65 64 20 61 6e 64 20  ully halted and 
14ef0 63 6c 6f 73 65 64 20 74 68 65 20 56 4d 2e 20 20  closed the VM.  
14f00 52 65 63 6f 72 64 20 74 68 69 73 20 66 61 63 74  Record this fact
14f10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63  . */.  if( p->pc
14f20 3e 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e  >=0 ){.    db->n
14f30 56 64 62 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20  VdbeActive--;.  
14f40 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e    if( !p->readOn
14f50 6c 79 20 29 20 64 62 2d 3e 6e 56 64 62 65 57 72  ly ) db->nVdbeWr
14f60 69 74 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  ite--;.    if( p
14f70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 64 62  ->bIsReader ) db
14f80 2d 3e 6e 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20  ->nVdbeRead--;. 
14f90 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
14fa0 56 64 62 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e  VdbeActive>=db->
14fb0 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 20 20 20  nVdbeRead );.   
14fc0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
14fd0 62 65 52 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62  beRead>=db->nVdb
14fe0 65 57 72 69 74 65 20 29 3b 0a 20 20 20 20 61 73  eWrite );.    as
14ff0 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 57  sert( db->nVdbeW
15000 72 69 74 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20  rite>=0 );.  }. 
15010 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45   p->magic = VDBE
15020 5f 4d 41 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63  _MAGIC_HALT;.  c
15030 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
15040 74 28 64 62 29 3b 0a 20 20 69 66 28 20 64 62 2d  t(db);.  if( db-
15050 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15060 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
15070 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
15080 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65    }..  /* If the
15090 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61   auto-commit fla
150a0 67 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  g is set to true
150b0 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73  , then any locks
150c0 20 74 68 61 74 20 77 65 72 65 20 68 65 6c 64 0a   that were held.
150d0 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69    ** by connecti
150e0 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f 77 20 62  on db have now b
150f0 65 65 6e 20 72 65 6c 65 61 73 65 64 2e 20 43 61  een released. Ca
15100 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63  ll sqlite3Connec
15110 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a  tionUnlocked() .
15120 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61    ** to invoke a
15130 6e 79 20 72 65 71 75 69 72 65 64 20 75 6e 6c 6f  ny required unlo
15140 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
15150 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  cks..  */.  if( 
15160 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29  db->autoCommit )
15170 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e  {.    sqlite3Con
15180 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
15190 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  db);.  }..  asse
151a0 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74  rt( db->nVdbeAct
151b0 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74  ive>0 || db->aut
151c0 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62  oCommit==0 || db
151d0 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20  ->nStatement==0 
151e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e  );.  return (p->
151f0 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
15200 3f 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20  ? SQLITE_BUSY : 
15210 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a  SQLITE_OK);.}...
15220 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44 42 45 20  /*.** Each VDBE 
15230 68 6f 6c 64 73 20 74 68 65 20 72 65 73 75 6c 74  holds the result
15240 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
15250 65 6e 74 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ent sqlite3_step
15260 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d  () call.** in p-
15270 3e 72 63 2e 20 20 54 68 69 73 20 72 6f 75 74 69  >rc.  This routi
15280 6e 65 20 73 65 74 73 20 74 68 61 74 20 72 65 73  ne sets that res
15290 75 6c 74 20 62 61 63 6b 20 74 6f 20 53 51 4c 49  ult back to SQLI
152a0 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  TE_OK..*/.void s
152b0 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 53  qlite3VdbeResetS
152c0 74 65 70 52 65 73 75 6c 74 28 56 64 62 65 20 2a  tepResult(Vdbe *
152d0 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51  p){.  p->rc = SQ
152e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
152f0 2a 20 43 6f 70 79 20 74 68 65 20 65 72 72 6f 72  * Copy the error
15300 20 63 6f 64 65 20 61 6e 64 20 65 72 72 6f 72 20   code and error 
15310 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e  message belongin
15320 67 20 74 6f 20 74 68 65 20 56 44 42 45 20 70 61  g to the VDBE pa
15330 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 66  ssed.** as the f
15340 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f  irst argument to
15350 20 69 74 73 20 64 61 74 61 62 61 73 65 20 68 61   its database ha
15360 6e 64 6c 65 20 28 73 6f 20 74 68 61 74 20 74 68  ndle (so that th
15370 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72  ey will be .** r
15380 65 74 75 72 6e 65 64 20 62 79 20 63 61 6c 6c 73  eturned by calls
15390 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 72 72 63   to sqlite3_errc
153a0 6f 64 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  ode() and sqlite
153b0 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a  3_errmsg())..**.
153c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
153d0 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65 61 72 20   does not clear 
153e0 74 68 65 20 56 44 42 45 20 65 72 72 6f 72 20 63  the VDBE error c
153f0 6f 64 65 20 6f 72 20 6d 65 73 73 61 67 65 2c 20  ode or message, 
15400 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74  just.** copies t
15410 68 65 6d 20 74 6f 20 74 68 65 20 64 61 74 61 62  hem to the datab
15420 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
15430 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 54 72  nt sqlite3VdbeTr
15440 61 6e 73 66 65 72 45 72 72 6f 72 28 56 64 62 65  ansferError(Vdbe
15450 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20   *p){.  sqlite3 
15460 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  *db = p->db;.  i
15470 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20  nt rc = p->rc;. 
15480 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20   if( p->zErrMsg 
15490 29 7b 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69  ){.    db->bBeni
154a0 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20  gnMalloc++;.    
154b0 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69  sqlite3BeginBeni
154c0 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20  gnMalloc();.    
154d0 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20  if( db->pErr==0 
154e0 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c  ) db->pErr = sql
154f0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29  ite3ValueNew(db)
15500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  ;.    sqlite3Val
15510 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45 72  ueSetStr(db->pEr
15520 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73  r, -1, p->zErrMs
15530 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  g, SQLITE_UTF8, 
15540 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
15550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
15560 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
15570 0a 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e  .    db->bBenign
15580 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62  Malloc--;.    db
15590 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a  ->errCode = rc;.
155a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
155b0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
155c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
155d0 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  rc;.}..#ifdef SQ
155e0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
155f0 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53  OG./*.** If an S
15600 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
15610 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69  LOG hook is regi
15620 73 74 65 72 65 64 20 61 6e 64 20 74 68 65 20 56  stered and the V
15630 4d 20 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20  M has been run, 
15640 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a  .** invoke it..*
15650 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  /.static void vd
15660 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56  beInvokeSqllog(V
15670 64 62 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73  dbe *v){.  if( s
15680 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15690 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d  ig.xSqllog && v-
156a0 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26  >rc==SQLITE_OK &
156b0 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e  & v->zSql && v->
156c0 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  pc>=0 ){.    cha
156d0 72 20 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73  r *zExpanded = s
156e0 71 6c 69 74 65 33 56 64 62 65 45 78 70 61 6e 64  qlite3VdbeExpand
156f0 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b  Sql(v, v->zSql);
15700 0a 20 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e  .    assert( v->
15710 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
15720 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70   );.    if( zExp
15730 61 6e 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73  anded ){.      s
15740 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15750 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20  ig.xSqllog(.    
15760 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
15770 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
15780 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78  gArg, v->db, zEx
15790 70 61 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20  panded, 1.      
157a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
157b0 44 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45  DbFree(v->db, zE
157c0 78 70 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a  xpanded);.    }.
157d0 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65    }.}.#else.# de
157e0 66 69 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53  fine vdbeInvokeS
157f0 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a  qllog(x).#endif.
15800 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
15810 61 20 56 44 42 45 20 61 66 74 65 72 20 65 78 65  a VDBE after exe
15820 63 75 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f  cution but do no
15830 74 20 64 65 6c 65 74 65 20 74 68 65 20 56 44 42  t delete the VDB
15840 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57  E just yet..** W
15850 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d  rite any error m
15860 65 73 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a  essages into *pz
15870 45 72 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20  ErrMsg.  Return 
15880 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e  the result code.
15890 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  .**.** After thi
158a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e  s routine is run
158b0 2c 20 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c  , the VDBE shoul
158c0 64 20 62 65 20 72 65 61 64 79 20 74 6f 20 62 65  d be ready to be
158d0 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61   executed.** aga
158e0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f  in..**.** To loo
158f0 6b 20 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20  k at it another 
15900 77 61 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  way, this routin
15910 65 20 72 65 73 65 74 73 20 74 68 65 20 73 74 61  e resets the sta
15920 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72  te of the.** vir
15930 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f  tual machine fro
15940 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  m VDBE_MAGIC_RUN
15950 20 6f 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48   or VDBE_MAGIC_H
15960 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56  ALT back to.** V
15970 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a  DBE_MAGIC_INIT..
15980 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
15990 62 65 52 65 73 65 74 28 56 64 62 65 20 2a 70 29  beReset(Vdbe *p)
159a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
159b0 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  .  db = p->db;..
159c0 20 20 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64    /* If the VM d
159d0 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f  id not run to co
159e0 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69  mpletion or if i
159f0 74 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e  t encountered an
15a00 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65  .  ** error, the
15a10 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68  n it might not h
15a20 61 76 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20  ave been halted 
15a30 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61  properly.  So ha
15a40 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a  lt.  ** it now..
15a50 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64    */.  sqlite3Vd
15a60 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a  beHalt(p);..  /*
15a70 20 49 66 20 74 68 65 20 56 44 42 45 20 68 61 73   If the VDBE has
15a80 20 62 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72   be run even par
15a90 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61  tially, then tra
15aa0 6e 73 66 65 72 20 74 68 65 20 65 72 72 6f 72 20  nsfer the error 
15ab0 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72  code.  ** and er
15ac0 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
15ad0 20 74 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74   the VDBE into t
15ae0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15af0 20 73 74 72 75 63 74 75 72 65 2e 20 20 42 75 74   structure.  But
15b00 0a 20 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42  .  ** if the VDB
15b10 45 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  E has just been 
15b20 73 65 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68  set to run but h
15b30 61 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  as not actually 
15b40 65 78 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a  executed any.  *
15b50 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79  * instructions y
15b60 65 74 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61  et, leave the ma
15b70 69 6e 20 64 61 74 61 62 61 73 65 20 65 72 72 6f  in database erro
15b80 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e  r information un
15b90 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20  changed..  */.  
15ba0 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a  if( p->pc>=0 ){.
15bb0 20 20 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71      vdbeInvokeSq
15bc0 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c  llog(p);.    sql
15bd0 69 74 65 33 56 64 62 65 54 72 61 6e 73 66 65 72  ite3VdbeTransfer
15be0 45 72 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71  Error(p);.    sq
15bf0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
15c00 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  p->zErrMsg);.   
15c10 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b   p->zErrMsg = 0;
15c20 0a 20 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f  .    if( p->runO
15c30 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70  nlyOnce ) p->exp
15c40 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  ired = 1;.  }els
15c50 65 20 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70  e if( p->rc && p
15c60 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20  ->expired ){.   
15c70 20 2f 2a 20 54 68 65 20 65 78 70 69 72 65 64 20   /* The expired 
15c80 66 6c 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20  flag was set on 
15c90 74 68 65 20 56 44 42 45 20 62 65 66 6f 72 65 20  the VDBE before 
15ca0 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20  the first call. 
15cb0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
15cc0 5f 73 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e  _step(). For con
15cd0 73 69 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20  sistency (since 
15ce0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77  sqlite3_step() w
15cf0 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64  as.    ** called
15d00 29 2c 20 73 65 74 20 74 68 65 20 64 61 74 61 62  ), set the datab
15d10 61 73 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69  ase error in thi
15d20 73 20 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a  s case as well..
15d30 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
15d40 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64  e3ErrorWithMsg(d
15d50 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72  b, p->rc, p->zEr
15d60 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
15d70 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15d80 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
15d90 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b  db, p->zErrMsg);
15da0 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20  .    p->zErrMsg 
15db0 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  = 0;.  }..  /* R
15dc0 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72  eclaim all memor
15dd0 79 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44  y used by the VD
15de0 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75  BE.  */.  Cleanu
15df0 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65  p(p);..  /* Save
15e00 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72   profiling infor
15e10 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73  mation from this
15e20 20 56 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a   VDBE run..  */.
15e30 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
15e40 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45  ILE.  {.    FILE
15e50 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76   *out = fopen("v
15e60 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22  dbe_profile.out"
15e70 2c 20 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20  , "a");.    if( 
15e80 6f 75 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  out ){.      int
15e90 20 69 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   i;.      fprint
15ea0 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b  f(out, "---- ");
15eb0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15ec0 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
15ed0 20 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28          fprintf(
15ee0 6f 75 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e  out, "%02x", p->
15ef0 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a  aOp[i].opcode);.
15f00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70        }.      fp
15f10 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
15f20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a  ;.      if( p->z
15f30 53 71 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Sql ){.        c
15f40 68 61 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20  har c, pc = 0;. 
15f50 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
15f60 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
15f70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
15f80 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30  = p->zSql[i])!=0
15f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
15fa0 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29    if( pc=='\n' )
15fb0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d   fprintf(out, "-
15fc0 2d 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  - ");.          
15fd0 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
15fe0 20 20 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a          pc = c;.
15ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16000 20 20 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29    if( pc!='\n' )
16010 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
16020 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
16030 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
16040 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nOp; i++){.    
16050 20 20 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30      char zHdr[10
16060 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0];.        sqli
16070 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
16080 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c  eof(zHdr), zHdr,
16090 20 22 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c   "%6u %12llu %8l
160a0 6c 75 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  lu ",.          
160b0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a   p->aOp[i].cnt,.
160c0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
160d0 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20  p[i].cycles,.   
160e0 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
160f0 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70  ].cnt>0 ? p->aOp
16100 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f  [i].cycles/p->aO
16110 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20  p[i].cnt : 0.   
16120 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
16130 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  fprintf(out, "%s
16140 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20  ", zHdr);.      
16150 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
16160 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d  ntOp(out, i, &p-
16170 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20  >aOp[i]);.      
16180 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f  }.      fclose(o
16190 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ut);.    }.  }.#
161a0 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72  endif.  p->iCurr
161b0 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70  entTime = 0;.  p
161c0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
161d0 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74  AGIC_INIT;.  ret
161e0 75 72 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e  urn p->rc & db->
161f0 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a  errMask;.}. ./*.
16200 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  ** Clean up and 
16210 64 65 6c 65 74 65 20 61 20 56 44 42 45 20 61 66  delete a VDBE af
16220 74 65 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20  ter execution.  
16230 52 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  Return an intege
16240 72 20 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68  r which is.** th
16250 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20  e result code.  
16260 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20  Write any error 
16270 6d 65 73 73 61 67 65 20 74 65 78 74 20 69 6e 74  message text int
16280 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  o *pzErrMsg..*/.
16290 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 46  int sqlite3VdbeF
162a0 69 6e 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29  inalize(Vdbe *p)
162b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
162c0 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d  ITE_OK;.  if( p-
162d0 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
162e0 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67  IC_RUN || p->mag
162f0 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48  ic==VDBE_MAGIC_H
16300 41 4c 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ALT ){.    rc = 
16310 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 65 74  sqlite3VdbeReset
16320 28 70 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  (p);.    assert(
16330 20 28 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72   (rc & p->db->er
16340 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20  rMask)==rc );.  
16350 7d 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  }.  sqlite3VdbeD
16360 65 6c 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75  elete(p);.  retu
16370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16380 49 66 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70  If parameter iOp
16390 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65   is less than ze
163a0 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20  ro, then invoke 
163b0 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
163c0 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69  or.** all auxili
163d0 61 72 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72  ary data pointer
163e0 73 20 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68  s currently cach
163f0 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61 73  ed by the VM pas
16400 73 65 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69  sed as.** the fi
16410 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  rst argument..**
16420 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69  .** Or, if iOp i
16430 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  s greater than o
16440 72 20 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c  r equal to zero,
16450 20 74 68 65 6e 20 74 68 65 20 64 65 73 74 72 75   then the destru
16460 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20  ctor is.** only 
16470 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73  invoked for thos
16480 65 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  e auxiliary data
16490 20 70 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65   pointers create
164a0 64 20 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a  d by the user .*
164b0 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b  * function invok
164c0 65 64 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e  ed by the OP_Fun
164d0 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20  ction opcode at 
164e0 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20  instruction iOp 
164f0 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c  of .** VM pVdbe,
16500 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69   and only then i
16510 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68  f:.**.**    * th
16520 65 20 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e  e associated fun
16530 63 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ction parameter 
16540 69 73 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c  is the 32nd or l
16550 61 74 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a  ater (counting.*
16560 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74  *      from left
16570 20 74 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a   to right), or.*
16580 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f  *.**    * the co
16590 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
165a0 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b  in argument mask
165b0 20 69 73 20 63 6c 65 61 72 20 28 77 68 65 72 65   is clear (where
165c0 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20   the first.**   
165d0 20 20 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61     function para
165e0 6d 65 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64  meter correspond
165f0 73 20 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29  s to bit 0 etc.)
16600 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16610 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
16620 74 61 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ta(sqlite3 *db, 
16630 41 75 78 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e  AuxData **pp, in
16640 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
16650 7b 0a 20 20 77 68 69 6c 65 28 20 2a 70 70 20 29  {.  while( *pp )
16660 7b 0a 20 20 20 20 41 75 78 44 61 74 61 20 2a 70  {.    AuxData *p
16670 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69  Aux = *pp;.    i
16680 66 28 20 28 69 4f 70 3c 30 29 0a 20 20 20 20 20  f( (iOp<0).     
16690 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69  || (pAux->iOp==i
166a0 4f 70 20 26 26 20 28 70 41 75 78 2d 3e 69 41 72  Op && (pAux->iAr
166b0 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26  g>31 || !(mask &
166c0 20 4d 41 53 4b 42 49 54 33 32 28 70 41 75 78 2d   MASKBIT32(pAux-
166d0 3e 69 41 72 67 29 29 29 29 0a 20 20 20 20 29 7b  >iArg)))).    ){
166e0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
166f0 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20   pAux->iArg==31 
16700 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 75  );.      if( pAu
16710 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b 0a 20 20  x->xDelete ){.  
16720 20 20 20 20 20 20 70 41 75 78 2d 3e 78 44 65 6c        pAux->xDel
16730 65 74 65 28 70 41 75 78 2d 3e 70 41 75 78 29 3b  ete(pAux->pAux);
16740 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
16750 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74  pp = pAux->pNext
16760 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
16770 62 46 72 65 65 28 64 62 2c 20 70 41 75 78 29 3b  bFree(db, pAux);
16780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16790 20 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65    pp= &pAux->pNe
167a0 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  xt;.    }.  }.}.
167b0 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20  ./*.** Free all 
167c0 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
167d0 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20  d with the Vdbe 
167e0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65  passed as the se
167f0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a  cond argument,.*
16800 2a 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a  * except for obj
16810 65 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63  ect itself, whic
16820 68 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a  h is preserved..
16830 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
16840 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
16850 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73  s function and s
16860 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16870 28 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64  () is that.** Vd
16880 62 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20  beDelete() also 
16890 75 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65  unlinks the Vdbe
168a0 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
168b0 66 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64  f VMs associated
168c0 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74   with.** the dat
168d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
168e0 20 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f   and frees the o
168f0 62 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f  bject itself..*/
16900 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16910 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c  eClearObject(sql
16920 69 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a  ite3 *db, Vdbe *
16930 70 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d  p){.  SubProgram
16940 20 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a   *pSub, *pNext;.
16950 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
16960 74 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70  t( p->db==0 || p
16970 2d 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65  ->db==db );.  re
16980 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d  leaseMemArray(p-
16990 3e 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b  >aVar, p->nVar);
169a0 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
169b0 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20  ay(p->aColName, 
169c0 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f  p->nResColumn*CO
169d0 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28  LNAME_N);.  for(
169e0 70 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d  pSub=p->pProgram
169f0 3b 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65  ; pSub; pSub=pNe
16a00 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
16a10 20 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSub->pNext;.  
16a20 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61    vdbeFreeOpArra
16a30 79 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c  y(db, pSub->aOp,
16a40 20 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20   pSub->nOp);.   
16a50 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16a60 62 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20  b, pSub);.  }.  
16a70 66 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31  for(i=p->nzVar-1
16a80 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c  ; i>=0; i--) sql
16a90 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16aa0 2d 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 73  ->azVar[i]);.  s
16ab0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
16ac0 20 70 2d 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64   p->azVar);.  vd
16ad0 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
16ae0 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
16af0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16b00 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
16b10 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
16b20 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
16b30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
16b40 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
16b50 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
16b60 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
16b70 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30  STATUS.  for(i=0
16b80 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
16b90 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
16ba0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
16bb0 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
16bc0 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
16bd0 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b  e(db, p->aScan);
16be0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
16bf0 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
16c00 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
16c10 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16c20 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
16c30 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
16c40 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
16c50 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
16c60 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
16c70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16c80 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
16c90 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
16ca0 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
16cb0 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
16cc0 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
16cd0 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
16ce0 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
16cf0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
16d00 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
16d10 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
16d20 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
16d30 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
16d40 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
16d50 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
16d60 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
16d70 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
16d80 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
16d90 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
16da0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
16db0 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
16dc0 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
16dd0 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
16de0 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
16df0 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
16e00 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
16e10 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
16e20 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
16e30 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
16e40 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
16e50 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
16e60 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
16e70 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
16e80 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
16e90 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
16ea0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
16eb0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
16ec0 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
16ed0 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
16ee0 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
16ef0 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
16f00 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
16f10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65  ;.  assert( p->e
16f20 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
16f30 5f 42 54 52 45 45 20 29 3b 0a 20 20 72 63 20 3d  _BTREE );.  rc =
16f40 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
16f50 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75  etoUnpacked(p->u
16f60 63 2e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  c.pCursor, 0, p-
16f70 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
16f80 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
16f90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
16fa0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
16fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
16fc0 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
16fd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
16fe0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
16ff0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
17000 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
17010 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
17020 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
17030 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
17040 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17050 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
17060 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
17070 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
17080 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
17090 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
170a0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
170b0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
170c0 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
170d0 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
170e0 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
170f0 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
17100 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
17110 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
17120 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
17130 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
17140 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
17150 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
17160 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
17170 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
17180 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
17190 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
171a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
171b0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
171c0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
171d0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
171e0 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
171f0 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
17200 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
17210 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
17220 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 75 63  .  assert( p->uc
17230 2e 70 43 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20  .pCursor!=0 );. 
17240 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
17250 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
17260 76 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ved(p->uc.pCurso
17270 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  r) );.  rc = sql
17280 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 52  ite3BtreeCursorR
17290 65 73 74 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75  estore(p->uc.pCu
172a0 72 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65  rsor, &isDiffere
172b0 6e 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63  ntRow);.  p->cac
172c0 68 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45  heStatus = CACHE
172d0 5f 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73  _STALE;.  if( is
172e0 44 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70  DifferentRow ) p
172f0 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20  ->nullRow = 1;. 
17300 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17310 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e  *.** Check to en
17320 73 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75  sure that the cu
17330 72 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20  rsor is valid.  
17340 52 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73  Restore the curs
17350 6f 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65  or.** if need be
17360 2e 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f  .  Return any I/
17370 4f 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65  O error from the
17380 20 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69   restore operati
17390 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
173a0 65 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74  e3VdbeCursorRest
173b0 6f 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a  ore(VdbeCursor *
173c0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
173d0 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59  >eCurType==CURTY
173e0 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20 69 66  PE_BTREE );.  if
173f0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
17400 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e  rsorHasMoved(p->
17410 75 63 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20  uc.pCursor) ){. 
17420 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
17430 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
17440 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
17450 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
17460 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 63   Make sure the c
17470 75 72 73 6f 72 20 70 20 69 73 20 72 65 61 64 79  ursor p is ready
17480 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
17490 65 20 74 68 65 20 72 6f 77 20 74 6f 20 77 68 69  e the row to whi
174a0 63 68 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73  ch it.** was las
174b0 74 20 70 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52  t positioned.  R
174c0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
174d0 6f 64 65 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61  ode if an OOM fa
174e0 75 6c 74 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72  ult or I/O error
174f0 0a 2a 2a 20 70 72 65 76 65 6e 74 73 20 75 73 20  .** prevents us 
17500 66 72 6f 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67  from positioning
17510 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 69   the cursor to i
17520 74 73 20 63 6f 72 72 65 63 74 20 70 6f 73 69 74  ts correct posit
17530 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ion..**.** If a 
17540 4d 6f 76 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e  MoveTo operation
17550 20 69 73 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74   is pending on t
17560 68 65 20 67 69 76 65 6e 20 63 75 72 73 6f 72 2c  he given cursor,
17570 20 74 68 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a   then do that.**
17580 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66   MoveTo now.  If
17590 20 6e 6f 20 6d 6f 76 65 20 69 73 20 70 65 6e 64   no move is pend
175a0 69 6e 67 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ing, check to se
175b0 65 20 69 66 20 74 68 65 20 72 6f 77 20 68 61 73  e if the row has
175c0 20 62 65 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64   been.** deleted
175d0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
175e0 74 68 65 20 63 75 72 73 6f 72 20 61 6e 64 20 69  the cursor and i
175f0 66 20 69 74 20 68 61 73 2c 20 6d 61 72 6b 20 74  f it has, mark t
17600 68 65 20 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e  he row as.** a N
17610 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49  ULL row..**.** I
17620 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
17630 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
17640 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
17650 72 6f 77 20 61 6e 64 20 74 68 61 74 20 72 6f 77  row and that row
17660 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e   has.** not been
17670 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f   deleted out fro
17680 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72 73  m under the curs
17690 6f 72 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  or, then this ro
176a0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
176b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
176c0 56 64 62 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f  VdbeCursorMoveto
176d0 28 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 70 70  (VdbeCursor **pp
176e0 2c 20 69 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20  , int *piCol){. 
176f0 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 20 3d   VdbeCursor *p =
17700 20 2a 70 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65   *pp;.  if( p->e
17710 43 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45  CurType==CURTYPE
17720 5f 42 54 52 45 45 20 29 7b 0a 20 20 20 20 69 66  _BTREE ){.    if
17730 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
17740 65 74 6f 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  eto ){.      int
17750 20 69 4d 61 70 3b 0a 20 20 20 20 20 20 69 66 28   iMap;.      if(
17760 20 70 2d 3e 61 41 6c 74 4d 61 70 20 26 26 20 28   p->aAltMap && (
17770 69 4d 61 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61  iMap = p->aAltMa
17780 70 5b 31 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29  p[1+*piCol])>0 )
17790 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
177a0 70 2d 3e 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20  p->pAltCursor;. 
177b0 20 20 20 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20         *piCol = 
177c0 69 4d 61 70 20 2d 20 31 3b 0a 20 20 20 20 20 20  iMap - 1;.      
177d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
177e0 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
177f0 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 44    return handleD
17800 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 70 29  eferredMoveto(p)
17810 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
17820 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
17830 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63  orHasMoved(p->uc
17840 2e 70 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20  .pCursor) ){.   
17850 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c 65     return handle
17860 4d 6f 76 65 64 43 75 72 73 6f 72 28 70 29 3b 0a  MovedCursor(p);.
17870 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17880 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17890 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
178a0 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a  wing functions:.
178b0 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  **.** sqlite3Vdb
178c0 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a  eSerialType().**
178d0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
178e0 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73  alTypeLen().** s
178f0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17900 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Len().** sqlite3
17910 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29 0a  VdbeSerialPut().
17920 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17930 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20  rialGet().**.** 
17940 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65 20  encapsulate the 
17950 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61 6c  code that serial
17960 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72 20  izes values for 
17970 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69 74  storage in SQLit
17980 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69 6e  e.** data and in
17990 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61 63  dex records. Eac
179a0 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61 6c  h serialized val
179b0 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ue consists of a
179c0 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70 65  .** 'serial-type
179d0 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20  ' and a blob of 
179e0 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61 6c  data. The serial
179f0 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62 79   type is an 8-by
17a00 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69  te unsigned.** i
17a10 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20 61  nteger, stored a
17a20 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a  s a varint..**.*
17a30 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20 69  * In an SQLite i
17a40 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68 65  ndex record, the
17a50 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20   serial type is 
17a60 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79 20  stored directly 
17a70 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c  before.** the bl
17a80 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74 20  ob of data that 
17a90 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  it corresponds t
17aa0 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72 65  o. In a table re
17ab0 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c  cord, all serial
17ac0 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73 74  .** types are st
17ad0 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61 72  ored at the star
17ae0 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 2c  t of the record,
17af0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20 6f   and the blobs o
17b00 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68 65  f data at.** the
17b10 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65 73   end. Hence thes
17b20 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f  e functions allo
17b30 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  w the caller to 
17b40 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65  handle the.** se
17b50 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64 61  rial-type and da
17b60 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74 65  ta blob separate
17b70 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  ly..**.** The fo
17b80 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
17b90 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72 69  scribes the vari
17ba0 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61 73  ous storage clas
17bb0 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a  ses for data:.**
17bc0 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79 70  .**   serial typ
17bd0 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20 6f  e        bytes o
17be0 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70 65  f data      type
17bf0 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .**   ----------
17c00 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
17c10 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d  --------    ----
17c20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20  -----------.**  
17c30 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
17c40 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17c50 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20         NULL.**  
17c60 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
17c70 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
17c80 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17c90 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32 20  teger.**      2 
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17cb0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
17cc0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17cd0 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20 20  **      3       
17ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33 20                3 
17cf0 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17d00 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17d10 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20 20    4             
17d20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20 20          4       
17d30 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17d40 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20 20  ger.**      5   
17d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d60 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20 73    6            s
17d70 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17d80 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20 20        6         
17d90 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
17da0 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20           signed 
17db0 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20  integer.**      
17dc0 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  7               
17dd0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
17de0 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a     IEEE float.**
17df0 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20 20        8         
17e00 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
17e10 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72           Integer
17e20 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20   constant 0.**  
17e30 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20 20      9           
17e40 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
17e50 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63         Integer c
17e60 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20  onstant 1.**    
17e70 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20 20   10,11          
17e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e90 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66 6f       reserved fo
17ea0 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20  r expansion.**  
17eb0 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e    N>=12 and even
17ec0 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32 20         (N-12)/2 
17ed0 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20         BLOB.**  
17ee0 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20    N>=13 and odd 
17ef0 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32 20         (N-13)/2 
17f00 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a         text.**.*
17f10 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74 79  * The 8 and 9 ty
17f20 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20 69  pes were added i
17f30 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f  n 3.3.0, file fo
17f40 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20 76  rmat 4.  Prior v
17f50 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51  ersions.** of SQ
17f60 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e  Lite will not un
17f70 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20 73  derstand those s
17f80 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a  erial types..*/.
17f90 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
17fa0 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66 6f  e serial-type fo
17fb0 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f 72  r the value stor
17fc0 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75  ed in pMem..*/.u
17fd0 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  32 sqlite3VdbeSe
17fe0 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d  rialType(Mem *pM
17ff0 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72  em, int file_for
18000 6d 61 74 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b  mat, u32 *pLen){
18010 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70  .  int flags = p
18020 4d 65 6d 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33  Mem->flags;.  u3
18030 32 20 6e 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  2 n;..  assert( 
18040 70 4c 65 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28  pLen!=0 );.  if(
18050 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20   flags&MEM_Null 
18060 29 7b 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30  ){.    *pLen = 0
18070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
18080 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26    }.  if( flags&
18090 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f  MEM_Int ){.    /
180a0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 65  * Figure out whe
180b0 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c 20 32  ther to use 1, 2
180c0 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79 74 65  , 4, 6 or 8 byte
180d0 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65  s. */.#   define
180e0 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28 28 69   MAX_6BYTE ((((i
180f0 36 34 29 30 78 30 30 30 30 38 30 30 30 29 3c 3c  64)0x00008000)<<
18100 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34 20 69  32)-1).    i64 i
18110 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
18120 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69 66 28    u64 u;.    if(
18130 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 20   i<0 ){.      u 
18140 3d 20 7e 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = ~i;.    }else{
18150 0a 20 20 20 20 20 20 75 20 3d 20 69 3b 0a 20 20  .      u = i;.  
18160 20 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 31    }.    if( u<=1
18170 32 37 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  27 ){.      if( 
18180 28 69 26 31 29 3d 3d 69 20 26 26 20 66 69 6c 65  (i&1)==i && file
18190 5f 66 6f 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20  _format>=4 ){.  
181a0 20 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b        *pLen = 0;
181b0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
181c0 38 2b 28 75 33 32 29 75 3b 0a 20 20 20 20 20 20  8+(u32)u;.      
181d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2a  }else{.        *
181e0 70 4c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  pLen = 1;.      
181f0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
18200 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
18210 28 20 75 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70  ( u<=32767 ){ *p
18220 4c 65 6e 20 3d 20 32 3b 20 72 65 74 75 72 6e 20  Len = 2; return 
18230 32 3b 20 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d  2; }.    if( u<=
18240 38 33 38 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e  8388607 ){ *pLen
18250 20 3d 20 33 3b 20 72 65 74 75 72 6e 20 33 3b 20   = 3; return 3; 
18260 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 32 31 34  }.    if( u<=214
18270 37 34 38 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e  7483647 ){ *pLen
18280 20 3d 20 34 3b 20 72 65 74 75 72 6e 20 34 3b 20   = 4; return 4; 
18290 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 4d 41 58  }.    if( u<=MAX
182a0 5f 36 42 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20  _6BYTE ){ *pLen 
182b0 3d 20 36 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d  = 6; return 5; }
182c0 0a 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a  .    *pLen = 8;.
182d0 20 20 20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20      return 6;.  
182e0 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45  }.  if( flags&ME
182f0 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70  M_Real ){.    *p
18300 4c 65 6e 20 3d 20 38 3b 0a 20 20 20 20 72 65 74  Len = 8;.    ret
18310 75 72 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73  urn 7;.  }.  ass
18320 65 72 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d  ert( pMem->db->m
18330 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66  allocFailed || f
18340 6c 61 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45  lags&(MEM_Str|ME
18350 4d 5f 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73  M_Blob) );.  ass
18360 65 72 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20  ert( pMem->n>=0 
18370 29 3b 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d  );.  n = (u32)pM
18380 65 6d 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61  em->n;.  if( fla
18390 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b  gs & MEM_Zero ){
183a0 0a 20 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e  .    n += pMem->
183b0 75 2e 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a  u.nZero;.  }.  *
183c0 70 4c 65 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75  pLen = n;.  retu
183d0 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
183e0 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
183f0 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
18400 20 54 68 65 20 73 69 7a 65 73 20 66 6f 72 20 73   The sizes for s
18410 65 72 69 61 6c 20 74 79 70 65 73 20 6c 65 73 73  erial types less
18420 20 74 68 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61   than 128.*/.sta
18430 74 69 63 20 63 6f 6e 73 74 20 75 38 20 73 71 6c  tic const u8 sql
18440 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
18450 65 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  es[] = {.       
18460 20 2f 2a 20 20 30 20 20 20 31 20 20 20 32 20 20   /*  0   1   2  
18470 20 33 20 20 20 34 20 20 20 35 20 20 20 36 20 20   3   4   5   6  
18480 20 37 20 20 20 38 20 20 20 39 20 2a 2f 20 20 20   7   8   9 */   
18490 0a 2f 2a 20 20 20 30 20 2a 2f 20 20 20 30 2c 20  ./*   0 */   0, 
184a0 20 31 2c 20 20 32 2c 20 20 33 2c 20 20 34 2c 20   1,  2,  3,  4, 
184b0 20 36 2c 20 20 38 2c 20 20 38 2c 20 20 30 2c 20   6,  8,  8,  0, 
184c0 20 30 2c 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20   0,./*  10 */   
184d0 30 2c 20 20 30 2c 20 20 30 2c 20 20 30 2c 20 20  0,  0,  0,  0,  
184e0 31 2c 20 20 31 2c 20 20 32 2c 20 20 32 2c 20 20  1,  1,  2,  2,  
184f0 33 2c 20 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f  3,  3,./*  20 */
18500 20 20 20 34 2c 20 20 34 2c 20 20 35 2c 20 20 35     4,  4,  5,  5
18510 2c 20 20 36 2c 20 20 36 2c 20 20 37 2c 20 20 37  ,  6,  6,  7,  7
18520 2c 20 20 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30  ,  8,  8,./*  30
18530 20 2a 2f 20 20 20 39 2c 20 20 39 2c 20 31 30 2c   */   9,  9, 10,
18540 20 31 30 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c   10, 11, 11, 12,
18550 20 31 32 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20   12, 13, 13,./* 
18560 20 34 30 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20   40 */  14, 14, 
18570 31 35 2c 20 31 35 2c 20 31 36 2c 20 31 36 2c 20  15, 15, 16, 16, 
18580 31 37 2c 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a  17, 17, 18, 18,.
18590 2f 2a 20 20 35 30 20 2a 2f 20 20 31 39 2c 20 31  /*  50 */  19, 1
185a0 39 2c 20 32 30 2c 20 32 30 2c 20 32 31 2c 20 32  9, 20, 20, 21, 2
185b0 31 2c 20 32 32 2c 20 32 32 2c 20 32 33 2c 20 32  1, 22, 22, 23, 2
185c0 33 2c 0a 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34  3,./*  60 */  24
185d0 2c 20 32 34 2c 20 32 35 2c 20 32 35 2c 20 32 36  , 24, 25, 25, 26
185e0 2c 20 32 36 2c 20 32 37 2c 20 32 37 2c 20 32 38  , 26, 27, 27, 28
185f0 2c 20 32 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20  , 28,./*  70 */ 
18600 20 32 39 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c   29, 29, 30, 30,
18610 20 33 31 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c   31, 31, 32, 32,
18620 20 33 33 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20   33, 33,./*  80 
18630 2a 2f 20 20 33 34 2c 20 33 34 2c 20 33 35 2c 20  */  34, 34, 35, 
18640 33 35 2c 20 33 36 2c 20 33 36 2c 20 33 37 2c 20  35, 36, 36, 37, 
18650 33 37 2c 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20  37, 38, 38,./*  
18660 39 30 20 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34  90 */  39, 39, 4
18670 30 2c 20 34 30 2c 20 34 31 2c 20 34 31 2c 20 34  0, 40, 41, 41, 4
18680 32 2c 20 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f  2, 42, 43, 43,./
18690 2a 20 31 30 30 20 2a 2f 20 20 34 34 2c 20 34 34  * 100 */  44, 44
186a0 2c 20 34 35 2c 20 34 35 2c 20 34 36 2c 20 34 36  , 45, 45, 46, 46
186b0 2c 20 34 37 2c 20 34 37 2c 20 34 38 2c 20 34 38  , 47, 47, 48, 48
186c0 2c 0a 2f 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c  ,./* 110 */  49,
186d0 20 34 39 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c   49, 50, 50, 51,
186e0 20 35 31 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c   51, 52, 52, 53,
186f0 20 35 33 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20   53,./* 120 */  
18700 35 34 2c 20 35 34 2c 20 35 35 2c 20 35 35 2c 20  54, 54, 55, 55, 
18710 35 36 2c 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d  56, 56, 57, 57.}
18720 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ;../*.** Return 
18730 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
18740 65 20 64 61 74 61 20 63 6f 72 72 65 73 70 6f 6e  e data correspon
18750 64 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70  ding to the supp
18760 6c 69 65 64 20 73 65 72 69 61 6c 2d 74 79 70 65  lied serial-type
18770 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
18780 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65  VdbeSerialTypeLe
18790 6e 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70  n(u32 serial_typ
187a0 65 29 7b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e){.  if( serial
187b0 5f 74 79 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20  _type>=128 ){.  
187c0 20 20 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c    return (serial
187d0 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d  _type-12)/2;.  }
187e0 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
187f0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
18800 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
18810 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
18820 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
18830 70 65 5d 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70  pe]==(serial_typ
18840 65 20 2d 20 31 32 29 2f 32 20 29 3b 0a 20 20 20  e - 12)/2 );.   
18850 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 53   return sqlite3S
18860 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65  mallTypeSizes[se
18870 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a  rial_type];.  }.
18880 7d 0a 75 38 20 73 71 6c 69 74 65 33 56 64 62 65  }.u8 sqlite3Vdbe
18890 4f 6e 65 42 79 74 65 53 65 72 69 61 6c 54 79 70  OneByteSerialTyp
188a0 65 4c 65 6e 28 75 38 20 73 65 72 69 61 6c 5f 74  eLen(u8 serial_t
188b0 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
188c0 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 38 20  serial_type<128 
188d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
188e0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
188f0 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20  s[serial_type]; 
18900 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65   .}../*.** If we
18910 20 61 72 65 20 6f 6e 20 61 6e 20 61 72 63 68 69   are on an archi
18920 74 65 63 74 75 72 65 20 77 69 74 68 20 6d 69 78  tecture with mix
18930 65 64 2d 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69  ed-endian floati
18940 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65  ng .** points (e
18950 78 3a 20 41 52 4d 37 29 20 74 68 65 6e 20 73 77  x: ARM7) then sw
18960 61 70 20 74 68 65 20 6c 6f 77 65 72 20 34 20 62  ap the lower 4 b
18970 79 74 65 73 20 77 69 74 68 20 74 68 65 20 0a 2a  ytes with the .*
18980 2a 20 75 70 70 65 72 20 34 20 62 79 74 65 73 2e  * upper 4 bytes.
18990 20 20 52 65 74 75 72 6e 20 74 68 65 20 72 65 73    Return the res
189a0 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d  ult..**.** For m
189b0 6f 73 74 20 61 72 63 68 69 74 65 63 74 75 72 65  ost architecture
189c0 73 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  s, this is a no-
189d0 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72  op..**.** (later
189e0 29 3a 20 20 49 74 20 69 73 20 72 65 70 6f 72 74  ):  It is report
189f0 65 64 20 74 6f 20 6d 65 20 74 68 61 74 20 74 68  ed to me that th
18a00 65 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 70  e mixed-endian p
18a10 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d  roblem.** on ARM
18a20 37 20 69 73 20 61 6e 20 69 73 73 75 65 20 77 69  7 is an issue wi
18a30 74 68 20 47 43 43 2c 20 6e 6f 74 20 77 69 74 68  th GCC, not with
18a40 20 74 68 65 20 41 52 4d 37 20 63 68 69 70 2e 20   the ARM7 chip. 
18a50 20 49 74 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61   It seems.** tha
18a60 74 20 65 61 72 6c 79 20 76 65 72 73 69 6f 6e 73  t early versions
18a70 20 6f 66 20 47 43 43 20 73 74 6f 72 65 64 20 74   of GCC stored t
18a80 68 65 20 74 77 6f 20 77 6f 72 64 73 20 6f 66 20  he two words of 
18a90 61 20 36 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61  a 64-bit.** floa
18aa0 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f  t in the wrong o
18ab0 72 64 65 72 2e 20 20 41 6e 64 20 74 68 61 74 20  rder.  And that 
18ac0 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20 70  error has been p
18ad0 72 6f 70 61 67 61 74 65 64 0a 2a 2a 20 65 76 65  ropagated.** eve
18ae0 72 20 73 69 6e 63 65 2e 20 20 54 68 65 20 62 6c  r since.  The bl
18af0 61 6d 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73  ame is not neces
18b00 73 61 72 69 6c 79 20 77 69 74 68 20 47 43 43 2c  sarily with GCC,
18b10 20 74 68 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20   though..** GCC 
18b20 6d 69 67 68 74 20 68 61 76 65 20 6a 75 73 74 20  might have just 
18b30 63 6f 70 79 69 6e 67 20 74 68 65 20 70 72 6f 62  copying the prob
18b40 6c 65 6d 20 66 72 6f 6d 20 61 20 70 72 69 6f 72  lem from a prior
18b50 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20   compiler..** I 
18b60 61 6d 20 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61  am also told tha
18b70 74 20 6e 65 77 65 72 20 76 65 72 73 69 6f 6e 73  t newer versions
18b80 20 6f 66 20 47 43 43 20 74 68 61 74 20 66 6f 6c   of GCC that fol
18b90 6c 6f 77 20 61 20 64 69 66 66 65 72 65 6e 74 0a  low a different.
18ba0 2a 2a 20 41 42 49 20 67 65 74 20 74 68 65 20 62  ** ABI get the b
18bb0 79 74 65 20 6f 72 64 65 72 20 72 69 67 68 74 2e  yte order right.
18bc0 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72  .**.** Developer
18bd0 73 20 75 73 69 6e 67 20 53 51 4c 69 74 65 20 6f  s using SQLite o
18be0 6e 20 61 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64  n an ARM7 should
18bf0 20 63 6f 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e   compile and run
18c00 20 74 68 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63   their.** applic
18c10 61 74 69 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51  ation using -DSQ
18c20 4c 49 54 45 5f 44 45 42 55 47 3d 31 20 61 74 20  LITE_DEBUG=1 at 
18c30 6c 65 61 73 74 20 6f 6e 63 65 2e 20 20 57 69 74  least once.  Wit
18c40 68 20 44 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c  h DEBUG.** enabl
18c50 65 64 2c 20 73 6f 6d 65 20 61 73 73 65 72 74 73  ed, some asserts
18c60 20 62 65 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75   below will ensu
18c70 72 65 20 74 68 61 74 20 74 68 65 20 62 79 74 65  re that the byte
18c80 20 6f 72 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f   order of.** flo
18c90 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
18ca0 65 73 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a  es is correct..*
18cb0 2a 0a 2a 2a 20 28 32 30 30 37 2d 30 38 2d 33 30  *.** (2007-08-30
18cc0 29 20 20 46 72 61 6e 6b 20 76 61 6e 20 56 75 67  )  Frank van Vug
18cd0 74 20 68 61 73 20 73 74 75 64 69 65 64 20 74 68  t has studied th
18ce0 69 73 20 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65  is problem close
18cf0 6c 79 0a 2a 2a 20 61 6e 64 20 68 61 73 20 73 65  ly.** and has se
18d00 6e 64 20 68 69 73 20 66 69 6e 64 69 6e 67 73 20  nd his findings 
18d10 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 64 65  to the SQLite de
18d20 76 65 6c 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b  velopers.  Frank
18d30 0a 2a 2a 20 77 72 69 74 65 73 20 74 68 61 74 20  .** writes that 
18d40 73 6f 6d 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65  some Linux kerne
18d50 6c 73 20 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e  ls offer floatin
18d60 67 20 70 6f 69 6e 74 20 68 61 72 64 77 61 72 65  g point hardware
18d70 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68  .** emulation th
18d80 61 74 20 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d  at uses only 32-
18d90 62 69 74 20 6d 61 6e 74 69 73 73 61 73 20 69 6e  bit mantissas in
18da0 73 74 65 61 64 20 6f 66 20 61 20 66 75 6c 6c 20  stead of a full 
18db0 0a 2a 2a 20 34 38 2d 62 69 74 73 20 61 73 20 72  .** 48-bits as r
18dc0 65 71 75 69 72 65 64 20 62 79 20 74 68 65 20 49  equired by the I
18dd0 45 45 45 20 73 74 61 6e 64 61 72 64 2e 20 20 28  EEE standard.  (
18de0 54 68 69 73 20 69 73 20 74 68 65 0a 2a 2a 20 43  This is the.** C
18df0 4f 4e 46 49 47 5f 46 50 45 5f 46 41 53 54 46 50  ONFIG_FPE_FASTFP
18e00 45 20 6f 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73  E option.)  On s
18e10 75 63 68 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f  uch systems, flo
18e20 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62  ating point.** b
18e30 79 74 65 20 73 77 61 70 70 69 6e 67 20 62 65 63  yte swapping bec
18e40 6f 6d 65 73 20 76 65 72 79 20 63 6f 6d 70 6c 69  omes very compli
18e50 63 61 74 65 64 2e 20 20 54 6f 20 61 76 6f 69 64  cated.  To avoid
18e60 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68   problems,.** th
18e70 65 20 6e 65 63 65 73 73 61 72 79 20 62 79 74 65  e necessary byte
18e80 20 73 77 61 70 70 69 6e 67 20 69 73 20 63 61 72   swapping is car
18e90 72 69 65 64 20 6f 75 74 20 75 73 69 6e 67 20 61  ried out using a
18ea0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 0a   64-bit integer.
18eb0 2a 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 61  ** rather than a
18ec0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20   64-bit float.  
18ed0 46 72 61 6e 6b 20 61 73 73 75 72 65 73 20 75 73  Frank assures us
18ee0 20 74 68 61 74 20 74 68 65 20 63 6f 64 65 20 68   that the code h
18ef0 65 72 65 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72  ere.** works for
18f00 20 68 69 6d 2e 20 20 57 65 2c 20 74 68 65 20 64   him.  We, the d
18f10 65 76 65 6c 6f 70 65 72 73 2c 20 68 61 76 65 20  evelopers, have 
18f20 6e 6f 20 77 61 79 20 74 6f 20 69 6e 64 65 70 65  no way to indepe
18f30 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66  ndently.** verif
18f40 79 20 74 68 69 73 2c 20 62 75 74 20 46 72 61 6e  y this, but Fran
18f50 6b 20 73 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20  k seems to know 
18f60 77 68 61 74 20 68 65 20 69 73 20 74 61 6c 6b 69  what he is talki
18f70 6e 67 20 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77  ng about.** so w
18f80 65 20 74 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a  e trust him..*/.
18f90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d 49  #ifdef SQLITE_MI
18fa0 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54  XED_ENDIAN_64BIT
18fb0 5f 46 4c 4f 41 54 0a 73 74 61 74 69 63 20 75 36  _FLOAT.static u6
18fc0 34 20 66 6c 6f 61 74 53 77 61 70 28 75 36 34 20  4 floatSwap(u64 
18fd0 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20  in){.  union {. 
18fe0 20 20 20 75 36 34 20 72 3b 0a 20 20 20 20 75 33     u64 r;.    u3
18ff0 32 20 69 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20  2 i[2];.  } u;. 
19000 20 75 33 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d   u32 t;..  u.r =
19010 20 69 6e 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30   in;.  t = u.i[0
19020 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e  ];.  u.i[0] = u.
19030 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d  i[1];.  u.i[1] =
19040 20 74 3b 0a 20 20 72 65 74 75 72 6e 20 75 2e 72   t;.  return u.r
19050 3b 0a 7d 0a 23 20 64 65 66 69 6e 65 20 73 77 61  ;.}.# define swa
19060 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
19070 74 28 58 29 20 20 58 20 3d 20 66 6c 6f 61 74 53  t(X)  X = floatS
19080 77 61 70 28 58 29 0a 23 65 6c 73 65 0a 23 20 64  wap(X).#else.# d
19090 65 66 69 6e 65 20 73 77 61 70 4d 69 78 65 64 45  efine swapMixedE
190a0 6e 64 69 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65  ndianFloat(X).#e
190b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ndif../*.** Writ
190c0 65 20 74 68 65 20 73 65 72 69 61 6c 69 7a 65 64  e the serialized
190d0 20 64 61 74 61 20 62 6c 6f 62 20 66 6f 72 20 74   data blob for t
190e0 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
190f0 69 6e 20 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a  in pMem into .**
19100 20 62 75 66 2e 20 49 74 20 69 73 20 61 73 73 75   buf. It is assu
19110 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61 6c  med that the cal
19120 6c 65 72 20 68 61 73 20 61 6c 6c 6f 63 61 74 65  ler has allocate
19130 64 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  d sufficient spa
19140 63 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ce..** Return th
19150 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
19160 73 20 77 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a  s written..**.**
19170 20 6e 42 75 66 20 69 73 20 74 68 65 20 61 6d 6f   nBuf is the amo
19180 75 6e 74 20 6f 66 20 73 70 61 63 65 20 6c 65 66  unt of space lef
19190 74 20 69 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65  t in buf[].  The
191a0 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
191b0 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c  nsible.** for al
191c0 6c 6f 63 61 74 69 6e 67 20 65 6e 6f 75 67 68 20  locating enough 
191d0 73 70 61 63 65 20 74 6f 20 62 75 66 5b 5d 20 74  space to buf[] t
191e0 6f 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 69 72  o hold the entir
191f0 65 20 66 69 65 6c 64 2c 20 65 78 63 6c 75 73 69  e field, exclusi
19200 76 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65  ve.** of the pMe
19210 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73  m->u.nZero bytes
19220 20 66 6f 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20   for a MEM_Zero 
19230 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  value..**.** Ret
19240 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
19250 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79  f bytes actually
19260 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 62 75   written into bu
19270 66 5b 5d 2e 20 20 54 68 65 20 6e 75 6d 62 65 72  f[].  The number
19280 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 69 6e 20  .** of bytes in 
19290 74 68 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20  the zero-filled 
192a0 74 61 69 6c 20 69 73 20 69 6e 63 6c 75 64 65 64  tail is included
192b0 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76   in the return v
192c0 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20  alue only.** if 
192d0 74 68 6f 73 65 20 62 79 74 65 73 20 77 65 72 65  those bytes were
192e0 20 7a 65 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d   zeroed in buf[]
192f0 2e 0a 2a 2f 20 0a 75 33 32 20 73 71 6c 69 74 65  ..*/ .u32 sqlite
19300 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 75  3VdbeSerialPut(u
19310 38 20 2a 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65  8 *buf, Mem *pMe
19320 6d 2c 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  m, u32 serial_ty
19330 70 65 29 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a  pe){.  u32 len;.
19340 0a 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e  .  /* Integer an
19350 64 20 52 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20  d Real */.  if( 
19360 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26  serial_type<=7 &
19370 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 30 20  & serial_type>0 
19380 29 7b 0a 20 20 20 20 75 36 34 20 76 3b 0a 20 20  ){.    u64 v;.  
19390 20 20 75 33 32 20 69 3b 0a 20 20 20 20 69 66 28    u32 i;.    if(
193a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20   serial_type==7 
193b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
193c0 20 73 69 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65   sizeof(v)==size
193d0 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b  of(pMem->u.r) );
193e0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
193f0 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69  , &pMem->u.r, si
19400 7a 65 6f 66 28 76 29 29 3b 0a 20 20 20 20 20 20  zeof(v));.      
19410 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19420 6c 6f 61 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c  loat(v);.    }el
19430 73 65 7b 0a 20 20 20 20 20 20 76 20 3d 20 70 4d  se{.      v = pM
19440 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20  em->u.i;.    }. 
19450 20 20 20 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c     len = i = sql
19460 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
19470 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
19480 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30  .    assert( i>0
19490 20 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20   );.    do{.    
194a0 20 20 62 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38    buf[--i] = (u8
194b0 29 28 76 26 30 78 46 46 29 3b 0a 20 20 20 20 20  )(v&0xFF);.     
194c0 20 76 20 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77   v >>= 8;.    }w
194d0 68 69 6c 65 28 20 69 20 29 3b 0a 20 20 20 20 72  hile( i );.    r
194e0 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a  eturn len;.  }..
194f0 20 20 2f 2a 20 53 74 72 69 6e 67 20 6f 72 20 62    /* String or b
19500 6c 6f 62 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  lob */.  if( ser
19510 69 61 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a  ial_type>=12 ){.
19520 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
19530 2d 3e 6e 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c  ->n + ((pMem->fl
19540 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f  ags & MEM_Zero)?
19550 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29  pMem->u.nZero:0)
19560 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3d  .             ==
19570 20 28 69 6e 74 29 73 71 6c 69 74 65 33 56 64 62   (int)sqlite3Vdb
19580 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
19590 65 72 69 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20  erial_type) );. 
195a0 20 20 20 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e     len = pMem->n
195b0 3b 0a 20 20 20 20 69 66 28 20 6c 65 6e 3e 30 20  ;.    if( len>0 
195c0 29 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 70 4d  ) memcpy(buf, pM
195d0 65 6d 2d 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20  em->z, len);.   
195e0 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d   return len;.  }
195f0 0a 0a 20 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63  ..  /* NULL or c
19600 6f 6e 73 74 61 6e 74 73 20 30 20 6f 72 20 31 20  onstants 0 or 1 
19610 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
19620 0a 0a 2f 2a 20 49 6e 70 75 74 20 22 78 22 20 69  ../* Input "x" i
19630 73 20 61 20 73 65 71 75 65 6e 63 65 20 6f 66 20  s a sequence of 
19640 75 6e 73 69 67 6e 65 64 20 63 68 61 72 61 63 74  unsigned charact
19650 65 72 73 20 74 68 61 74 20 72 65 70 72 65 73 65  ers that represe
19660 6e 74 20 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69  nt a.** big-endi
19670 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 52 65 74  an integer.  Ret
19680 75 72 6e 20 74 68 65 20 65 71 75 69 76 61 6c 65  urn the equivale
19690 6e 74 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65  nt native intege
196a0 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45  r.*/.#define ONE
196b0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20  _BYTE_INT(x)    
196c0 28 28 69 38 29 28 78 29 5b 30 5d 29 0a 23 64 65  ((i8)(x)[0]).#de
196d0 66 69 6e 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e  fine TWO_BYTE_IN
196e0 54 28 78 29 20 20 20 20 28 32 35 36 2a 28 69 38  T(x)    (256*(i8
196f0 29 28 28 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d  )((x)[0])|(x)[1]
19700 29 0a 23 64 65 66 69 6e 65 20 54 48 52 45 45 5f  ).#define THREE_
19710 42 59 54 45 5f 49 4e 54 28 78 29 20 20 28 36 35  BYTE_INT(x)  (65
19720 35 33 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  536*(i8)((x)[0])
19730 7c 28 28 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29  |((x)[1]<<8)|(x)
19740 5b 32 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55  [2]).#define FOU
19750 52 5f 42 59 54 45 5f 55 49 4e 54 28 78 29 20 20  R_BYTE_UINT(x)  
19760 28 28 28 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32  (((u32)(x)[0]<<2
19770 34 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c  4)|((x)[1]<<16)|
19780 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b  ((x)[2]<<8)|(x)[
19790 33 5d 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52  3]).#define FOUR
197a0 5f 42 59 54 45 5f 49 4e 54 28 78 29 20 28 31 36  _BYTE_INT(x) (16
197b0 37 37 37 32 31 36 2a 28 69 38 29 28 28 78 29 5b  777216*(i8)((x)[
197c0 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29  0])|((x)[1]<<16)
197d0 7c 28 28 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29  |((x)[2]<<8)|(x)
197e0 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65  [3])../*.** Dese
197f0 72 69 61 6c 69 7a 65 20 74 68 65 20 64 61 74 61  rialize the data
19800 20 62 6c 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f   blob pointed to
19810 20 62 79 20 62 75 66 20 61 73 20 73 65 72 69 61   by buf as seria
19820 6c 20 74 79 70 65 20 73 65 72 69 61 6c 5f 74 79  l type serial_ty
19830 70 65 0a 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20  pe.** and store 
19840 74 68 65 20 72 65 73 75 6c 74 20 69 6e 20 70 4d  the result in pM
19850 65 6d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  em.  Return the 
19860 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19870 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  read..**.** This
19880 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
19890 6c 65 6d 65 6e 74 65 64 20 61 73 20 74 77 6f 20  lemented as two 
198a0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
198b0 73 20 66 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63  s for performanc
198c0 65 2e 0a 2a 2a 20 54 68 65 20 66 65 77 20 63 61  e..** The few ca
198d0 73 65 73 20 74 68 61 74 20 72 65 71 75 69 72 65  ses that require
198e0 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73   local variables
198f0 20 61 72 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20   are broken out 
19900 69 6e 74 6f 20 61 20 73 65 70 61 72 61 74 65 0a  into a separate.
19910 2a 2a 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68  ** routine so th
19920 61 74 20 69 6e 20 6d 6f 73 74 20 63 61 73 65 73  at in most cases
19930 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
19940 20 6d 6f 76 69 6e 67 20 74 68 65 20 73 74 61 63   moving the stac
19950 6b 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20  k pointer.** is 
19960 61 76 6f 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61  avoided..*/ .sta
19970 74 69 63 20 75 33 32 20 53 51 4c 49 54 45 5f 4e  tic u32 SQLITE_N
19980 4f 49 4e 4c 49 4e 45 20 73 65 72 69 61 6c 47 65  OINLINE serialGe
19990 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
199a0 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
199b0 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
199c0 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
199d0 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
199e0 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
199f0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
19a00 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
19a10 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
19a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a30 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
19a40 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
19a50 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
19a60 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59 54  u64 x = FOUR_BYT
19a70 45 5f 55 49 4e 54 28 62 75 66 29 3b 0a 20 20 75  E_UINT(buf);.  u
19a80 33 32 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45  32 y = FOUR_BYTE
19a90 5f 55 49 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20  _UINT(buf+4);.  
19aa0 78 20 3d 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b  x = (x<<32) + y;
19ab0 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
19ac0 70 65 3d 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20  pe==6 ){.    /* 
19ad0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32  EVIDENCE-OF: R-2
19ae0 39 38 35 31 2d 35 32 32 37 32 20 56 61 6c 75 65  9851-52272 Value
19af0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19b00 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74   64-bit.    ** t
19b10 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
19b20 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70  nteger. */.    p
19b30 4d 65 6d 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34  Mem->u.i = *(i64
19b40 2a 29 26 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  *)&x;.    pMem->
19b50 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
19b60 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
19b70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19b80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56  }else{.    /* EV
19b90 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33  IDENCE-OF: R-573
19ba0 34 33 2d 34 39 31 31 34 20 56 61 6c 75 65 20 69  43-49114 Value i
19bb0 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 49  s a big-endian I
19bc0 45 45 45 20 37 35 34 2d 32 30 30 38 20 36 34 2d  EEE 754-2008 64-
19bd0 62 69 74 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74  bit.    ** float
19be0 69 6e 67 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72  ing point number
19bf0 2e 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  . */.#if !define
19c00 64 28 4e 44 45 42 55 47 29 20 26 26 20 21 64 65  d(NDEBUG) && !de
19c10 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
19c20 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
19c30 29 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ).    /* Verify 
19c40 74 68 61 74 20 69 6e 74 65 67 65 72 73 20 61 6e  that integers an
19c50 64 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  d floating point
19c60 20 76 61 6c 75 65 73 20 75 73 65 20 74 68 65 20   values use the 
19c70 73 61 6d 65 0a 20 20 20 20 2a 2a 20 62 79 74 65  same.    ** byte
19c80 20 6f 72 64 65 72 2e 20 20 4f 72 2c 20 74 68 61   order.  Or, tha
19c90 74 20 69 66 20 53 51 4c 49 54 45 5f 4d 49 58 45  t if SQLITE_MIXE
19ca0 44 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46  D_ENDIAN_64BIT_F
19cb0 4c 4f 41 54 20 69 73 0a 20 20 20 20 2a 2a 20 64  LOAT is.    ** d
19cc0 65 66 69 6e 65 64 20 74 68 61 74 20 36 34 2d 62  efined that 64-b
19cd0 69 74 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  it floating poin
19ce0 74 20 76 61 6c 75 65 73 20 72 65 61 6c 6c 79 20  t values really 
19cf0 61 72 65 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a  are mixed.    **
19d00 20 65 6e 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a   endian..    */.
19d10 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
19d20 20 75 36 34 20 74 31 20 3d 20 28 28 75 36 34 29   u64 t1 = ((u64)
19d30 30 78 33 66 66 30 30 30 30 30 29 3c 3c 33 32 3b  0x3ff00000)<<32;
19d40 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
19d50 74 20 64 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e  t double r1 = 1.
19d60 30 3b 0a 20 20 20 20 75 36 34 20 74 32 20 3d 20  0;.    u64 t2 = 
19d70 74 31 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65  t1;.    swapMixe
19d80 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 74 32 29  dEndianFloat(t2)
19d90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  ;.    assert( si
19da0 7a 65 6f 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66  zeof(r1)==sizeof
19db0 28 74 32 29 20 26 26 20 6d 65 6d 63 6d 70 28 26  (t2) && memcmp(&
19dc0 72 31 2c 20 26 74 32 2c 20 73 69 7a 65 6f 66 28  r1, &t2, sizeof(
19dd0 72 31 29 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69  r1))==0 );.#endi
19de0 66 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69  f.    assert( si
19df0 7a 65 6f 66 28 78 29 3d 3d 38 20 26 26 20 73 69  zeof(x)==8 && si
19e00 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d  zeof(pMem->u.r)=
19e10 3d 38 20 29 3b 0a 20 20 20 20 73 77 61 70 4d 69  =8 );.    swapMi
19e20 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78  xedEndianFloat(x
19e30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
19e40 4d 65 6d 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69  Mem->u.r, &x, si
19e50 7a 65 6f 66 28 78 29 29 3b 0a 20 20 20 20 70 4d  zeof(x));.    pM
19e60 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69  em->flags = sqli
19e70 74 65 33 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75  te3IsNaN(pMem->u
19e80 2e 72 29 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a  .r) ? MEM_Null :
19e90 20 4d 45 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20   MEM_Real;.  }. 
19ea0 20 72 65 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32   return 8;.}.u32
19eb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19ec0 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20 75  alGet(.  const u
19ed0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62 75  nsigned char *bu
19ee0 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72  f,     /* Buffer
19ef0 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20   to deserialize 
19f00 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65  from */.  u32 se
19f10 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20 20  rial_type,      
19f20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61          /* Seria
19f30 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72 69  l type to deseri
19f40 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a  alize */.  Mem *
19f50 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20 20  pMem            
19f60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
19f70 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74 65  ry cell to write
19f80 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29   value into */.)
19f90 7b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69  {.  switch( seri
19fa0 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63  al_type ){.    c
19fb0 61 73 65 20 31 30 3a 20 20 20 2f 2a 20 52 65 73  ase 10:   /* Res
19fc0 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
19fd0 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61 73 65   use */.    case
19fe0 20 31 31 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   11:   /* Reserv
19ff0 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
1a000 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 30 3a  e */.    case 0:
1a010 20 7b 20 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20   {  /* Null */. 
1a020 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a030 2d 4f 46 3a 20 52 2d 32 34 30 37 38 2d 30 39 33  -OF: R-24078-093
1a040 37 35 20 56 61 6c 75 65 20 69 73 20 61 20 4e 55  75 Value is a NU
1a050 4c 4c 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  LL. */.      pMe
1a060 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e  m->flags = MEM_N
1a070 75 6c 6c 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ull;.      break
1a080 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a090 20 31 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45   1: {.      /* E
1a0a0 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34  VIDENCE-OF: R-44
1a0b0 38 38 35 2d 32 35 31 39 36 20 56 61 6c 75 65 20  885-25196 Value 
1a0c0 69 73 20 61 6e 20 38 2d 62 69 74 20 74 77 6f 73  is an 8-bit twos
1a0d0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20  -complement.    
1a0e0 20 20 2a 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f    ** integer. */
1a0f0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a100 20 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28   = ONE_BYTE_INT(
1a110 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a120 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a130 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a140 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a150 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
1a160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a170 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1a180 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a190 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a1a0 4e 43 45 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d  NCE-OF: R-49794-
1a1b0 33 35 30 32 36 20 56 61 6c 75 65 20 69 73 20 61  35026 Value is a
1a1c0 20 62 69 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62   big-endian 16-b
1a1d0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1a1e0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1a1f0 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a200 65 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59  em->u.i = TWO_BY
1a210 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a220 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a230 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a240 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a250 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a260 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20  eturn 2;.    }. 
1a270 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20     case 3: { /* 
1a280 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  3-byte signed in
1a290 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f  teger */.      /
1a2a0 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a2b0 2d 33 37 38 33 39 2d 35 34 33 30 31 20 56 61 6c  -37839-54301 Val
1a2c0 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69  ue is a big-endi
1a2d0 61 6e 20 32 34 2d 62 69 74 0a 20 20 20 20 20 20  an 24-bit.      
1a2e0 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65  ** twos-compleme
1a2f0 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  nt integer. */. 
1a300 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a310 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1a320 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  buf);.      pMem
1a330 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e  ->flags = MEM_In
1a340 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  t;.      testcas
1a350 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29  e( pMem->u.i<0 )
1a360 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 33  ;.      return 3
1a370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1a380 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
1a390 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1a3a0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a3b0 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d  NCE-OF: R-01849-
1a3c0 32 36 30 37 39 20 56 61 6c 75 65 20 69 73 20 61  26079 Value is a
1a3d0 20 62 69 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62   big-endian 32-b
1a3e0 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f 73  it.      ** twos
1a3f0 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
1a400 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d  ger. */.      pM
1a410 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42  em->u.i = FOUR_B
1a420 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69  YTE_INT(buf);.#i
1a430 66 64 65 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20  fdef __HP_cc .  
1a440 20 20 20 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75      /* Work arou
1a450 6e 64 20 61 20 73 69 67 6e 2d 65 78 74 65 6e 73  nd a sign-extens
1a460 69 6f 6e 20 62 75 67 20 69 6e 20 74 68 65 20 48  ion bug in the H
1a470 50 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48  P compiler for H
1a480 50 2f 55 58 20 2a 2f 0a 20 20 20 20 20 20 69 66  P/UX */.      if
1a490 28 20 62 75 66 5b 30 5d 26 30 78 38 30 20 29 20  ( buf[0]&0x80 ) 
1a4a0 70 4d 65 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66  pMem->u.i |= 0xf
1a4b0 66 66 66 66 66 66 66 38 30 30 30 30 30 30 30 4c  fffffff80000000L
1a4c0 4c 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  L;.#endif.      
1a4d0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
1a4e0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
1a4f0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
1a500 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
1a510 72 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 4;.    }.    
1a520 63 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62  case 5: { /* 6-b
1a530 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
1a540 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
1a550 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30  VIDENCE-OF: R-50
1a560 33 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20  385-09674 Value 
1a570 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
1a580 34 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  48-bit.      ** 
1a590 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
1a5a0 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
1a5b0 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f    pMem->u.i = FO
1a5c0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
1a5d0 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c  +2) + (((i64)1)<
1a5e0 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e  <32)*TWO_BYTE_IN
1a5f0 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
1a600 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a610 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
1a620 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
1a630 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1a640 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   6;.    }.    ca
1a650 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74  se 6:   /* 8-byt
1a660 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
1a670 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20   */.    case 7: 
1a680 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69  { /* IEEE floati
1a690 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20  ng point */.    
1a6a0 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c    /* These use l
1a6b0 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20  ocal variables, 
1a6c0 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20  so do them in a 
1a6d0 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65  separate routine
1a6e0 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f  .      ** to avo
1a6f0 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76  id having to mov
1a700 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e  e the frame poin
1a710 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f  ter in the commo
1a720 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  n case */.      
1a730 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74  return serialGet
1a740 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65  (buf,serial_type
1a750 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  ,pMem);.    }.  
1a760 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20    case 8:    /* 
1a770 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20  Integer 0 */.   
1a780 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49   case 9: {  /* I
1a790 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20  nteger 1 */.    
1a7a0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a7b0 3a 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20  : R-12976-22893 
1a7c0 56 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74  Value is the int
1a7d0 65 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20  eger 0. */.     
1a7e0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a7f0 20 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56   R-18143-12121 V
1a800 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
1a810 67 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 1. */.      
1a820 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69  pMem->u.i = seri
1a830 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20  al_type-8;.     
1a840 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
1a850 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65  EM_Int;.      re
1a860 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1a870 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
1a880 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
1a890 46 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34  F: R-14606-31564
1a8a0 20 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42   Value is a BLOB
1a8b0 20 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f   that is (N-12)/
1a8c0 32 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20  2 bytes in.     
1a8d0 20 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20   ** length..    
1a8e0 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
1a8f0 3a 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20  : R-28401-00140 
1a900 56 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e  Value is a strin
1a910 67 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e  g in the text en
1a920 63 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20  coding and.     
1a930 20 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74   ** (N-13)/2 byt
1a940 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f  es in length. */
1a950 0a 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f  .      static co
1a960 6e 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20  nst u16 aFlag[] 
1a970 3d 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d  = { MEM_Blob|MEM
1a980 5f 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c  _Ephem, MEM_Str|
1a990 4d 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20  MEM_Ephem };.   
1a9a0 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68     pMem->z = (ch
1a9b0 61 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20  ar *)buf;.      
1a9c0 70 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61  pMem->n = (seria
1a9d0 6c 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20  l_type-12)/2;.  
1a9e0 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a9f0 3d 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74  = aFlag[serial_t
1aa00 79 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65  ype&1];.      re
1aa10 74 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20  turn pMem->n;.  
1aa20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1aa30 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73   0;.}./*.** This
1aa40 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
1aa50 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66   to allocate suf
1aa60 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f  ficient space fo
1aa70 72 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63  r an UnpackedRec
1aa80 6f 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ord.** structure
1aa90 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f   large enough to
1aaa0 20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71   be used with sq
1aab0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55  lite3VdbeRecordU
1aac0 6e 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68  npack() if.** th
1aad0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1aae0 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
1aaf0 20 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75   KeyInfo structu
1ab00 72 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a  re pKeyInfo..**.
1ab10 2a 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20  ** The space is 
1ab20 65 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64  either allocated
1ab30 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1ab40 4d 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66  MallocRaw() or f
1ab50 72 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68  rom within.** th
1ab60 65 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66  e unaligned buff
1ab70 65 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68  er passed via th
1ab80 65 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69  e second and thi
1ab90 72 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72  rd arguments (pr
1aba0 65 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63  esumably.** stac
1abb0 6b 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65  k space). If the
1abc0 20 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70   former, then *p
1abd0 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20  pFree is set to 
1abe0 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73  a pointer that s
1abf0 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e  hould.** be even
1ac00 74 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20  tually freed by 
1ac10 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
1ac20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29   sqlite3DbFree()
1ac30 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a  . Or, if the .**
1ac40 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65   allocation come
1ac50 73 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63  s from the pSpac
1ac60 65 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72  e/szSpace buffer
1ac70 2c 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74  , *ppFree is set
1ac80 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f   to NULL.** befo
1ac90 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a  re returning..**
1aca0 0a 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72  .** If an OOM er
1acb0 72 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c  ror occurs, NULL
1acc0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1acd0 0a 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  .UnpackedRecord 
1ace0 2a 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f  *sqlite3VdbeAllo
1acf0 63 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28  cUnpackedRecord(
1ad00 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1ad10 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
1ad20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f     /* Descriptio
1ad30 6e 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  n of the record 
1ad40 2a 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63  */.  char *pSpac
1ad50 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1ad60 20 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65       /* Unaligne
1ad70 64 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c  d space availabl
1ad80 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61  e */.  int szSpa
1ad90 63 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ce,             
1ada0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1adb0 66 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79  f pSpace[] in by
1adc0 74 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  tes */.  char **
1add0 70 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20  ppFree          
1ade0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1adf0 20 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66   Caller should f
1ae00 72 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ree this pointer
1ae10 20 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65   */.){.  Unpacke
1ae20 64 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20  dRecord *p;     
1ae30 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61           /* Unpa
1ae40 63 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72  cked record to r
1ae50 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e  eturn */.  int n
1ae60 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
1ae70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1ae80 63 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62  crement pSpace b
1ae90 79 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20  y nOff to align 
1aea0 69 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  it */.  int nByt
1aeb0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1aec0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1aed0 72 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69  r of bytes requi
1aee0 72 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20  red for *p */.. 
1aef0 20 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73   /* We want to s
1af00 68 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72  hift the pointer
1af10 20 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20   pSpace up such 
1af20 74 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74  that it is 8-byt
1af30 65 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20  e aligned..  ** 
1af40 54 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  Thus, we need to
1af50 20 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c   calculate a val
1af60 75 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65  ue, nOff, betwee
1af70 6e 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68  n 0 and 7, to sh
1af80 69 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e  ift .  ** it by.
1af90 20 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61    If pSpace is a
1afa0 6c 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c  lready 8-byte al
1afb0 69 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75  igned, nOff shou
1afc0 6c 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f  ld be zero..  */
1afd0 0a 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28  .  nOff = (8 - (
1afe0 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
1aff0 54 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20  T(pSpace) & 7)) 
1b000 26 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52  & 7;.  nByte = R
1b010 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70  OUND8(sizeof(Unp
1b020 61 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20  ackedRecord)) + 
1b030 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65  sizeof(Mem)*(pKe
1b040 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29  yInfo->nField+1)
1b050 3b 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a  ;.  if( nByte>sz
1b060 53 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20  Space+nOff ){.  
1b070 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52    p = (UnpackedR
1b080 65 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44  ecord *)sqlite3D
1b090 62 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49  bMallocRaw(pKeyI
1b0a0 6e 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b  nfo->db, nByte);
1b0b0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28  .    *ppFree = (
1b0c0 63 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66  char *)p;.    if
1b0d0 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ( !p ) return 0;
1b0e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20  .  }else{.    p 
1b0f0 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  = (UnpackedRecor
1b100 64 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d  d*)&pSpace[nOff]
1b110 3b 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20  ;.    *ppFree = 
1b120 30 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65  0;.  }..  p->aMe
1b130 6d 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61  m = (Mem*)&((cha
1b140 72 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a  r*)p)[ROUND8(siz
1b150 65 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  eof(UnpackedReco
1b160 72 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28  rd))];.  assert(
1b170 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
1b180 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d  Order!=0 );.  p-
1b190 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
1b1a0 49 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c  Info;.  p->nFiel
1b1b0 64 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d = pKeyInfo->nF
1b1c0 69 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75  ield + 1;.  retu
1b1d0 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn p;.}../*.** G
1b1e0 69 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79  iven the nKey-by
1b1f0 74 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61  te encoding of a
1b200 20 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b   record in pKey[
1b210 5d 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ], populate the 
1b220 0a 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  .** UnpackedReco
1b230 72 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64  rd structure ind
1b240 69 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f  icated by the fo
1b250 75 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69  urth argument wi
1b260 74 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  th the.** conten
1b270 74 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65  ts of the decode
1b280 64 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f  d record..*/ .vo
1b290 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
1b2a0 63 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65  cordUnpack(.  Ke
1b2b0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
1b2c0 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
1b2d0 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65  ion about the re
1b2e0 63 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20  cord format */. 
1b2f0 20 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20   int nKey,      
1b300 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
1b310 6f 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65  of the binary re
1b320 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  cord */.  const 
1b330 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1b340 20 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72   /* The binary r
1b350 65 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63  ecord */.  Unpac
1b360 6b 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20  kedRecord *p    
1b370 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1b380 69 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66  is structure bef
1b390 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a  ore returning. *
1b3a0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  /.){.  const uns
1b3b0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1b3c0 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e   = (const unsign
1b3d0 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a  ed char *)pKey;.
1b3e0 20 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20    int d; .  u32 
1b3f0 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  idx;            
1b400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1b410 66 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20  ffset in aKey[] 
1b420 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a  to read from */.
1b430 20 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20    u16 u;        
1b440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b450 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f    /* Unsigned lo
1b460 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
1b470 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d  u32 szHdr;.  Mem
1b480 20 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d   *pMem = p->aMem
1b490 3b 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f  ;..  p->default_
1b4a0 72 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  rc = 0;.  assert
1b4b0 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1b4c0 47 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a  GNMENT(pMem) );.
1b4d0 20 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e    idx = getVarin
1b4e0 74 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29  t32(aKey, szHdr)
1b4f0 3b 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20  ;.  d = szHdr;. 
1b500 20 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28   u = 0;.  while(
1b510 20 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c   idx<szHdr && d<
1b520 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32  =nKey ){.    u32
1b530 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20   serial_type;.. 
1b540 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72     idx += getVar
1b550 69 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d  int32(&aKey[idx]
1b560 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1b570 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20      pMem->enc = 
1b580 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20  pKeyInfo->enc;. 
1b590 20 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b     pMem->db = pK
1b5a0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20  eyInfo->db;.    
1b5b0 2f 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d  /* pMem->flags =
1b5c0 20 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64   0; // sqlite3Vd
1b5d0 62 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69  beSerialGet() wi
1b5e0 6c 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20  ll set this for 
1b5f0 75 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  us */.    pMem->
1b600 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
1b610 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20    pMem->z = 0;. 
1b620 20 20 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56     d += sqlite3V
1b630 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1b640 65 79 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79  ey[d], serial_ty
1b650 70 65 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70  pe, pMem);.    p
1b660 4d 65 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28  Mem++;.    if( (
1b670 2b 2b 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20  ++u)>=p->nField 
1b680 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61  ) break;.  }.  a
1b690 73 73 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e  ssert( u<=pKeyIn
1b6a0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29  fo->nField + 1 )
1b6b0 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20  ;.  p->nField = 
1b6c0 75 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  u;.}..#if SQLITE
1b6d0 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69  _DEBUG./*.** Thi
1b6e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61  s function compa
1b6f0 72 65 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72  res two index or
1b700 20 74 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65   table record ke
1b710 79 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77  ys in the same w
1b720 61 79 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c  ay.** as the sql
1b730 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1b740 6d 70 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e  mpare() routine.
1b750 20 55 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f   Unlike VdbeReco
1b760 72 64 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20  rdCompare(),.** 
1b770 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  this function de
1b780 73 65 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63  serializes and c
1b790 6f 6d 70 61 72 65 73 20 76 61 6c 75 65 73 20 75  ompares values u
1b7a0 73 69 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69  sing the.** sqli
1b7b0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1b7c0 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65  () and sqlite3Me
1b7d0 6d 43 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74  mCompare() funct
1b7e0 69 6f 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64  ions. It is used
1b7f0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
1b800 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e  statements to en
1b810 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6f 70  sure that the op
1b820 74 69 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a  timized code in.
1b830 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  ** sqlite3VdbeRe
1b840 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65  cordCompare() re
1b850 74 75 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69  turns results wi
1b860 74 68 20 74 68 65 73 65 20 74 77 6f 20 70 72 69  th these two pri
1b870 6d 69 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52  mitives..**.** R
1b880 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b890 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70  e result of comp
1b8a0 61 72 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61  arison is equiva
1b8b0 6c 65 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52  lent to desiredR
1b8c0 65 73 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e  esult..** Return
1b8d0 20 66 61 6c 73 65 20 69 66 20 74 68 65 72 65 20   false if there 
1b8e0 69 73 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e  is a disagreemen
1b8f0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b900 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
1b910 72 65 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e  reDebug(.  int n
1b920 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1b930 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1b940 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
1b950 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1b960 70 50 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74  pPKey2, /* Right
1b970 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65   key */.  int de
1b980 73 69 72 65 64 52 65 73 75 6c 74 20 20 20 20 20  siredResult     
1b990 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65          /* Corre
1b9a0 63 74 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a  ct answer */.){.
1b9b0 20 20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20    u32 d1;       
1b9c0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b9d0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b9e0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1b9f0 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20  */.  u32 idx1;  
1ba00 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1ba10 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1ba20 20 6e 65 78 74 20 68 65 61 64 65 72 20 65 6c 65   next header ele
1ba30 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a  ment */.  u32 sz
1ba40 48 64 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20  Hdr1;        /* 
1ba50 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1ba60 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  in header */.  i
1ba70 6e 74 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt i = 0;.  int 
1ba80 72 63 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  rc = 0;.  const 
1ba90 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1baa0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1bab0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1bac0 65 79 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  ey1;.  KeyInfo *
1bad0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20  pKeyInfo;.  Mem 
1bae0 6d 65 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66  mem1;..  pKeyInf
1baf0 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  o = pPKey2->pKey
1bb00 49 6e 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79  Info;.  if( pKey
1bb10 49 6e 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65  Info->db==0 ) re
1bb20 74 75 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65  turn 1;.  mem1.e
1bb30 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1bb40 6e 63 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20  nc;.  mem1.db = 
1bb50 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20  pKeyInfo->db;.  
1bb60 2f 2a 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20  /* mem1.flags = 
1bb70 30 3b 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69  0;  // Will be i
1bb80 6e 69 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71  nitialized by sq
1bb90 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1bba0 65 74 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e  et() */.  VVA_ON
1bbb0 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1bbc0 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1bbd0 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1bbe0 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1bbf0 2f 0a 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72  /..  /* Compiler
1bc00 73 20 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74  s may complain t
1bc10 68 61 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20  hat mem1.u.i is 
1bc20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e  potentially unin
1bc30 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20  itialized..  ** 
1bc40 57 65 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c  We could initial
1bc50 69 7a 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e  ize it, as shown
1bc60 20 68 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63   here, to silenc
1bc70 65 20 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e  e those complain
1bc80 74 73 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20  ts..  ** But in 
1bc90 66 61 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77  fact, mem1.u.i w
1bca0 69 6c 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c  ill never actual
1bcb0 6c 79 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69  ly be used unini
1bcc0 74 69 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f  tialized, and do
1bcd0 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e  ing .  ** the un
1bce0 6e 65 63 65 73 73 61 72 79 20 69 6e 69 74 69 61  necessary initia
1bcf0 6c 69 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d  lization has a m
1bd00 65 61 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69  easurable negati
1bd10 76 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20  ve performance. 
1bd20 20 2a 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63   ** impact, sinc
1bd30 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  e this routine i
1bd40 73 20 61 20 76 65 72 79 20 68 69 67 68 20 72 75  s a very high ru
1bd50 6e 6e 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77  nner.  And so, w
1bd60 65 20 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f  e choose.  ** to
1bd70 20 69 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70   ignore the comp
1bd80 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e  iler warnings an
1bd90 64 20 6c 65 61 76 65 20 74 68 69 73 20 76 61 72  d leave this var
1bda0 69 61 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69  iable uninitiali
1bdb0 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20  zed..  */.  /*  
1bdc0 6d 65 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f  mem1.u.i = 0;  /
1bdd0 2f 20 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65  / not needed, he
1bde0 72 65 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f  re to silence co
1bdf0 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a  mpiler warning *
1be00 2f 0a 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65  /.  .  idx1 = ge
1be10 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1be20 20 73 7a 48 64 72 31 29 3b 0a 20 20 69 66 28 20   szHdr1);.  if( 
1be30 73 7a 48 64 72 31 3e 39 38 33 30 37 20 29 20 72  szHdr1>98307 ) r
1be40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1be50 52 55 50 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48  RUPT;.  d1 = szH
1be60 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70  dr1;.  assert( p
1be70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1be80 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c  pKeyInfo->nXFiel
1be90 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c  d>=pPKey2->nFiel
1bea0 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  d || CORRUPT_DB 
1beb0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65  );.  assert( pKe
1bec0 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65  yInfo->aSortOrde
1bed0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
1bee0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ( pKeyInfo->nFie
1bef0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1bf00 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1bf10 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1bf20 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1bf30 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20  rial_type1;..   
1bf40 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73 65 72   /* Read the ser
1bf50 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20 74 68  ial types for th
1bf60 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74 20 69  e next element i
1bf70 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20  n each key. */. 
1bf80 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74 56 61     idx1 += getVa
1bf90 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b 69 64  rint32( aKey1+id
1bfa0 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31  x1, serial_type1
1bfb0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69   );..    /* Veri
1bfc0 66 79 20 74 68 61 74 20 74 68 65 72 65 20 69 73  fy that there is
1bfd0 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70 61 63   enough key spac
1bfe0 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61  e remaining to a
1bff0 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20 62 75  void.    ** a bu
1c000 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e 20 20  ffer overread.  
1c010 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c 5f 74  The "d1+serial_t
1c020 79 70 65 31 2b 32 22 20 73 75 62 65 78 70 72 65  ype1+2" subexpre
1c030 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a  ssion will.    *
1c040 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72 65 61  * always be grea
1c050 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
1c060 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20  l to the amount 
1c070 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65 79 20  of required key 
1c080 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73  space..    ** Us
1c090 65 20 74 68 61 74 20 61 70 70 72 6f 78 69 6d 61  e that approxima
1c0a0 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20 74 68  tion to avoid th
1c0b0 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69 76 65  e more expensive
1c0c0 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20   call to.    ** 
1c0d0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
1c0e0 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20 74 68  lTypeLen() in th
1c0f0 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20  e common case.. 
1c100 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 64 31     */.    if( d1
1c110 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e  +serial_type1+2>
1c120 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20 20 20  (u32)nKey1.     
1c130 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56 64 62  && d1+sqlite3Vdb
1c140 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73  eSerialTypeLen(s
1c150 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28 75 33  erial_type1)>(u3
1c160 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a  2)nKey1 .    ){.
1c170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c180 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74 72 61   }..    /* Extra
1c190 63 74 20 74 68 65 20 76 61 6c 75 65 73 20 74 6f  ct the values to
1c1a0 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20   be compared..  
1c1b0 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73    */.    d1 += s
1c1c0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1c1d0 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  Get(&aKey1[d1], 
1c1e0 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d  serial_type1, &m
1c1f0 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f  em1);..    /* Do
1c200 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a   the comparison.
1c210 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1c220 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72  sqlite3MemCompar
1c230 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32  e(&mem1, &pPKey2
1c240 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49  ->aMem[i], pKeyI
1c250 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a  nfo->aColl[i]);.
1c260 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1c270 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1c280 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1c290 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1c2a0 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1c2b0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1c2c0 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b  aSortOrder[i] ){
1c2d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72  .        rc = -r
1c2e0 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20 74 68  c;  /* Invert th
1c2f0 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44 45 53  e result for DES
1c300 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f  C sort order. */
1c310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
1c320 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61 72 65  oto debugCompare
1c330 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  End;.    }.    i
1c340 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 64  ++;.  }while( id
1c350 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69 3c 70  x1<szHdr1 && i<p
1c360 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b  PKey2->nField );
1c370 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79  ..  /* No memory
1c380 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65   allocation is e
1c390 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31  ver used on mem1
1c3a0 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20 75 73  .  Prove this us
1c3b0 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c  ing.  ** the fol
1c3c0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28 29 2e  lowing assert().
1c3d0 20 20 49 66 20 74 68 65 20 61 73 73 65 72 74 28    If the assert(
1c3e0 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e 64 69  ) fails, it indi
1c3f0 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d  cates a.  ** mem
1c400 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e  ory leak and a n
1c410 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69  eed to call sqli
1c420 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
1c430 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20  e(&mem1)..  */. 
1c440 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1c450 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20  Malloc==0 );..  
1c460 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d 65  /* rc==0 here me
1c470 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 66 20  ans that one of 
1c480 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75 74  the keys ran out
1c490 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a 20   of fields and. 
1c4a0 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65 6c   ** all the fiel
1c4b0 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70 6f  ds up to that po
1c4c0 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e 20  int were equal. 
1c4d0 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61 75  Return the defau
1c4e0 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65  lt_rc.  ** value
1c4f0 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b  .  */.  rc = pPK
1c500 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1c510 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e  ..debugCompareEn
1c520 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72 65 64  d:.  if( desired
1c530 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d  Result==0 && rc=
1c540 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
1c550 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c560 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29 20 72  lt<0 && rc<0 ) r
1c570 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 64  eturn 1;.  if( d
1c580 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30 20 26  esiredResult>0 &
1c590 26 20 72 63 3e 30 20 29 20 72 65 74 75 72 6e 20  & rc>0 ) return 
1c5a0 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  1;.  if( CORRUPT
1c5b0 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  _DB ) return 1;.
1c5c0 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e    if( pKeyInfo->
1c5d0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1c5e0 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
1c5f0 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
1c600 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  f..#if SQLITE_DE
1c610 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20  BUG./*.** Count 
1c620 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69  the number of fi
1c630 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c  elds (a.k.a. col
1c640 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72 65 63  umns) in the rec
1c650 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20  ord given by.** 
1c660 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20  pKey,nKey.  The 
1c670 76 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  verify that this
1c680 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73 20 74   count is less t
1c690 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
1c6a0 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76  the.** limit giv
1c6b0 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e  en by pKeyInfo->
1c6c0 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66  nField + pKeyInf
1c6d0 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a  o->nXField..**.*
1c6e0 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73 74 72  * If this constr
1c6f0 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61 74 69  aint is not sati
1c700 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e 73 20  sfied, it means 
1c710 74 68 61 74 20 74 68 65 20 68 69 67 68 2d 73 70  that the high-sp
1c720 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72  eed.** vdbeRecor
1c730 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20 61 6e  dCompareInt() an
1c740 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  d vdbeRecordComp
1c750 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f 75 74  areString() rout
1c760 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74  ines will.** not
1c770 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e   work correctly.
1c780 20 20 49 66 20 74 68 69 73 20 61 73 73 65 72 74    If this assert
1c790 28 29 20 65 76 65 72 20 66 69 72 65 73 2c 20 69  () ever fires, i
1c7a0 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73  t probably means
1c7b0 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b 65 79  .** that the Key
1c7c0 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b  Info.nField or K
1c7d0 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76  eyInfo.nXField v
1c7e0 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d 70 75  alues were compu
1c7f0 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74  ted.** incorrect
1c800 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ly..*/.static vo
1c810 69 64 20 76 64 62 65 41 73 73 65 72 74 46 69 65  id vdbeAssertFie
1c820 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
1c830 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  its(.  int nKey,
1c840 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65   const void *pKe
1c850 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65 63 6f  y,   /* The reco
1c860 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a 2f 20  rd to verify */ 
1c870 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f  .  const KeyInfo
1c880 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20 20 20   *pKeyInfo      
1c890 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69 7a 65   /* Compare size
1c8a0 20 77 69 74 68 20 74 68 69 73 20 4b 65 79 49 6e   with this KeyIn
1c8b0 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  fo */.){.  int n
1c8c0 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32  Field = 0;.  u32
1c8d0 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20 69 64   szHdr;.  u32 id
1c8e0 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73 65 64  x;.  u32 notUsed
1c8f0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
1c900 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1c910 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1c920 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69  char*)pKey;..  i
1c930 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20 29 20  f( CORRUPT_DB ) 
1c940 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20  return;.  idx = 
1c950 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1c960 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73 73 65  , szHdr);.  asse
1c970 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20  rt( nKey>=0 );. 
1c980 20 61 73 73 65 72 74 28 20 73 7a 48 64 72 3c 3d   assert( szHdr<=
1c990 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77  (u32)nKey );.  w
1c9a0 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1c9b0 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20 67 65  ){.    idx += ge
1c9c0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2b 69  tVarint32(aKey+i
1c9d0 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20  dx, notUsed);.  
1c9e0 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a    nField++;.  }.
1c9f0 20 20 61 73 73 65 72 74 28 20 6e 46 69 65 6c 64    assert( nField
1ca00 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46   <= pKeyInfo->nF
1ca10 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
1ca20 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73  XField );.}.#els
1ca30 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 41  e.# define vdbeA
1ca40 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1ca50 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c  ithinLimits(A,B,
1ca60 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  C).#endif../*.**
1ca70 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64   Both *pMem1 and
1ca80 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20   *pMem2 contain 
1ca90 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e 20 43  string values. C
1caa0 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f 20 76  ompare the two v
1cab0 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74  alues.** using t
1cac0 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1cad0 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20  uence pColl. As 
1cae0 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20 61 20  usual, return a 
1caf0 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a  negative , zero.
1cb00 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 76  ** or positive v
1cb10 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31 20 69  alue if *pMem1 i
1cb20 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
1cb30 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74 65 72  al to or greater
1cb40 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32   than .** *pMem2
1cb50 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 20  , respectively. 
1cb60 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69 72 69  Similar in spiri
1cb70 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65  t to "rc = (*pMe
1cb80 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22  m1) - (*pMem2);"
1cb90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cba0 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74  vdbeCompareMemSt
1cbb0 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65  ring(.  const Me
1cbc0 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73  m *pMem1,.  cons
1cbd0 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20  t Mem *pMem2,.  
1cbe0 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70  const CollSeq *p
1cbf0 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45  Coll,.  u8 *prcE
1cc00 72 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rr              
1cc10 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e          /* If an
1cc20 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73 65 74   OOM occurs, set
1cc30 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1cc40 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65   */.){.  if( pMe
1cc50 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e  m1->enc==pColl->
1cc60 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  enc ){.    /* Th
1cc70 65 20 73 74 72 69 6e 67 73 20 61 72 65 20 61 6c  e strings are al
1cc80 72 65 61 64 79 20 69 6e 20 74 68 65 20 63 6f 72  ready in the cor
1cc90 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20  rect encoding.  
1cca0 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a  Call the.     **
1ccb0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63   comparison func
1ccc0 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f  tion directly */
1ccd0 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 6f 6c  .    return pCol
1cce0 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70  l->xCmp(pColl->p
1ccf0 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d  User,pMem1->n,pM
1cd00 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c  em1->z,pMem2->n,
1cd10 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c  pMem2->z);.  }el
1cd20 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
1cd30 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
1cd40 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74  v1, *v2;.    int
1cd50 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d   n1, n2;.    Mem
1cd60 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b   c1;.    Mem c2;
1cd70 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cd80 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70 4d 65  MemInit(&c1, pMe
1cd90 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c  m1->db, MEM_Null
1cda0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1cdb0 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c 20 70  beMemInit(&c2, p
1cdc0 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1cdd0 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1cde0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
1cdf0 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d  py(&c1, pMem1, M
1ce00 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 73  EM_Ephem);.    s
1ce10 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1ce20 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20 70 4d  llowCopy(&c2, pM
1ce30 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em2, MEM_Ephem);
1ce40 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69 74 65  .    v1 = sqlite
1ce50 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c 69  3ValueText((sqli
1ce60 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20  te3_value*)&c1, 
1ce70 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20  pColl->enc);.   
1ce80 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20   n1 = v1==0 ? 0 
1ce90 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d  : c1.n;.    v2 =
1cea0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
1ceb0 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t((sqlite3_value
1cec0 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e  *)&c2, pColl->en
1ced0 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d  c);.    n2 = v2=
1cee0 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20  =0 ? 0 : c2.n;. 
1cef0 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78     rc = pColl->x
1cf00 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  Cmp(pColl->pUser
1cf10 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32  , n1, v1, n2, v2
1cf20 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31 3d 3d  );.    if( (v1==
1cf30 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26 20 70  0 || v2==0) && p
1cf40 72 63 45 72 72 20 29 20 2a 70 72 63 45 72 72 20  rcErr ) *prcErr 
1cf50 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
1cf60 4b 50 54 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  KPT;.    sqlite3
1cf70 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1cf80 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1cf90 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1cfa0 63 32 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  c2);.    return 
1cfb0 72 63 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rc;.  }.}../*.**
1cfc0 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f   Compare two blo
1cfd0 62 73 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  bs.  Return nega
1cfe0 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1cff0 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1d000 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20  irst.** is less 
1d010 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1d020 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
1d030 74 68 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70  the second, resp
1d040 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20  ectively..** If 
1d050 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72  one blob is a pr
1d060 65 66 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65  efix of the othe
1d070 72 2c 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72  r, then the shor
1d080 74 65 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f  ter is the lesso
1d090 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c  r..*/.static SQL
1d0a0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74  ITE_NOINLINE int
1d0b0 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1d0c0 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  are(const Mem *p
1d0d0 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70  B1, const Mem *p
1d0e0 42 32 29 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d  B2){.  int c = m
1d0f0 65 6d 63 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42  emcmp(pB1->z, pB
1d100 32 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32  2->z, pB1->n>pB2
1d110 2d 3e 6e 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70  ->n ? pB2->n : p
1d120 42 31 2d 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20  B1->n);.  if( c 
1d130 29 20 72 65 74 75 72 6e 20 63 3b 0a 20 20 72 65  ) return c;.  re
1d140 74 75 72 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42  turn pB1->n - pB
1d150 32 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  2->n;.}../*.** D
1d160 6f 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62  o a comparison b
1d170 65 74 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20  etween a 64-bit 
1d180 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61  signed integer a
1d190 6e 64 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  nd a 64-bit floa
1d1a0 74 69 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75  ting-point.** nu
1d1b0 6d 62 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65  mber.  Return ne
1d1c0 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72  gative, zero, or
1d1d0 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68 65   positive if the
1d1e0 20 66 69 72 73 74 20 28 69 36 34 29 20 69 73 20   first (i64) is 
1d1f0 6c 65 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71  less than,.** eq
1d200 75 61 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74  ual to, or great
1d210 65 72 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f  er than the seco
1d220 6e 64 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a  nd (double)..*/.
1d230 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
1d240 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1d250 65 28 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20  e(i64 i, double 
1d260 72 29 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66  r){.  if( sizeof
1d270 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45  (LONGDOUBLE_TYPE
1d280 29 3e 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44  )>8 ){.    LONGD
1d290 4f 55 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28  OUBLE_TYPE x = (
1d2a0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29  LONGDOUBLE_TYPE)
1d2b0 69 3b 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29  i;.    if( x<r )
1d2c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d2d0 69 66 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e  if( x>r ) return
1d2e0 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   +1;.    return 
1d2f0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
1d300 69 36 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c  i64 y;.    doubl
1d310 65 20 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d  e s;.    if( r<-
1d320 39 32 32 33 33 37 32 30 33 36 38 35 34 37 37 35  9223372036854775
1d330 38 30 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b  808.0 ) return +
1d340 31 3b 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32  1;.    if( r>922
1d350 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 37  3372036854775807
1d360 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
1d370 20 20 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a      y = (i64)r;.
1d380 20 20 20 20 69 66 28 20 69 3c 79 20 29 20 72 65      if( i<y ) re
1d390 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1d3a0 20 69 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66   i>y ){.      if
1d3b0 28 20 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e  ( y==SMALLEST_IN
1d3c0 54 36 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72  T64 && r>0.0 ) r
1d3d0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20  eturn -1;.      
1d3e0 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d  return +1;.    }
1d3f0 0a 20 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65  .    s = (double
1d400 29 69 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20  )i;.    if( s<r 
1d410 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d420 20 69 66 28 20 73 3e 72 20 29 20 72 65 74 75 72   if( s>r ) retur
1d430 6e 20 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  n +1;.    return
1d440 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
1d450 20 43 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c   Compare the val
1d460 75 65 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79  ues contained by
1d470 20 74 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20   the two memory 
1d480 63 65 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67  cells, returning
1d490 0a 2a 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  .** negative, ze
1d4a0 72 6f 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  ro or positive i
1d4b0 66 20 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20  f pMem1 is less 
1d4c0 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20  than, equal to, 
1d4d0 6f 72 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68  or greater.** th
1d4e0 61 6e 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e  an pMem2. Sortin
1d4f0 67 20 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27  g order is NULL'
1d500 73 20 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65  s first, followe
1d510 64 20 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e  d by numbers (in
1d520 74 65 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65  tegers.** and re
1d530 61 6c 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65  als) sorted nume
1d540 72 69 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65  rically, followe
1d550 64 20 62 79 20 74 65 78 74 20 6f 72 64 65 72 65  d by text ordere
1d560 64 20 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69  d by the collati
1d570 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70  ng.** sequence p
1d580 43 6f 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79  Coll and finally
1d590 20 62 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20   blob's ordered 
1d5a0 62 79 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a  by memcmp()..**.
1d5b0 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75  ** Two NULL valu
1d5c0 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65  es are considere
1d5d0 64 20 65 71 75 61 6c 20 62 79 20 74 68 69 73 20  d equal by this 
1d5e0 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
1d5f0 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61   sqlite3MemCompa
1d600 72 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  re(const Mem *pM
1d610 65 6d 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  em1, const Mem *
1d620 70 4d 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c  pMem2, const Col
1d630 6c 53 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20  lSeq *pColl){.  
1d640 69 6e 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e  int f1, f2;.  in
1d650 74 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  t combined_flags
1d660 3b 0a 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d  ;..  f1 = pMem1-
1d670 3e 66 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70  >flags;.  f2 = p
1d680 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63  Mem2->flags;.  c
1d690 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20  ombined_flags = 
1d6a0 66 31 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28  f1|f2;.  assert(
1d6b0 20 28 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73   (combined_flags
1d6c0 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d   & MEM_RowSet)==
1d6d0 30 20 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f  0 );. .  /* If o
1d6e0 6e 65 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c  ne value is NULL
1d6f0 2c 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61  , it is less tha
1d700 6e 20 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20  n the other. If 
1d710 62 6f 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a  both values.  **
1d720 20 61 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72   are NULL, retur
1d730 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  n 0..  */.  if( 
1d740 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d  combined_flags&M
1d750 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72  EM_Null ){.    r
1d760 65 74 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75  eturn (f2&MEM_Nu
1d770 6c 6c 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75  ll) - (f1&MEM_Nu
1d780 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  ll);.  }..  /* A
1d790 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74  t least one of t
1d7a0 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73  he two values is
1d7b0 20 61 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20   a number.  */. 
1d7c0 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d7d0 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d  ags&(MEM_Int|MEM
1d7e0 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66  _Real) ){.    if
1d7f0 28 20 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d  ( (f1 & f2 & MEM
1d800 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1d810 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69    if( pMem1->u.i
1d820 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20   < pMem2->u.i ) 
1d830 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1d840 20 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20   if( pMem1->u.i 
1d850 3e 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72  > pMem2->u.i ) r
1d860 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20  eturn +1;.      
1d870 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
1d880 20 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32      if( (f1 & f2
1d890 20 26 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20   & MEM_Real)!=0 
1d8a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65  ){.      if( pMe
1d8b0 6d 31 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d  m1->u.r < pMem2-
1d8c0 3e 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31  >u.r ) return -1
1d8d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d  ;.      if( pMem
1d8e0 31 2d 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e  1->u.r > pMem2->
1d8f0 75 2e 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  u.r ) return +1;
1d900 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1d910 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
1d920 66 31 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29  f1&MEM_Int)!=0 )
1d930 7b 0a 20 20 20 20 20 20 69 66 28 20 28 66 32 26  {.      if( (f2&
1d940 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1d950 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73          return s
1d960 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1d970 6d 70 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69  mpare(pMem1->u.i
1d980 2c 20 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20  , pMem2->u.r);. 
1d990 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d9a0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1d9b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1d9c0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61   if( (f1&MEM_Rea
1d9d0 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  l)!=0 ){.      i
1d9e0 66 28 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21  f( (f2&MEM_Int)!
1d9f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1da00 74 75 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74  turn -sqlite3Int
1da10 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65  FloatCompare(pMe
1da20 6d 32 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e  m2->u.i, pMem1->
1da30 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1da40 65 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  e{.        retur
1da50 6e 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n -1;.      }.  
1da60 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b    }.    return +
1da70 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  1;.  }..  /* If 
1da80 6f 6e 65 20 76 61 6c 75 65 20 69 73 20 61 20 73  one value is a s
1da90 74 72 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74  tring and the ot
1daa0 68 65 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74  her is a blob, t
1dab0 68 65 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73  he string is les
1dac0 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20  s..  ** If both 
1dad0 61 72 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d  are strings, com
1dae0 70 61 72 65 20 75 73 69 6e 67 20 74 68 65 20 63  pare using the c
1daf0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
1db00 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  ns..  */.  if( c
1db10 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45  ombined_flags&ME
1db20 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28  M_Str ){.    if(
1db30 20 28 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f1 & MEM_Str)=
1db40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1db50 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
1db60 69 66 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74  if( (f2 & MEM_St
1db70 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  r)==0 ){.      r
1db80 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a  eturn -1;.    }.
1db90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65  .    assert( pMe
1dba0 6d 31 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e  m1->enc==pMem2->
1dbb0 65 6e 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62  enc || pMem1->db
1dbc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
1dbd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4d  ;.    assert( pM
1dbe0 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1dbf0 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20  _UTF8 || .      
1dc00 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63        pMem1->enc
1dc10 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
1dc20 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d   || pMem1->enc==
1dc30 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
1dc40 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  ;..    /* The co
1dc50 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1dc60 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e 65 64   must be defined
1dc70 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   at this point, 
1dc80 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74  even if.    ** t
1dc90 68 65 20 75 73 65 72 20 64 65 6c 65 74 65 73 20  he user deletes 
1dca0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1dcb0 71 75 65 6e 63 65 20 61 66 74 65 72 20 74 68 65  quence after the
1dcc0 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73   vdbe program is
1dcd0 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64  .    ** compiled
1dce0 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61   (this was not a
1dcf0 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 29 2e  lways the case).
1dd00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1dd10 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43  rt( !pColl || pC
1dd20 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20  oll->xCmp );..  
1dd30 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
1dd40 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62 65       return vdbe
1dd50 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1dd60 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70  (pMem1, pMem2, p
1dd70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Coll, 0);.    }.
1dd80 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c      /* If a NULL
1dd90 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73   pointer was pas
1dda0 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61  sed as the colla
1ddb0 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c  te function, fal
1ddc0 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a  l through.    **
1ddd0 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73   to the blob cas
1dde0 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70  e and use memcmp
1ddf0 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20  ().  */.  }. .  
1de00 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d  /* Both values m
1de10 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43  ust be blobs.  C
1de20 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d  ompare using mem
1de30 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74  cmp().  */.  ret
1de40 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  urn sqlite3BlobC
1de50 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d  ompare(pMem1, pM
1de60 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  em2);.}.../*.** 
1de70 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
1de80 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  nt passed to thi
1de90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1dea0 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74  serial-type that
1deb0 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  .** corresponds 
1dec0 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  to an integer - 
1ded0 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65  all values betwe
1dee0 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75  en 1 and 9 inclu
1def0 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20  sive .** except 
1df00 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f  7. The second po
1df10 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
1df20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69   containing an i
1df30 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20  nteger value.** 
1df40 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72  serialized accor
1df50 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74  ding to serial_t
1df60 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69  ype. This functi
1df70 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a  on deserializes.
1df80 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74  ** and returns t
1df90 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  he value..*/.sta
1dfa0 74 69 63 20 69 36 34 20 76 64 62 65 52 65 63 6f  tic i64 vdbeReco
1dfb0 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20  rdDecodeInt(u32 
1dfc0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e  serial_type, con
1dfd0 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20  st u8 *aKey){.  
1dfe0 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28  u32 y;.  assert(
1dff0 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28   CORRUPT_DB || (
1e000 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26  serial_type>=1 &
1e010 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39  & serial_type<=9
1e020 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21   && serial_type!
1e030 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28  =7) );.  switch(
1e040 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
1e050 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20      case 0:.    
1e060 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65  case 1:.      te
1e070 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e080 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65  0x80 );.      re
1e090 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e  turn ONE_BYTE_IN
1e0a0 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73  T(aKey);.    cas
1e0b0 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 2:.      testc
1e0c0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e0d0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e0e0 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61  n TWO_BYTE_INT(a
1e0f0 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33  Key);.    case 3
1e100 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e110 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e120 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1e130 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b  HREE_BYTE_INT(aK
1e140 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a  ey);.    case 4:
1e150 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1e160 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e170 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  );.      y = FOU
1e180 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e190 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e1a0 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a  (i64)*(int*)&y;.
1e1b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35      }.    case 5
1e1c0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1e1d0 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1e1e0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1e1f0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1e200 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1e210 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1e220 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1e230 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b   }.    case 6: {
1e240 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d 20 46  .      u64 x = F
1e250 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e260 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1e270 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e280 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28  0 );.      x = (
1e290 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59  x<<32) | FOUR_BY
1e2a0 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b  TE_UINT(aKey+4);
1e2b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e2c0 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20  64)*(i64*)&x;.  
1e2d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
1e2e0 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  n (serial_type -
1e2f0 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   8);.}../*.** Th
1e300 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
1e310 61 72 65 73 20 74 68 65 20 74 77 6f 20 74 61 62  ares the two tab
1e320 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78  le rows or index
1e330 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63   records.** spec
1e340 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c  ified by {nKey1,
1e350 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65   pKey1} and pPKe
1e360 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20  y2.  It returns 
1e370 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  a negative, zero
1e380 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20  .** or positive 
1e390 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79 31 20  integer if key1 
1e3a0 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71  is less than, eq
1e3b0 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72  ual to or .** gr
1e3c0 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e  eater than key2.
1e3d0 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b    The {nKey1, pK
1e3e0 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65  ey1} key must be
1e3f0 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74   a blob.** creat
1e400 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b  ed by the OP_Mak
1e410 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f  eRecord opcode o
1e420 66 20 74 68 65 20 56 44 42 45 2e 20 20 54 68 65  f the VDBE.  The
1e430 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d   pPKey2.** key m
1e440 75 73 74 20 62 65 20 61 20 70 61 72 73 65 64 20  ust be a parsed 
1e450 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62 74 61  key such as obta
1e460 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
1e470 69 74 65 33 56 64 62 65 50 61 72 73 65 52 65 63  ite3VdbeParseRec
1e480 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72  ord..**.** If ar
1e490 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20  gument bSkip is 
1e4a0 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20  non-zero, it is 
1e4b0 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
1e4c0 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65   caller has alre
1e4d0 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65  ady.** determine
1e4e0 64 20 74 68 61 74 20 74 68 65 20 66 69 72 73 74  d that the first
1e4f0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b   fields of the k
1e500 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a  eys are equal..*
1e510 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65  *.** Key1 and Ke
1e520 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74  y2 do not have t
1e530 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61  o contain the sa
1e540 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65  me number of fie
1e550 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20  lds. If all .** 
1e560 66 69 65 6c 64 73 20 74 68 61 74 20 61 70 70 65  fields that appe
1e570 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20  ar in both keys 
1e580 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20  are equal, then 
1e590 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
1e5a0 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  rc is .** return
1e5b0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  ed..**.** If dat
1e5c0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1e5d0 20 69 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20   is discovered, 
1e5e0 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43  set pPKey2->errC
1e5f0 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  ode to .** SQLIT
1e600 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65  E_CORRUPT and re
1e610 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f  turn 0. If an OO
1e620 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  M error is encou
1e630 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65  ntered, .** pPKe
1e640 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73  y2->errCode is s
1e650 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1e660 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73  EM and, if it is
1e670 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a   not NULL, the.*
1e680 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20  * malloc-failed 
1e690 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61  flag set on data
1e6a0 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b  base handle (pPK
1e6b0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64  ey2->pKeyInfo->d
1e6c0 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  b)..*/.int sqlit
1e6d0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e6e0 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69  areWithSkip(.  i
1e6f0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
1e700 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f  void *pKey1,   /
1e710 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1e720 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1e730 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20  pPKey2,         
1e740 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
1e750 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20    int bSkip     
1e760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e770 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b    /* If true, sk
1e780 69 70 20 74 68 65 20 66 69 72 73 74 20 66 69 65  ip the first fie
1e790 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64  ld */.){.  u32 d
1e7a0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e7b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1e7c0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1e7d0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1e7e0 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69  ement */.  int i
1e7f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e800 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
1e810 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c  dex of next fiel
1e820 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  d to compare */.
1e830 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20    u32 szHdr1;   
1e840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e850 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63    /* Size of rec
1e860 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20 62 79  ord header in by
1e870 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78  tes */.  u32 idx
1e880 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e890 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e8a0 65 74 20 6f 66 20 66 69 72 73 74 20 74 79 70 65  et of first type
1e8b0 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20   in header */.  
1e8c0 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20  int rc = 0;     
1e8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e8e0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
1e8f0 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d  */.  Mem *pRhs =
1e900 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20   pPKey2->aMem;  
1e910 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65       /* Next fie
1e920 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20  ld of pPKey2 to 
1e930 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79  compare */.  Key
1e940 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d  Info *pKeyInfo =
1e950 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1e960 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  o;.  const unsig
1e970 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20  ned char *aKey1 
1e980 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1e990 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a  d char *)pKey1;.
1e9a0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f    Mem mem1;..  /
1e9b0 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20 74 72  * If bSkip is tr
1e9c0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c  ue, then the cal
1e9d0 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ler has already 
1e9e0 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20  determined that 
1e9f0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
1ea00 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  wo elements in t
1ea10 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  he keys are equa
1ea20 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72 69 6f  l. Fix the vario
1ea30 75 73 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c  us stack variabl
1ea40 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  es so.  ** that 
1ea50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67  this routine beg
1ea60 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74  ins comparing at
1ea70 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c   the second fiel
1ea80 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69  d. */.  if( bSki
1ea90 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b  p ){.    u32 s1;
1eaa0 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20  .    idx1 = 1 + 
1eab0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1eac0 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20  y1[1], s1);.    
1ead0 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30  szHdr1 = aKey1[0
1eae0 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64  ];.    d1 = szHd
1eaf0 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65  r1 + sqlite3Vdbe
1eb00 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31  SerialTypeLen(s1
1eb10 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20  );.    i = 1;.  
1eb20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73    pRhs++;.  }els
1eb30 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65  e{.    idx1 = ge
1eb40 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c  tVarint32(aKey1,
1eb50 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31   szHdr1);.    d1
1eb60 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69   = szHdr1;.    i
1eb70 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29  f( d1>(unsigned)
1eb80 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20  nKey1 ){ .      
1eb90 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1eba0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1ebb0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1ebc0 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43   return 0;  /* C
1ebd0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1ebe0 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20   }.    i = 0;.  
1ebf0 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d  }..  VVA_ONLY( m
1ec00 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30  em1.szMalloc = 0
1ec10 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64  ; ) /* Only need
1ec20 65 64 20 62 79 20 61 73 73 65 72 74 28 29 20 73  ed by assert() s
1ec30 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61  tatements */.  a
1ec40 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1ec50 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b  KeyInfo->nField+
1ec60 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
1ec70 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79  ->nXField>=pPKey
1ec80 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20  2->nField .     
1ec90 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20    || CORRUPT_DB 
1eca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b  );.  assert( pPK
1ecb0 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61  ey2->pKeyInfo->a
1ecc0 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a  SortOrder!=0 );.
1ecd0 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1ece0 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  ->pKeyInfo->nFie
1ecf0 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
1ed00 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c  ( idx1<=szHdr1 |
1ed10 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1ed20 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65    do{.    u32 se
1ed30 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1ed40 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74  /* RHS is an int
1ed50 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  eger */.    if( 
1ed60 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1ed70 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73  M_Int ){.      s
1ed80 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65  erial_type = aKe
1ed90 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20  y1[idx1];.      
1eda0 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61 6c  testcase( serial
1edb0 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20  _type==12 );.   
1edc0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
1edd0 70 65 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20  pe>=10 ){.      
1ede0 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1edf0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1ee00 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20  l_type==0 ){.   
1ee10 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1ee20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65      }else if( se
1ee30 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
1ee40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
1ee50 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b  dbeSerialGet(&aK
1ee60 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f  ey1[d1], serial_
1ee70 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20  type, &mem1);.  
1ee80 20 20 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69        rc = -sqli
1ee90 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1eea0 72 65 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65  re(pRhs->u.i, me
1eeb0 6d 31 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d  m1.u.r);.      }
1eec0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36  else{.        i6
1eed0 34 20 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f  4 lhs = vdbeReco
1eee0 72 64 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69  rdDecodeInt(seri
1eef0 61 6c 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b  al_type, &aKey1[
1ef00 64 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36  d1]);.        i6
1ef10 34 20 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e  4 rhs = pRhs->u.
1ef20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c  i;.        if( l
1ef30 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs<rhs ){.      
1ef40 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1ef50 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c       }else if( l
1ef60 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20  hs>rhs ){.      
1ef70 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1ef80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
1ef90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53     }..    /* RHS
1efa0 20 69 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20   is real */.    
1efb0 65 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66  else if( pRhs->f
1efc0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20  lags & MEM_Real 
1efd0 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1efe0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1eff0 31 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65  1];.      if( se
1f000 72 69 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b  rial_type>=10 ){
1f010 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69  .        /* Seri
1f020 61 6c 20 74 79 70 65 73 20 31 32 20 6f 72 20 67  al types 12 or g
1f030 72 65 61 74 65 72 20 61 72 65 20 73 74 72 69 6e  reater are strin
1f040 67 73 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72  gs and blobs (gr
1f050 65 61 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20  eater than.     
1f060 20 20 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20     ** numbers). 
1f070 54 79 70 65 73 20 31 30 20 61 6e 64 20 31 31 20  Types 10 and 11 
1f080 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72  are currently "r
1f090 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
1f0a0 72 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75  re .        ** u
1f0b0 73 65 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e  se", so it doesn
1f0c0 27 74 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72  't really matter
1f0d0 20 77 68 61 74 20 74 68 65 20 72 65 73 75 6c 74   what the result
1f0e0 73 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20  s of comparing. 
1f0f0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74         ** them t
1f100 6f 20 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65  o numberic value
1f110 73 20 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20  s are.  */.     
1f120 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1f130 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1f140 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20  al_type==0 ){.  
1f150 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f160 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f170 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
1f180 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1f190 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1f1a0 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20  , &mem1);.      
1f1b0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
1f1c0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20  e==7 ){.        
1f1d0 20 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70    if( mem1.u.r<p
1f1e0 52 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20  Rhs->u.r ){.    
1f1f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b          rc = -1;
1f200 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1f210 20 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52   if( mem1.u.r>pR
1f220 68 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20  hs->u.r ){.     
1f230 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1f240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1f270 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f280 28 6d 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d  (mem1.u.i, pRhs-
1f290 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  >u.r);.        }
1f2a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f2b0 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f2c0 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c  string */.    el
1f2d0 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f2e0 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a  gs & MEM_Str ){.
1f2f0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1f300 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1f310 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f320 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1f330 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1f340 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1f350 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1f360 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f370 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28      }else if( !(
1f380 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f390 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f3a0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1f3b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
1f3c0 31 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  1.n = (serial_ty
1f3d0 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1f3e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f3f0 28 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e  (d1+mem1.n)==(un
1f400 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f410 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f420 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d  ( (d1+mem1.n+1)=
1f430 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1f440 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
1f450 28 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75  (d1+mem1.n) > (u
1f460 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b  nsigned)nKey1 ){
1f470 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79  .          pPKey
1f480 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38  2->errCode = (u8
1f490 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  )SQLITE_CORRUPT_
1f4a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20  BKPT;.          
1f4b0 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20  return 0;       
1f4c0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72           /* Corr
1f4d0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1f4e0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79    }else if( pKey
1f4f0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29  Info->aColl[i] )
1f500 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31  {.          mem1
1f510 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  .enc = pKeyInfo-
1f520 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  >enc;.          
1f530 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e  mem1.db = pKeyIn
1f540 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20  fo->db;.        
1f550 20 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d    mem1.flags = M
1f560 45 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20  EM_Str;.        
1f570 20 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72    mem1.z = (char
1f580 2a 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20  *)&aKey1[d1];.  
1f590 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
1f5a0 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1f5b0 67 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g(.             
1f5c0 20 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b   &mem1, pRhs, pK
1f5d0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d  eyInfo->aColl[i]
1f5e0 2c 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f  , &pPKey2->errCo
1f5f0 64 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  de.          );.
1f600 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1f610 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d           int nCm
1f620 70 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20  p = MIN(mem1.n, 
1f630 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20  pRhs->n);.      
1f640 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28      rc = memcmp(
1f650 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73  &aKey1[d1], pRhs
1f660 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20  ->z, nCmp);.    
1f670 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
1f680 29 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20  ) rc = mem1.n - 
1f690 70 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20  pRhs->n; .      
1f6a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1f6b0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1f6c0 20 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65   a blob */.    e
1f6d0 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1f6e0 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29  ags & MEM_Blob )
1f6f0 7b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  {.      getVarin
1f700 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1f710 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1f720 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f730 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f750 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1f760 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f770 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f780 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f790 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1f7a0 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1f7b0 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1f7c0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f7d0 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1f7e0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f7f0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f800 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1f810 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1f830 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1f840 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1f850 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1f860 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1f870 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f880 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1f890 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f8a0 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1f8b0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1f8c0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
1f8d0 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53  nt nCmp = MIN(nS
1f8e0 74 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20  tr, pRhs->n);.  
1f8f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d          rc = mem
1f900 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20  cmp(&aKey1[d1], 
1f910 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a  pRhs->z, nCmp);.
1f920 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f930 3d 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20  ==0 ) rc = nStr 
1f940 2d 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20  - pRhs->n;.     
1f950 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f960 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1f970 73 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c  s null */.    el
1f980 73 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c  se{.      serial
1f990 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64  _type = aKey1[id
1f9a0 78 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x1];.      rc = 
1f9b0 28 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29  (serial_type!=0)
1f9c0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
1f9d0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1f9e0 69 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53  if( pKeyInfo->aS
1f9f0 6f 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20  ortOrder[i] ){. 
1fa00 20 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b         rc = -rc;
1fa10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
1fa20 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
1fa30 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1fa40 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fa50 79 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20  y2, rc) );.     
1fa60 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a   assert( mem1.sz
1fa70 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a  Malloc==0 );  /*
1fa80 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c   See comment bel
1fa90 6f 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ow */.      retu
1faa0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1fab0 20 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b    i++;.    pRhs+
1fac0 2b 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c  +;.    d1 += sql
1fad0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1fae0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
1faf0 65 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20  e);.    idx1 += 
1fb00 73 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e  sqlite3VarintLen
1fb10 28 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20  (serial_type);. 
1fb20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75   }while( idx1<(u
1fb30 6e 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26  nsigned)szHdr1 &
1fb40 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1fb50 6c 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67  ld && d1<=(unsig
1fb60 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20  ned)nKey1 );..  
1fb70 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c  /* No memory all
1fb80 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20  ocation is ever 
1fb90 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50  used on mem1.  P
1fba0 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a  rove this using.
1fbb0 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
1fbc0 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66  ng assert().  If
1fbd0 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61   the assert() fa
1fbe0 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65  ils, it indicate
1fbf0 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20  s a.  ** memory 
1fc00 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20  leak and a need 
1fc10 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56  to call sqlite3V
1fc20 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d  dbeMemRelease(&m
1fc30 65 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65  em1).  */.  asse
1fc40 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1fc50 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63  c==0 );..  /* rc
1fc60 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74  ==0 here means t
1fc70 68 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20  hat one or both 
1fc80 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20  of the keys ran 
1fc90 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e  out of fields an
1fca0 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66  d.  ** all the f
1fcb0 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74  ields up to that
1fcc0 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61   point were equa
1fcd0 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  l. Return the de
1fce0 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61  fault_rc.  ** va
1fcf0 6c 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  lue.  */.  asser
1fd00 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20  t( CORRUPT_DB . 
1fd10 20 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63        || vdbeRec
1fd20 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1fd30 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1fd40 4b 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65  Key2, pPKey2->de
1fd50 66 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20  fault_rc) .     
1fd60 20 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64    || pKeyInfo->d
1fd70 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a  b->mallocFailed.
1fd80 20 20 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65    );.  pPKey2->e
1fd90 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74  qSeen = 1;.  ret
1fda0 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  urn pPKey2->defa
1fdb0 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71  ult_rc;.}.int sq
1fdc0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1fdd0 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b  ompare(.  int nK
1fde0 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
1fdf0 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66  *pKey1,   /* Lef
1fe00 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
1fe10 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
1fe20 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69  2          /* Ri
1fe30 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20  ght key */.){.  
1fe40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1fe50 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57  beRecordCompareW
1fe60 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70  ithSkip(nKey1, p
1fe70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29  Key1, pPKey2, 0)
1fe80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
1fe90 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
1fea0 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
1feb0 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
1fec0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
1fed0 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
1fee0 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
1fef0 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74  pPKey2 is an int
1ff00 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68  eger, and (b) th
1ff10 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65  e .** size-of-he
1ff20 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20 74  ader varint at t
1ff30 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65  he start of (pKe
1ff40 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69  y1/nKey1) fits i
1ff50 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79  n a single.** by
1ff60 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73  te (i.e. is less
1ff70 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a   than 128)..**.*
1ff80 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65  * To avoid conce
1ff90 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65 72  rns about buffer
1ffa0 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69 73   overreads, this
1ffb0 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79   routine is only
1ffc0 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65   used.** on sche
1ffd0 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d 61  mas where the ma
1ffe0 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64  ximum valid head
1fff0 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62 79  er size is 63 by
20000 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a  tes or less..*/.
20010 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52  static int vdbeR
20020 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
20030 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
20040 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
20050 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
20060 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
20070 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20   *pPKey2        
20080 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a  /* Right key */.
20090 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61  ){.  const u8 *a
200a0 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75  Key = &((const u
200b0 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73  8*)pKey1)[*(cons
200c0 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78  t u8*)pKey1 & 0x
200d0 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  3F];.  int seria
200e0 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74  l_type = ((const
200f0 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a   u8*)pKey1)[1];.
20100 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32    int res;.  u32
20110 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69   y;.  u64 x;.  i
20120 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e 61  64 v = pPKey2->a
20130 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69 36  Mem[0].u.i;.  i6
20140 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
20150 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
20160 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
20170 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
20180 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
20190 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
201a0 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
201b0 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
201c0 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
201d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
201e0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
201f0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
20200 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
20210 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
20220 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20230 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20240 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20250 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
20260 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20270 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20280 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
20290 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
202a0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
202b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
202c0 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
202d0 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
202e0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
202f0 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
20300 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20310 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20320 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20330 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20340 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
20350 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20360 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
20370 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
20380 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
20390 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
203a0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
203b0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
203c0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
203d0 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
203e0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
203f0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20400 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
20410 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
20420 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
20430 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20440 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20450 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20470 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
20480 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20490 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
204a0 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
204b0 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
204c0 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
204d0 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
204e0 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
204f0 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
20500 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
20510 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
20520 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
20530 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
20540 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
20550 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
20560 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
20570 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
20580 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
20590 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
205a0 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
205b0 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
205c0 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
205d0 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
205e0 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
205f0 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
20600 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
20610 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
20620 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
20630 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
20640 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
20650 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
20660 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
20670 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
20680 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
20690 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
206a0 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
206b0 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
206c0 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
206d0 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
206e0 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
206f0 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
20700 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
20710 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
20720 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
20730 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20740 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
20750 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
20760 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
20770 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20780 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
20790 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
207a0 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ey2);.  }..  if(
207b0 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65   v>lhs ){.    re
207c0 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
207d0 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68    }else if( v<lh
207e0 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
207f0 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c  PKey2->r2;.  }el
20800 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e  se if( pPKey2->n
20810 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f  Field>1 ){.    /
20820 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65 6c  * The first fiel
20830 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65  ds of the two ke
20840 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f  ys are equal. Co
20850 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c 69  mpare the traili
20860 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ng .    ** field
20870 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d  s.  */.    res =
20880 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
20890 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
208a0 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
208b0 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d 65  pPKey2, 1);.  }e
208c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  lse{.    /* The 
208d0 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
208e0 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72 65  the two keys are
208f0 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72 65   equal and there
20900 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e 67   are no trailing
20910 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20  .    ** fields. 
20920 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64  Return pPKey2->d
20930 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68 69  efault_rc in thi
20940 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 72  s case. */.    r
20950 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66  es = pPKey2->def
20960 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 70 50 4b  ault_rc;.    pPK
20970 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
20980 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
20990 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
209a0 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
209b0 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73  ey1, pPKey2, res
209c0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65  ) );.  return re
209d0 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  s;.}../*.** This
209e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20   function is an 
209f0 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f  optimized versio
20a00 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65  n of sqlite3Vdbe
20a10 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20  RecordCompare() 
20a20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65  .** that (a) the
20a30 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20   first field of 
20a40 70 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69  pPKey2 is a stri
20a50 6e 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65  ng, that (b) the
20a60 20 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20   first field.** 
20a70 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  uses the collati
20a80 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
20a90 52 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20  RY and (c) that 
20aa0 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  the size-of-head
20ab0 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74  er varint .** at
20ac0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
20ad0 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
20ae0 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74   in a single byt
20af0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
20b00 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20b10 72 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20  reString(.  int 
20b20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
20b30 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66  d *pKey1, /* Lef
20b40 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63  t key */.  Unpac
20b50 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79  kedRecord *pPKey
20b60 32 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68  2        /* Righ
20b70 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f  t key */.){.  co
20b80 6e 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20  nst u8 *aKey1 = 
20b90 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
20ba0 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74  ;.  int serial_t
20bb0 79 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  ype;.  int res;.
20bc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
20bd0 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73  2->aMem[0].flags
20be0 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20   & MEM_Str );.  
20bf0 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
20c00 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
20c10 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20c20 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 29  PKey2->pKeyInfo)
20c30 3b 0a 20 20 67 65 74 56 61 72 69 6e 74 33 32 28  ;.  getVarint32(
20c40 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61  &aKey1[1], seria
20c50 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73  l_type);.  if( s
20c60 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b  erial_type<12 ){
20c70 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79  .    res = pPKey
20c80 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28  2->r1;      /* (
20c90 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20  pKey1/nKey1) is 
20ca0 61 20 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75  a number or a nu
20cb0 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  ll */.  }else if
20cc0 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20  ( !(serial_type 
20cd0 26 20 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20  & 0x01) ){ .    
20ce0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32  res = pPKey2->r2
20cf0 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
20d00 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f  /nKey1) is a blo
20d10 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  b */.  }else{.  
20d20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20    int nCmp;.    
20d30 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e  int nStr;.    in
20d40 74 20 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b  t szHdr = aKey1[
20d50 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20  0];..    nStr = 
20d60 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
20d70 20 2f 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73   / 2;.    if( (s
20d80 7a 48 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e  zHdr + nStr) > n
20d90 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50  Key1 ){.      pP
20da0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
20db0 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
20dc0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
20dd0 65 74 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43  eturn 0;    /* C
20de0 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
20df0 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49   }.    nCmp = MI
20e00 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b  N( pPKey2->aMem[
20e10 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20  0].n, nStr );.  
20e20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26    res = memcmp(&
20e30 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50  aKey1[szHdr], pP
20e40 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c  Key2->aMem[0].z,
20e50 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28   nCmp);..    if(
20e60 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
20e70 20 72 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50   res = nStr - pP
20e80 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b  Key2->aMem[0].n;
20e90 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d  .      if( res==
20ea0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
20eb0 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e   pPKey2->nField>
20ec0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
20ed0 65 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  es = sqlite3Vdbe
20ee0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20ef0 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
20f00 79 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a  y1, pPKey2, 1);.
20f10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
20f20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 70           res = p
20f30 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
20f40 63 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 4b  c;.          pPK
20f50 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
20f60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20f70 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
20f80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20   ){.        res 
20f90 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
20fa0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20fb0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20fc0 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  >r1;.      }.   
20fd0 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30   }else if( res>0
20fe0 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20   ){.      res = 
20ff0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
21000 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73  }else{.      res
21010 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20   = pPKey2->r1;. 
21020 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
21030 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f  rt( vdbeRecordCo
21040 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31  mpareDebug(nKey1
21050 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c  , pKey1, pPKey2,
21060 20 72 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20   res).       || 
21070 43 4f 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20  CORRUPT_DB.     
21080 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65    || pPKey2->pKe
21090 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  yInfo->db->mallo
210a0 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72  cFailed.  );.  r
210b0 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a  eturn res;.}../*
210c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
210d0 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74  nter to an sqlit
210e0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
210f0 61 72 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65  are() compatible
21100 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69   function.** sui
21110 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72  table for compar
21120 69 6e 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72  ing serialized r
21130 65 63 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e  ecords to the un
21140 70 61 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61  packed record pa
21150 73 73 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f  ssed.** as the o
21160 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  nly argument..*/
21170 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73  .RecordCompare s
21180 71 6c 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f  qlite3VdbeFindCo
21190 6d 70 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65  mpare(UnpackedRe
211a0 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76  cord *p){.  /* v
211b0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
211c0 72 65 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69  reInt() and vari
211d0 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  ntRecordCompareS
211e0 74 72 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73  tring() both ass
211f0 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68  ume.  ** that th
21200 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72  e size-of-header
21210 20 76 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63   varint that occ
21220 75 72 73 20 61 74 20 74 68 65 20 73 74 61 72 74  urs at the start
21230 20 6f 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a   of each record.
21240 20 20 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73    ** fits in a s
21250 69 6e 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e  ingle byte (i.e.
21260 20 69 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29   is 127 or less)
21270 2e 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  . varintRecordCo
21280 6d 70 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20  mpareInt().  ** 
21290 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
212a0 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
212b0 6f 76 65 72 72 65 61 64 20 61 20 62 75 66 66 65  overread a buffe
212c0 72 20 62 79 20 61 74 20 6c 65 61 73 74 20 74 68  r by at least th
212d0 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20  e .  ** maximum 
212e0 70 6f 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68  possible legal h
212f0 65 61 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20  eader size plus 
21300 38 20 62 79 74 65 73 2e 20 42 65 63 61 75 73 65  8 bytes. Because
21310 20 74 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67   there is.  ** g
21320 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
21330 61 74 20 6c 65 61 73 74 20 37 34 20 28 62 75 74  at least 74 (but
21340 20 6e 6f 74 20 31 33 36 29 20 62 79 74 65 73 20   not 136) bytes 
21350 6f 66 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f  of padding follo
21360 77 69 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62  wing each.  ** b
21370 75 66 66 65 72 20 70 61 73 73 65 64 20 74 6f 20  uffer passed to 
21380 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
21390 61 72 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61  areInt() this ma
213a0 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e  kes it convenien
213b0 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20  t to.  ** limit 
213c0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
213d0 68 65 61 64 65 72 20 74 6f 20 36 34 20 62 79 74  header to 64 byt
213e0 65 73 20 69 6e 20 63 61 73 65 73 20 77 68 65 72  es in cases wher
213f0 65 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  e the first fiel
21400 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74  d.  ** is an int
21410 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  eger..  **.  ** 
21420 54 68 65 20 65 61 73 69 65 73 74 20 77 61 79 20  The easiest way 
21430 74 6f 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20  to enforce this 
21440 6c 69 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73  limit is to cons
21450 69 64 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64  ider only record
21460 73 20 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66  s with.  ** 13 f
21470 69 65 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49  ields or less. I
21480 66 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c  f the first fiel
21490 64 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c  d is an integer,
214a0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   the maximum leg
214b0 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73  al.  ** header s
214c0 69 7a 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31  ize is (12*5 + 1
214d0 20 2b 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f   + 1) bytes.  */
214e0 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49  .  if( (p->pKeyI
214f0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d  nfo->nField + p-
21500 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65  >pKeyInfo->nXFie
21510 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69  ld)<=13 ){.    i
21520 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d  nt flags = p->aM
21530 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20  em[0].flags;.   
21540 20 69 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f   if( p->pKeyInfo
21550 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20  ->aSortOrder[0] 
21560 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d  ){.      p->r1 =
21570 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20   1;.      p->r2 
21580 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
21590 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d  .      p->r1 = -
215a0 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d  1;.      p->r2 =
215b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
215c0 28 20 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  ( (flags & MEM_I
215d0 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  nt) ){.      ret
215e0 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f  urn vdbeRecordCo
215f0 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a  mpareInt;.    }.
21600 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
21610 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
21620 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
21630 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
21640 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
21650 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c  ( flags & MEM_Bl
21660 6f 62 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66  ob );.    if( (f
21670 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c  lags & (MEM_Real
21680 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c  |MEM_Null|MEM_Bl
21690 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b  ob))==0 && p->pK
216a0 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d  eyInfo->aColl[0]
216b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
216c0 65 72 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ert( flags & MEM
216d0 5f 53 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65  _Str );.      re
216e0 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43  turn vdbeRecordC
216f0 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20  ompareString;.  
21700 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
21710 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  n sqlite3VdbeRec
21720 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f  ordCompare;.}../
21730 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73  *.** pCur points
21740 20 61 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74   at an index ent
21750 72 79 20 63 72 65 61 74 65 64 20 75 73 69 6e 67  ry created using
21760 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
21770 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65  rd opcode..** Re
21780 61 64 20 74 68 65 20 72 6f 77 69 64 20 28 74 68  ad the rowid (th
21790 65 20 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20  e last field in 
217a0 74 68 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20  the record) and 
217b0 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77  store it in *row
217c0 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  id..** Return SQ
217d0 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
217e0 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20  thing works, or 
217f0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74  an error code ot
21800 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70  herwise..**.** p
21810 43 75 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69  Cur might be poi
21820 6e 74 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62  nting to text ob
21830 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f  tained from a co
21840 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
21850 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63  ile..** So the c
21860 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65  ontent cannot be
21870 20 74 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70   trusted.  Do ap
21880 70 72 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73  propriate checks
21890 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e   on the content.
218a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
218b0 64 62 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69  dbeIdxRowid(sqli
218c0 74 65 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f  te3 *db, BtCurso
218d0 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f  r *pCur, i64 *ro
218e0 77 69 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c  wid){.  i64 nCel
218f0 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lKey = 0;.  int 
21900 72 63 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b  rc;.  u32 szHdr;
21910 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
21920 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f  of the header */
21930 0a 20 20 75 33 32 20 74 79 70 65 52 6f 77 69 64  .  u32 typeRowid
21940 3b 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74  ;    /* Serial t
21950 79 70 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64  ype of the rowid
21960 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77   */.  u32 lenRow
21970 69 64 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20  id;     /* Size 
21980 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a  of the rowid */.
21990 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f    Mem m, v;..  /
219a0 2a 20 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f  * Get the size o
219b0 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72  f the index entr
219c0 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73  y.  Only indices
219d0 20 65 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73   entries of less
219e0 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20  .  ** than 2GiB 
219f0 61 72 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e  are support - an
21a00 79 74 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73  ything large mus
21a10 74 20 62 65 20 64 61 74 61 62 61 73 65 20 63 6f  t be database co
21a20 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41  rruption..  ** A
21a30 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  ny corruption is
21a40 20 64 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c   detected in sql
21a50 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21a60 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c  llPtr(), though,
21a70 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f   so.  ** this co
21a80 64 65 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73  de can safely as
21a90 73 75 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b  sume that nCellK
21aa0 65 79 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a  ey is 32-bits  .
21ab0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73    */.  assert( s
21ac0 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
21ad0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
21ae0 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 73  ;.  nCellKey = s
21af0 71 6c 69 74 65 33 42 74 72 65 65 50 61 79 6c 6f  qlite3BtreePaylo
21b00 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a 20 20  adSize(pCur);.  
21b10 61 73 73 65 72 74 28 20 28 6e 43 65 6c 6c 4b 65  assert( (nCellKe
21b20 79 20 26 20 53 51 4c 49 54 45 5f 4d 41 58 5f 55  y & SQLITE_MAX_U
21b30 33 32 29 3d 3d 28 75 36 34 29 6e 43 65 6c 6c 4b  32)==(u64)nCellK
21b40 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 61 64  ey );..  /* Read
21b50 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c 65 74 65   in the complete
21b60 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
21b70 69 6e 64 65 78 20 65 6e 74 72 79 20 2a 2f 0a 20  index entry */. 
21b80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
21b90 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29 3b 0a  nit(&m, db, 0);.
21ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64    rc = sqlite3Vd
21bb0 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65 28 70  beMemFromBtree(p
21bc0 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e 43 65  Cur, 0, (u32)nCe
21bd0 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20  llKey, 1, &m);. 
21be0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21bf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
21c00 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 65 6e   /* The index en
21c10 74 72 79 20 6d 75 73 74 20 62 65 67 69 6e 20 77  try must begin w
21c20 69 74 68 20 61 20 68 65 61 64 65 72 20 73 69 7a  ith a header siz
21c30 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  e */.  (void)get
21c40 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 6d 2e  Varint32((u8*)m.
21c50 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20 74 65 73  z, szHdr);.  tes
21c60 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d 33 20  tcase( szHdr==3 
21c70 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  );.  testcase( s
21c80 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a 20 20 69  zHdr==m.n );.  i
21c90 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73 7a 48 64  f( unlikely(szHd
21ca0 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73 7a 48 64  r<3 || (int)szHd
21cb0 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20 20 67 6f  r>m.n) ){.    go
21cc0 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72  to idx_rowid_cor
21cd0 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20  ruption;.  }..  
21ce0 2f 2a 20 54 68 65 20 6c 61 73 74 20 66 69 65 6c  /* The last fiel
21cf0 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 73  d of the index s
21d00 68 6f 75 6c 64 20 62 65 20 61 6e 20 69 6e 74 65  hould be an inte
21d10 67 65 72 20 2d 20 74 68 65 20 52 4f 57 49 44 2e  ger - the ROWID.
21d20 0a 20 20 2a 2a 20 56 65 72 69 66 79 20 74 68 61  .  ** Verify tha
21d30 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
21d40 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 69 6e   really is an in
21d50 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28 76 6f 69  teger. */.  (voi
21d60 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
21d70 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72 2d 31 5d  8*)&m.z[szHdr-1]
21d80 2c 20 74 79 70 65 52 6f 77 69 64 29 3b 0a 20 20  , typeRowid);.  
21d90 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21da0 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74 65 73 74  wid==1 );.  test
21db0 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21dc0 3d 32 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =2 );.  testcase
21dd0 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 33 20 29  ( typeRowid==3 )
21de0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21df0 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b 0a 20 20  peRowid==4 );.  
21e00 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f  testcase( typeRo
21e10 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74 65 73 74  wid==5 );.  test
21e20 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d  case( typeRowid=
21e30 3d 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =6 );.  testcase
21e40 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 38 20 29  ( typeRowid==8 )
21e50 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79  ;.  testcase( ty
21e60 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b 0a 20 20  peRowid==9 );.  
21e70 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 74 79 70  if( unlikely(typ
21e80 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74 79 70 65  eRowid<1 || type
21e90 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79 70 65 52  Rowid>9 || typeR
21ea0 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20 20 20 20  owid==7) ){.    
21eb0 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
21ec0 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20  orruption;.  }. 
21ed0 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73 71 6c 69   lenRowid = sqli
21ee0 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65  te3SmallTypeSize
21ef0 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b 0a 20 20  s[typeRowid];.  
21f00 74 65 73 74 63 61 73 65 28 20 28 75 33 32 29 6d  testcase( (u32)m
21f10 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77  .n==szHdr+lenRow
21f20 69 64 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  id );.  if( unli
21f30 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a  kely((u32)m.n<sz
21f40 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b  Hdr+lenRowid) ){
21f50 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
21f60 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
21f70 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20    }..  /* Fetch 
21f80 74 68 65 20 69 6e 74 65 67 65 72 20 6f 66 66 20  the integer off 
21f90 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
21fa0 6e 64 65 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20  ndex record */. 
21fb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
21fc0 61 6c 47 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b  alGet((u8*)&m.z[
21fd0 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74  m.n-lenRowid], t
21fe0 79 70 65 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20  ypeRowid, &v);. 
21ff0 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b   *rowid = v.u.i;
22000 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22010 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20  mRelease(&m);.  
22020 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22030 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72  ;..  /* Jump her
22040 65 20 69 66 20 64 61 74 61 62 61 73 65 20 63 6f  e if database co
22050 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
22060 63 74 65 64 20 61 66 74 65 72 20 6d 20 68 61 73  cted after m has
22070 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63   been.  ** alloc
22080 61 74 65 64 2e 20 20 46 72 65 65 20 74 68 65 20  ated.  Free the 
22090 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 74  m object and ret
220a0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
220b0 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64  PT. */.idx_rowid
220c0 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74  _corruption:.  t
220d0 65 73 74 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c  estcase( m.szMal
220e0 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  loc!=0 );.  sqli
220f0 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
22100 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(&m);.  return 
22110 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22120 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  KPT;.}../*.** Co
22130 6d 70 61 72 65 20 74 68 65 20 6b 65 79 20 6f 66  mpare the key of
22140 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
22150 20 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 20   that cursor pC 
22160 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61  is pointing to a
22170 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65  gainst.** the ke
22180 79 20 73 74 72 69 6e 67 20 69 6e 20 70 55 6e 70  y string in pUnp
22190 61 63 6b 65 64 2e 20 20 57 72 69 74 65 20 69 6e  acked.  Write in
221a0 74 6f 20 2a 70 52 65 73 20 61 20 6e 75 6d 62 65  to *pRes a numbe
221b0 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 6e 65 67  r.** that is neg
221c0 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20  ative, zero, or 
221d0 70 6f 73 69 74 69 76 65 20 69 66 20 70 43 20 69  positive if pC i
221e0 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75  s less than, equ
221f0 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65  al to,.** or gre
22200 61 74 65 72 20 74 68 61 6e 20 70 55 6e 70 61 63  ater than pUnpac
22210 6b 65 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ked.  Return SQL
22220 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
22230 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b  s..**.** pUnpack
22240 65 64 20 69 73 20 65 69 74 68 65 72 20 63 72 65  ed is either cre
22250 61 74 65 64 20 77 69 74 68 6f 75 74 20 61 20 72  ated without a r
22260 6f 77 69 64 20 6f 72 20 69 73 20 74 72 75 6e 63  owid or is trunc
22270 61 74 65 64 20 73 6f 20 74 68 61 74 20 69 74 0a  ated so that it.
22280 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20 72 6f 77  ** omits the row
22290 69 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  id at the end.  
222a0 54 68 65 20 72 6f 77 69 64 20 61 74 20 74 68 65  The rowid at the
222b0 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
222c0 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67  x entry.** is ig
222d0 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c 2e 20 20  nored as well.  
222e0 48 65 6e 63 65 2c 20 74 68 69 73 20 72 6f 75 74  Hence, this rout
222f0 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65  ine only compare
22300 73 20 74 68 65 20 70 72 65 66 69 78 65 73 20 0a  s the prefixes .
22310 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79 73 20 70  ** of the keys p
22320 72 69 6f 72 20 74 6f 20 74 68 65 20 66 69 6e 61  rior to the fina
22330 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65  l rowid, not the
22340 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a   entire key..*/.
22350 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49  int sqlite3VdbeI
22360 64 78 4b 65 79 43 6f 6d 70 61 72 65 28 0a 20 20  dxKeyCompare(.  
22370 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22390 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
223a0 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62  nection */.  Vdb
223b0 65 43 75 72 73 6f 72 20 2a 70 43 2c 20 20 20 20  eCursor *pC,    
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
223d0 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 63   The cursor to c
223e0 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74 20 2a  ompare against *
223f0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
22400 72 64 20 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20  rd *pUnpacked,  
22410 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64       /* Unpacked
22420 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20   version of key 
22430 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73 20 20 20  */.  int *res   
22440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22450 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
22460 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65  he comparison re
22470 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  sult here */.){.
22480 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d    i64 nCellKey =
22490 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
224a0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a  BtCursor *pCur;.
224b0 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61 73 73 65    Mem m;..  asse
224c0 72 74 28 20 70 43 2d 3e 65 43 75 72 54 79 70 65  rt( pC->eCurType
224d0 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20  ==CURTYPE_BTREE 
224e0 29 3b 0a 20 20 70 43 75 72 20 3d 20 70 43 2d 3e  );.  pCur = pC->
224f0 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20 20 61 73  uc.pCursor;.  as
22500 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
22510 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69 64 28  eeCursorIsValid(
22520 70 43 75 72 29 20 29 3b 0a 20 20 6e 43 65 6c 6c  pCur) );.  nCell
22530 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 42 74 72  Key = sqlite3Btr
22540 65 65 50 61 79 6c 6f 61 64 53 69 7a 65 28 70 43  eePayloadSize(pC
22550 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b  ur);.  /* nCellK
22560 65 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  ey will always b
22570 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
22580 30 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75  0xffffffff becau
22590 73 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20  se of the way.  
225a0 2a 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72  ** that btreePar
225b0 73 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20  seCellPtr() and 
225c0 73 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74  sqlite3GetVarint
225d0 33 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65  32() are impleme
225e0 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43  nted */.  if( nC
225f0 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65  ellKey<=0 || nCe
22600 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66  llKey>0x7fffffff
22610 20 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30   ){.    *res = 0
22620 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
22630 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
22640 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
22650 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64  dbeMemInit(&m, d
22660 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71  b, 0);.  rc = sq
22670 6c 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d  lite3VdbeMemFrom
22680 42 74 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28  Btree(pCur, 0, (
22690 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c  u32)nCellKey, 1,
226a0 20 26 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29   &m);.  if( rc )
226b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
226c0 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d 20 73 71  .  }.  *res = sq
226d0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
226e0 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c  ompare(m.n, m.z,
226f0 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20 20 73   pUnpacked);.  s
22700 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
22710 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
22720 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
22730 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
22740 69 6e 65 20 73 65 74 73 20 74 68 65 20 76 61 6c  ine sets the val
22750 75 65 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65  ue to be returne
22760 64 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  d by subsequent 
22770 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
22780 74 65 33 5f 63 68 61 6e 67 65 73 28 29 20 6f 6e  te3_changes() on
22790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
227a0 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a 2f 0a 76  ndle 'db'. .*/.v
227b0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53  oid sqlite3VdbeS
227c0 65 74 43 68 61 6e 67 65 73 28 73 71 6c 69 74 65  etChanges(sqlite
227d0 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43 68 61 6e  3 *db, int nChan
227e0 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ge){.  assert( s
227f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
22800 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
22810 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20    db->nChange = 
22820 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62 2d 3e 6e  nChange;.  db->n
22830 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b 3d 20 6e  TotalChange += n
22840 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
22850 20 53 65 74 20 61 20 66 6c 61 67 20 69 6e 20 74   Set a flag in t
22860 68 65 20 76 64 62 65 20 74 6f 20 75 70 64 61 74  he vdbe to updat
22870 65 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  e the change cou
22880 6e 74 65 72 20 77 68 65 6e 20 69 74 20 69 73 20  nter when it is 
22890 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20 6f 72 20  finalised.** or 
228a0 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  reset..*/.void s
228b0 71 6c 69 74 65 33 56 64 62 65 43 6f 75 6e 74 43  qlite3VdbeCountC
228c0 68 61 6e 67 65 73 28 56 64 62 65 20 2a 76 29 7b  hanges(Vdbe *v){
228d0 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43 6e 74 4f  .  v->changeCntO
228e0 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n = 1;.}../*.** 
228f0 4d 61 72 6b 20 65 76 65 72 79 20 70 72 65 70 61  Mark every prepa
22900 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 61 73  red statement as
22910 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20  sociated with a 
22920 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
22930 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70 69 72 65  ion.** as expire
22940 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 78 70 69  d..**.** An expi
22950 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6d 65  red statement me
22960 61 6e 73 20 74 68 61 74 20 72 65 63 6f 6d 70 69  ans that recompi
22970 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
22980 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a 20 72 65  atement is.** re
22990 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61 74 65 6d  commend.  Statem
229a0 65 6e 74 73 20 65 78 70 69 72 65 20 77 68 65 6e  ents expire when
229b0 20 74 68 69 6e 67 73 20 68 61 70 70 65 6e 20 74   things happen t
229c0 68 61 74 20 6d 61 6b 65 20 74 68 65 69 72 0a 2a  hat make their.*
229d0 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62 73 6f 6c  * programs obsol
229e0 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e 67 20 75  ete.  Removing u
229f0 73 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63  ser-defined func
22a00 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c 61 74 69  tions or collati
22a10 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 73 2c  ng.** sequences,
22a20 20 6f 72 20 63 68 61 6e 67 69 6e 67 20 61 6e 20   or changing an 
22a30 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 66 75  authorization fu
22a40 6e 63 74 69 6f 6e 20 61 72 65 20 74 68 65 20 74  nction are the t
22a50 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68 69 6e 67  ypes of.** thing
22a60 73 20 74 68 61 74 20 6d 61 6b 65 20 70 72 65 70  s that make prep
22a70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
22a80 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a 76 6f 69  obsolete..*/.voi
22a90 64 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50  d sqlite3ExpireP
22aa0 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
22ab0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
22ac0 20 20 56 64 62 65 20 2a 70 3b 0a 20 20 66 6f 72    Vdbe *p;.  for
22ad0 28 70 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 20  (p = db->pVdbe; 
22ae0 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
22af0 20 20 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d      p->expired =
22b00 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
22b10 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61   Return the data
22b20 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20  base associated 
22b30 77 69 74 68 20 74 68 65 20 56 64 62 65 2e 0a 2a  with the Vdbe..*
22b40 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74  /.sqlite3 *sqlit
22b50 65 33 56 64 62 65 44 62 28 56 64 62 65 20 2a 76  e3VdbeDb(Vdbe *v
22b60 29 7b 0a 20 20 72 65 74 75 72 6e 20 76 2d 3e 64  ){.  return v->d
22b70 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  b;.}../*.** Retu
22b80 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
22b90 61 6e 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  an sqlite3_value
22ba0 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
22bb0 69 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20  ining the value 
22bc0 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61 6d 65 74  bound.** paramet
22bd0 65 72 20 69 56 61 72 20 6f 66 20 56 4d 20 76 2e  er iVar of VM v.
22be0 20 45 78 63 65 70 74 2c 20 69 66 20 74 68 65 20   Except, if the 
22bf0 76 61 6c 75 65 20 69 73 20 61 6e 20 53 51 4c 20  value is an SQL 
22c00 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 0a 2a 2a  NULL, return .**
22c10 20 30 20 69 6e 73 74 65 61 64 2e 20 55 6e 6c 65   0 instead. Unle
22c20 73 73 20 69 74 20 69 73 20 4e 55 4c 4c 2c 20 61  ss it is NULL, a
22c30 70 70 6c 79 20 61 66 66 69 6e 69 74 79 20 61 66  pply affinity af
22c40 66 20 28 6f 6e 65 20 6f 66 20 74 68 65 20 53 51  f (one of the SQ
22c50 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a 20 63 6f  LITE_AFF_*.** co
22c60 6e 73 74 61 6e 74 73 29 20 74 6f 20 74 68 65 20  nstants) to the 
22c70 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65 74  value before ret
22c80 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a 2a  urning it..**.**
22c90 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
22ca0 6c 75 65 20 6d 75 73 74 20 62 65 20 66 72 65 65  lue must be free
22cb0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
22cc0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56 61 6c  using sqlite3Val
22cd0 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a 73 71 6c  ueFree()..*/.sql
22ce0 69 74 65 33 5f 76 61 6c 75 65 20 2a 73 71 6c 69  ite3_value *sqli
22cf0 74 65 33 56 64 62 65 47 65 74 42 6f 75 6e 64 56  te3VdbeGetBoundV
22d00 61 6c 75 65 28 56 64 62 65 20 2a 76 2c 20 69 6e  alue(Vdbe *v, in
22d10 74 20 69 56 61 72 2c 20 75 38 20 61 66 66 29 7b  t iVar, u8 aff){
22d20 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72 3e  .  assert( iVar>
22d30 30 20 29 3b 0a 20 20 69 66 28 20 76 20 29 7b 0a  0 );.  if( v ){.
22d40 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
22d50 26 76 2d 3e 61 56 61 72 5b 69 56 61 72 2d 31 5d  &v->aVar[iVar-1]
22d60 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 70 4d  ;.    if( 0==(pM
22d70 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
22d80 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20 20 20 73  Null) ){.      s
22d90 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 52  qlite3_value *pR
22da0 65 74 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  et = sqlite3Valu
22db0 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a 20 20 20  eNew(v->db);.   
22dc0 20 20 20 69 66 28 20 70 52 65 74 20 29 7b 0a 20     if( pRet ){. 
22dd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
22de0 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65 6d 20 2a  beMemCopy((Mem *
22df0 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b 0a 20 20  )pRet, pMem);.  
22e00 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
22e10 75 65 41 70 70 6c 79 41 66 66 69 6e 69 74 79 28  ueApplyAffinity(
22e20 70 52 65 74 2c 20 61 66 66 2c 20 53 51 4c 49 54  pRet, aff, SQLIT
22e30 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 20 20 7d  E_UTF8);.      }
22e40 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 52  .      return pR
22e50 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  et;.    }.  }.  
22e60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
22e70 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 53 51 4c  ** Configure SQL
22e80 20 76 61 72 69 61 62 6c 65 20 69 56 61 72 20 73   variable iVar s
22e90 6f 20 74 68 61 74 20 62 69 6e 64 69 6e 67 20 61  o that binding a
22ea0 20 6e 65 77 20 76 61 6c 75 65 20 74 6f 20 69 74   new value to it
22eb0 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74 6f 20 73   signals.** to s
22ec0 71 6c 69 74 65 33 5f 72 65 6f 70 74 69 6d 69 7a  qlite3_reoptimiz
22ed0 65 28 29 20 74 68 61 74 20 72 65 2d 70 72 65 70  e() that re-prep
22ee0 61 72 69 6e 67 20 74 68 65 20 73 74 61 74 65 6d  aring the statem
22ef0 65 6e 74 20 6d 61 79 20 72 65 73 75 6c 74 0a 2a  ent may result.*
22f00 2a 20 69 6e 20 61 20 62 65 74 74 65 72 20 71 75  * in a better qu
22f10 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69  ery plan..*/.voi
22f20 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  d sqlite3VdbeSet
22f30 56 61 72 6d 61 73 6b 28 56 64 62 65 20 2a 76 2c  Varmask(Vdbe *v,
22f40 20 69 6e 74 20 69 56 61 72 29 7b 0a 20 20 61 73   int iVar){.  as
22f50 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
22f60 20 20 69 66 28 20 69 56 61 72 3e 33 32 20 29 7b    if( iVar>32 ){
22f70 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b 20  .    v->expmask 
22f80 3d 20 30 78 66 66 66 66 66 66 66 66 3b 0a 20 20  = 0xffffffff;.  
22f90 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d 3e 65 78  }else{.    v->ex
22fa0 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33 32 29 31  pmask |= ((u32)1
22fb0 20 3c 3c 20 28 69 56 61 72 2d 31 29 29 3b 0a 20   << (iVar-1));. 
22fc0 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51   }.}..#ifndef SQ
22fd0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
22fe0 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 72 61  LTABLE./*.** Tra
22ff0 6e 73 66 65 72 20 65 72 72 6f 72 20 6d 65 73 73  nsfer error mess
23000 61 67 65 20 74 65 78 74 20 66 72 6f 6d 20 61 6e  age text from an
23010 20 73 71 6c 69 74 65 33 5f 76 74 61 62 2e 7a 45   sqlite3_vtab.zE
23020 72 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72  rrMsg (text stor
23030 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20  ed.** in memory 
23040 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
23050 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 69 6e  lite3_malloc) in
23060 74 6f 20 61 20 56 64 62 65 2e 7a 45 72 72 4d 73  to a Vdbe.zErrMs
23070 67 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a  g (text stored.*
23080 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  * in memory obta
23090 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
230a0 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76  3DbMalloc)..*/.v
230b0 6f 69 64 20 73 71 6c 69 74 65 33 56 74 61 62 49  oid sqlite3VtabI
230c0 6d 70 6f 72 74 45 72 72 6d 73 67 28 56 64 62 65  mportErrmsg(Vdbe
230d0 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f 76 74 61   *p, sqlite3_vta
230e0 62 20 2a 70 56 74 61 62 29 7b 0a 20 20 69 66 28  b *pVtab){.  if(
230f0 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20   pVtab->zErrMsg 
23100 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  ){.    sqlite3 *
23110 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  db = p->db;.    
23120 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23130 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
23140 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
23150 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
23160 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  db, pVtab->zErrM
23170 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  sg);.    sqlite3
23180 5f 66 72 65 65 28 70 56 74 61 62 2d 3e 7a 45 72  _free(pVtab->zEr
23190 72 4d 73 67 29 3b 0a 20 20 20 20 70 56 74 61 62  rMsg);.    pVtab
231a0 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
231b0 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
231c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
231d0 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23 69 66 64  ALTABLE */..#ifd
231e0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
231f0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
23200 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  ./*.** If the se
23210 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
23220 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65 6c 65 61   not NULL, relea
23230 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61 74 69 6f  se any allocatio
23240 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  ns associated .*
23250 2a 20 77 69 74 68 20 74 68 65 20 6d 65 6d 6f 72  * with the memor
23260 79 20 63 65 6c 6c 73 20 69 6e 20 74 68 65 20 70  y cells in the p
23270 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61 79 2e 20  ->aMem[] array. 
23280 41 6c 73 6f 20 66 72 65 65 20 74 68 65 20 55 6e  Also free the Un
23290 70 61 63 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20  packedRecord.** 
232a0 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
232b0 2c 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44  , using sqlite3D
232c0 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  bFree()..**.** T
232d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
232e0 75 73 65 64 20 74 6f 20 66 72 65 65 20 55 6e 70  used to free Unp
232f0 61 63 6b 65 64 52 65 63 6f 72 64 20 73 74 72 75  ackedRecord stru
23300 63 74 75 72 65 73 20 61 6c 6c 6f 63 61 74 65 64  ctures allocated
23310 20 62 79 0a 2a 2a 20 74 68 65 20 76 64 62 65 55   by.** the vdbeU
23320 6e 70 61 63 6b 52 65 63 6f 72 64 28 29 20 66 75  npackRecord() fu
23330 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 6e 20  nction found in 
23340 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f 0a 73 74  vdbeapi.c..*/.st
23350 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 46 72  atic void vdbeFr
23360 65 65 55 6e 70 61 63 6b 65 64 28 73 71 6c 69 74  eeUnpacked(sqlit
23370 65 33 20 2a 64 62 2c 20 55 6e 70 61 63 6b 65 64  e3 *db, Unpacked
23380 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 69 66  Record *p){.  if
23390 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ( p ){.    int i
233a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
233b0 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29  <p->nField; i++)
233c0 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70 4d 65  {.      Mem *pMe
233d0 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 69 5d 3b  m = &p->aMem[i];
233e0 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 2d  .      if( pMem-
233f0 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  >zMalloc ) sqlit
23400 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
23410 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pMem);.    }.  
23420 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
23430 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  db, p);.  }.}.#e
23440 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
23450 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f  NABLE_PREUPDATE_
23460 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64 65 66 20  HOOK */..#ifdef 
23470 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52  SQLITE_ENABLE_PR
23480 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a  EUPDATE_HOOK./*.
23490 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 70 72  ** Invoke the pr
234a0 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b 2e 20 49  e-update hook. I
234b0 66 20 74 68 69 73 20 69 73 20 61 6e 20 55 50 44  f this is an UPD
234c0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 70 72  ATE or DELETE pr
234d0 65 2d 75 70 64 61 74 65 20 63 61 6c 6c 2c 0a 2a  e-update call,.*
234e0 2a 20 74 68 65 6e 20 63 75 72 73 6f 72 20 70 61  * then cursor pa
234f0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
23500 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
23510 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ld point to the 
23520 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20 74 6f 20  row about.** to 
23530 62 65 20 75 70 64 61 74 65 20 6f 72 20 64 65 6c  be update or del
23540 65 74 65 64 2e 20 49 66 20 74 68 65 20 61 70 70  eted. If the app
23550 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c 73 20 73  lication calls s
23560 71 6c 69 74 65 33 5f 70 72 65 75 70 64 61 74 65  qlite3_preupdate
23570 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68 65 20 72  _old(),.** the r
23580 65 71 75 69 72 65 64 20 76 61 6c 75 65 20 77 69  equired value wi
23590 6c 6c 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ll be read from 
235a0 74 68 65 20 72 6f 77 20 74 68 65 20 63 75 72 73  the row the curs
235b0 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e 0a 2a 2f  or points to..*/
235c0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
235d0 65 50 72 65 55 70 64 61 74 65 48 6f 6f 6b 28 0a  ePreUpdateHook(.
235e0 20 20 56 64 62 65 20 2a 76 2c 20 20 20 20 20 20    Vdbe *v,      
235f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23600 20 20 2f 2a 20 56 64 62 65 20 70 72 65 2d 75 70    /* Vdbe pre-up
23610 64 61 74 65 20 68 6f 6f 6b 20 69 73 20 69 6e 76  date hook is inv
23620 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20 56 64 62  oked by */.  Vdb
23630 65 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 20  eCursor *pCsr,  
23640 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23650 43 75 72 73 6f 72 20 74 6f 20 67 72 61 62 20 6f  Cursor to grab o
23660 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66 72 6f 6d  ld.* values from
23670 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20   */.  int op,   
23680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23690 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
236a0 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f  INSERT, UPDATE o
236b0 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20 20 63 6f  r DELETE */.  co
236c0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20  nst char *zDb,  
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236e0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 2a   Database name *
236f0 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c  /.  Table *pTab,
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69 65 64 20      /* Modified 
23720 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36 34 20 69  table */.  i64 i
23730 4b 65 79 31 2c 20 20 20 20 20 20 20 20 20 20 20  Key1,           
23740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
23750 69 74 69 61 6c 20 6b 65 79 20 76 61 6c 75 65 20  itial key value 
23760 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 20 20 20  */.  int iReg   
23770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23780 20 20 20 20 20 2f 2a 20 52 65 67 69 73 74 65 72       /* Register
23790 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65 63 6f 72   for new.* recor
237a0 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  d */.){.  sqlite
237b0 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62 3b 0a 20  3 *db = v->db;. 
237c0 20 69 36 34 20 69 4b 65 79 32 3b 0a 20 20 50 72   i64 iKey2;.  Pr
237d0 65 55 70 64 61 74 65 20 70 72 65 75 70 64 61 74  eUpdate preupdat
237e0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
237f0 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d 3e 7a 4e  *zTbl = pTab->zN
23800 61 6d 65 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  ame;.  static co
23810 6e 73 74 20 75 38 20 66 61 6b 65 53 6f 72 74 4f  nst u8 fakeSortO
23820 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20 61 73 73  rder = 0;..  ass
23830 65 72 74 28 20 64 62 2d 3e 70 50 72 65 55 70 64  ert( db->pPreUpd
23840 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ate==0 );.  mems
23850 65 74 28 26 70 72 65 75 70 64 61 74 65 2c 20 30  et(&preupdate, 0
23860 2c 20 73 69 7a 65 6f 66 28 50 72 65 55 70 64 61  , sizeof(PreUpda
23870 74 65 29 29 3b 0a 20 20 69 66 28 20 6f 70 3d 3d  te));.  if( op==
23880 53 51 4c 49 54 45 5f 55 50 44 41 54 45 20 29 7b  SQLITE_UPDATE ){
23890 0a 20 20 20 20 69 4b 65 79 32 20 3d 20 76 2d 3e  .    iKey2 = v->
238a0 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e 69 3b 0a  aMem[iReg].u.i;.
238b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 4b 65    }else{.    iKe
238c0 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20 20 7d 0a  y2 = iKey1;.  }.
238d0 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72 2d  .  assert( pCsr-
238e0 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
238f0 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c 7c 20 28  Col .       || (
23900 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54  pCsr->nField==pT
23910 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26 20 6f 70  ab->nCol+1 && op
23920 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45 54 45 20  ==SQLITE_DELETE 
23930 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a 20 20 29  && iReg==-1).  )
23940 3b 0a 0a 20 20 70 72 65 75 70 64 61 74 65 2e 76  ;..  preupdate.v
23950 20 3d 20 76 3b 0a 20 20 70 72 65 75 70 64 61 74   = v;.  preupdat
23960 65 2e 70 43 73 72 20 3d 20 70 43 73 72 3b 0a 20  e.pCsr = pCsr;. 
23970 20 70 72 65 75 70 64 61 74 65 2e 6f 70 20 3d 20   preupdate.op = 
23980 6f 70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  op;.  preupdate.
23990 69 4e 65 77 52 65 67 20 3d 20 69 52 65 67 3b 0a  iNewReg = iReg;.
239a0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
239b0 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a 20 20 70  nfo.db = db;.  p
239c0 72 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f  reupdate.keyinfo
239d0 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a  .enc = ENC(db);.
239e0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
239f0 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 70 54 61  nfo.nField = pTa
23a00 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72 65 75 70  b->nCol;.  preup
23a10 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 61 53 6f  date.keyinfo.aSo
23a20 72 74 4f 72 64 65 72 20 3d 20 28 75 38 2a 29 26  rtOrder = (u8*)&
23a30 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 3b 0a 20  fakeSortOrder;. 
23a40 20 70 72 65 75 70 64 61 74 65 2e 69 4b 65 79 31   preupdate.iKey1
23a50 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70 72 65 75   = iKey1;.  preu
23a60 70 64 61 74 65 2e 69 4b 65 79 32 20 3d 20 69 4b  pdate.iKey2 = iK
23a70 65 79 32 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey2;.  preupdate
23a80 2e 69 50 4b 65 79 20 3d 20 70 54 61 62 2d 3e 69  .iPKey = pTab->i
23a90 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e 70 50 72  PKey;..  db->pPr
23aa0 65 55 70 64 61 74 65 20 3d 20 26 70 72 65 75 70  eUpdate = &preup
23ab0 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78 50 72 65  date;.  db->xPre
23ac0 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 28 64  UpdateCallback(d
23ad0 62 2d 3e 70 50 72 65 55 70 64 61 74 65 41 72 67  b->pPreUpdateArg
23ae0 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62 2c 20 7a  , db, op, zDb, z
23af0 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69 4b 65 79  Tbl, iKey1, iKey
23b00 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72 65 55 70  2);.  db->pPreUp
23b10 64 61 74 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69  date = 0;.  sqli
23b20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72  te3DbFree(db, pr
23b30 65 75 70 64 61 74 65 2e 61 52 65 63 6f 72 64 29  eupdate.aRecord)
23b40 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
23b50 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
23b60 74 65 2e 70 55 6e 70 61 63 6b 65 64 29 3b 0a 20  te.pUnpacked);. 
23b70 20 76 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65   vdbeFreeUnpacke
23b80 64 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e  d(db, preupdate.
23b90 70 4e 65 77 55 6e 70 61 63 6b 65 64 29 3b 0a 20  pNewUnpacked);. 
23ba0 20 69 66 28 20 70 72 65 75 70 64 61 74 65 2e 61   if( preupdate.a
23bb0 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  New ){.    int i
23bc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
23bd0 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3b 20 69  <pCsr->nField; i
23be0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
23bf0 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
23c00 28 26 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  (&preupdate.aNew
23c10 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
23c20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
23c30 2c 20 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77  , preupdate.aNew
23c40 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
23c50 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
23c60 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
23c70 2a 2f 0a                                         */.