/ Hex Artifact Content
Login

Artifact 7354ce66d5e919d2d54c9fa42aeda64711487a44:


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 72 65 74 75 72 6e 20 70 3b 0a   );.  return p;.
0410: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 65 6d 62 65  }../*.** Remembe
0420: 72 20 74 68 65 20 53 51 4c 20 73 74 72 69 6e 67  r the SQL string
0430: 20 66 6f 72 20 61 20 70 72 65 70 61 72 65 64 20   for a prepared 
0440: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
0450: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
0460: 74 53 71 6c 28 56 64 62 65 20 2a 70 2c 20 63 6f  tSql(Vdbe *p, co
0470: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
0480: 20 6e 2c 20 69 6e 74 20 69 73 50 72 65 70 61 72   n, int isPrepar
0490: 65 56 32 29 7b 0a 20 20 61 73 73 65 72 74 28 20  eV2){.  assert( 
04a0: 69 73 50 72 65 70 61 72 65 56 32 3d 3d 31 20 7c  isPrepareV2==1 |
04b0: 7c 20 69 73 50 72 65 70 61 72 65 56 32 3d 3d 30  | isPrepareV2==0
04c0: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
04d0: 20 72 65 74 75 72 6e 3b 0a 23 69 66 20 64 65 66   return;.#if def
04e0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
04f0: 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
0500: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
0510: 45 5f 53 51 4c 4c 4f 47 29 0a 20 20 69 66 28 20  E_SQLLOG).  if( 
0520: 21 69 73 50 72 65 70 61 72 65 56 32 20 29 20 72  !isPrepareV2 ) r
0530: 65 74 75 72 6e 3b 0a 23 65 6e 64 69 66 0a 20 20  eturn;.#endif.  
0540: 61 73 73 65 72 74 28 20 70 2d 3e 7a 53 71 6c 3d  assert( p->zSql=
0550: 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a 53 71 6c 20  =0 );.  p->zSql 
0560: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
0570: 75 70 28 70 2d 3e 64 62 2c 20 7a 2c 20 6e 29 3b  up(p->db, z, n);
0580: 0a 20 20 70 2d 3e 69 73 50 72 65 70 61 72 65 56  .  p->isPrepareV
0590: 32 20 3d 20 28 75 38 29 69 73 50 72 65 70 61 72  2 = (u8)isPrepar
05a0: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
05b0: 74 75 72 6e 20 74 68 65 20 53 51 4c 20 61 73 73  turn the SQL ass
05c0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 70  ociated with a p
05d0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
05e0: 74 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  t.*/.const char 
05f0: 2a 73 71 6c 69 74 65 33 5f 73 71 6c 28 73 71 6c  *sqlite3_sql(sql
0600: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
0610: 29 7b 0a 20 20 56 64 62 65 20 2a 70 20 3d 20 28  ){.  Vdbe *p = (
0620: 56 64 62 65 20 2a 29 70 53 74 6d 74 3b 0a 20 20  Vdbe *)pStmt;.  
0630: 72 65 74 75 72 6e 20 28 70 20 26 26 20 70 2d 3e  return (p && p->
0640: 69 73 50 72 65 70 61 72 65 56 32 29 20 3f 20 70  isPrepareV2) ? p
0650: 2d 3e 7a 53 71 6c 20 3a 20 30 3b 0a 7d 0a 0a 2f  ->zSql : 0;.}../
0660: 2a 0a 2a 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f  *.** Swap all co
0670: 6e 74 65 6e 74 20 62 65 74 77 65 65 6e 20 74 77  ntent between tw
0680: 6f 20 56 44 42 45 20 73 74 72 75 63 74 75 72 65  o VDBE structure
0690: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
06a0: 65 33 56 64 62 65 53 77 61 70 28 56 64 62 65 20  e3VdbeSwap(Vdbe 
06b0: 2a 70 41 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a  *pA, Vdbe *pB){.
06c0: 20 20 56 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d    Vdbe tmp, *pTm
06d0: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b  p;.  char *zTmp;
06e0: 0a 20 20 74 6d 70 20 3d 20 2a 70 41 3b 0a 20 20  .  tmp = *pA;.  
06f0: 2a 70 41 20 3d 20 2a 70 42 3b 0a 20 20 2a 70 42  *pA = *pB;.  *pB
0700: 20 3d 20 74 6d 70 3b 0a 20 20 70 54 6d 70 20 3d   = tmp;.  pTmp =
0710: 20 70 41 2d 3e 70 4e 65 78 74 3b 0a 20 20 70 41   pA->pNext;.  pA
0720: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 2d 3e 70 4e  ->pNext = pB->pN
0730: 65 78 74 3b 0a 20 20 70 42 2d 3e 70 4e 65 78 74  ext;.  pB->pNext
0740: 20 3d 20 70 54 6d 70 3b 0a 20 20 70 54 6d 70 20   = pTmp;.  pTmp 
0750: 3d 20 70 41 2d 3e 70 50 72 65 76 3b 0a 20 20 70  = pA->pPrev;.  p
0760: 41 2d 3e 70 50 72 65 76 20 3d 20 70 42 2d 3e 70  A->pPrev = pB->p
0770: 50 72 65 76 3b 0a 20 20 70 42 2d 3e 70 50 72 65  Prev;.  pB->pPre
0780: 76 20 3d 20 70 54 6d 70 3b 0a 20 20 7a 54 6d 70  v = pTmp;.  zTmp
0790: 20 3d 20 70 41 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pA->zSql;.  p
07a0: 41 2d 3e 7a 53 71 6c 20 3d 20 70 42 2d 3e 7a 53  A->zSql = pB->zS
07b0: 71 6c 3b 0a 20 20 70 42 2d 3e 7a 53 71 6c 20 3d  ql;.  pB->zSql =
07c0: 20 7a 54 6d 70 3b 0a 20 20 70 42 2d 3e 69 73 50   zTmp;.  pB->isP
07d0: 72 65 70 61 72 65 56 32 20 3d 20 70 41 2d 3e 69  repareV2 = pA->i
07e0: 73 50 72 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f  sPrepareV2;.}../
07f0: 2a 0a 2a 2a 20 52 65 73 69 7a 65 20 74 68 65 20  *.** Resize the 
0800: 56 64 62 65 2e 61 4f 70 20 61 72 72 61 79 20 73  Vdbe.aOp array s
0810: 6f 20 74 68 61 74 20 69 74 20 69 73 20 61 74 20  o that it is at 
0820: 6c 65 61 73 74 20 6e 4f 70 20 65 6c 65 6d 65 6e  least nOp elemen
0830: 74 73 20 6c 61 72 67 65 72 20 0a 2a 2a 20 74 68  ts larger .** th
0840: 61 6e 20 69 74 73 20 63 75 72 72 65 6e 74 20 73  an its current s
0850: 69 7a 65 2e 20 6e 4f 70 20 69 73 20 67 75 61 72  ize. nOp is guar
0860: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 6c 65 73  anteed to be les
0870: 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a  s than or equal.
0880: 2a 2a 20 74 6f 20 31 30 32 34 2f 73 69 7a 65 6f  ** to 1024/sizeo
0890: 66 28 4f 70 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f(Op)..**.** If 
08a0: 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79  an out-of-memory
08b0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68   error occurs wh
08c0: 69 6c 65 20 72 65 73 69 7a 69 6e 67 20 74 68 65  ile resizing the
08d0: 20 61 72 72 61 79 2c 20 72 65 74 75 72 6e 0a 2a   array, return.*
08e0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 20  * SQLITE_NOMEM. 
08f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 56 64 62  In this case Vdb
0900: 65 2e 61 4f 70 20 61 6e 64 20 50 61 72 73 65 2e  e.aOp and Parse.
0910: 6e 4f 70 41 6c 6c 6f 63 20 72 65 6d 61 69 6e 20  nOpAlloc remain 
0920: 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 28 74  .** unchanged (t
0930: 68 69 73 20 69 73 20 73 6f 20 74 68 61 74 20 61  his is so that a
0940: 6e 79 20 6f 70 63 6f 64 65 73 20 61 6c 72 65 61  ny opcodes alrea
0950: 64 79 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 6e  dy allocated can
0960: 20 62 65 20 0a 2a 2a 20 63 6f 72 72 65 63 74 6c   be .** correctl
0970: 79 20 64 65 61 6c 6c 6f 63 61 74 65 64 20 61 6c  y deallocated al
0980: 6f 6e 67 20 77 69 74 68 20 74 68 65 20 72 65 73  ong with the res
0990: 74 20 6f 66 20 74 68 65 20 56 64 62 65 29 2e 0a  t of the Vdbe)..
09a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 72  */.static int gr
09b0: 6f 77 4f 70 41 72 72 61 79 28 56 64 62 65 20 2a  owOpArray(Vdbe *
09c0: 76 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 56  v, int nOp){.  V
09d0: 64 62 65 4f 70 20 2a 70 4e 65 77 3b 0a 20 20 50  dbeOp *pNew;.  P
09e0: 61 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61  arse *p = v->pPa
09f0: 72 73 65 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 53  rse;..  /* The S
0a00: 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c  QLITE_TEST_REALL
0a10: 4f 43 5f 53 54 52 45 53 53 20 63 6f 6d 70 69 6c  OC_STRESS compil
0a20: 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73  e-time option is
0a30: 20 64 65 73 69 67 6e 65 64 20 74 6f 20 66 6f 72   designed to for
0a40: 63 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 66 72 65  ce.  ** more fre
0a50: 71 75 65 6e 74 20 72 65 61 6c 6c 6f 63 73 20 61  quent reallocs a
0a60: 6e 64 20 68 65 6e 63 65 20 70 72 6f 76 69 64 65  nd hence provide
0a70: 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75 6e 69 74   more opportunit
0a80: 69 65 73 20 66 6f 72 20 0a 20 20 2a 2a 20 73 69  ies for .  ** si
0a90: 6d 75 6c 61 74 65 64 20 4f 4f 4d 20 66 61 75 6c  mulated OOM faul
0aa0: 74 73 2e 20 20 53 51 4c 49 54 45 5f 54 45 53 54  ts.  SQLITE_TEST
0ab0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20  _REALLOC_STRESS 
0ac0: 69 73 20 67 65 6e 65 72 61 6c 6c 79 20 75 73 65  is generally use
0ad0: 64 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 65  d.  ** during te
0ae0: 73 74 69 6e 67 20 6f 6e 6c 79 2e 20 20 57 69 74  sting only.  Wit
0af0: 68 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45  h SQLITE_TEST_RE
0b00: 41 4c 4c 4f 43 5f 53 54 52 45 53 53 20 67 72 6f  ALLOC_STRESS gro
0b10: 77 20 74 68 65 20 6f 70 20 61 72 72 61 79 0a 20  w the op array. 
0b20: 20 2a 2a 20 62 79 20 74 68 65 20 6d 69 6e 69 6d   ** by the minim
0b30: 75 6d 2a 20 61 6d 6f 75 6e 74 20 72 65 71 75 69  um* amount requi
0b40: 72 65 64 20 75 6e 74 69 6c 20 74 68 65 20 73 69  red until the si
0b50: 7a 65 20 72 65 61 63 68 65 73 20 35 31 32 2e 20  ze reaches 512. 
0b60: 20 4e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 6f 70 65   Normal.  ** ope
0b70: 72 61 74 69 6f 6e 20 28 77 69 74 68 6f 75 74 20  ration (without 
0b80: 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c  SQLITE_TEST_REAL
0b90: 4c 4f 43 5f 53 54 52 45 53 53 29 20 69 73 20 74  LOC_STRESS) is t
0ba0: 6f 20 64 6f 75 62 6c 65 20 74 68 65 20 63 75 72  o double the cur
0bb0: 72 65 6e 74 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  rent.  ** size o
0bc0: 66 20 74 68 65 20 6f 70 20 61 72 72 61 79 20 6f  f the op array o
0bd0: 72 20 61 64 64 20 31 4b 42 20 6f 66 20 73 70 61  r add 1KB of spa
0be0: 63 65 2c 20 77 68 69 63 68 65 76 65 72 20 69 73  ce, whichever is
0bf0: 20 73 6d 61 6c 6c 65 72 2e 20 2a 2f 0a 23 69 66   smaller. */.#if
0c00: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 5f  def SQLITE_TEST_
0c10: 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 0a 20  REALLOC_STRESS. 
0c20: 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70 2d 3e   int nNew = (p->
0c30: 6e 4f 70 41 6c 6c 6f 63 3e 3d 35 31 32 20 3f 20  nOpAlloc>=512 ? 
0c40: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20  p->nOpAlloc*2 : 
0c50: 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29  p->nOpAlloc+nOp)
0c60: 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 6e 4e  ;.#else.  int nN
0c70: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0c80: 63 20 3f 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2a  c ? p->nOpAlloc*
0c90: 32 20 3a 20 28 69 6e 74 29 28 31 30 32 34 2f 73  2 : (int)(1024/s
0ca0: 69 7a 65 6f 66 28 4f 70 29 29 29 3b 0a 20 20 55  izeof(Op)));.  U
0cb0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
0cc0: 6e 4f 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  nOp);.#endif..  
0cd0: 61 73 73 65 72 74 28 20 6e 4f 70 3c 3d 28 31 30  assert( nOp<=(10
0ce0: 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 29 20 29  24/sizeof(Op)) )
0cf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
0d00: 3e 3d 28 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 2b 6e  >=(p->nOpAlloc+n
0d10: 4f 70 29 20 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Op) );.  pNew = 
0d20: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
0d30: 28 70 2d 3e 64 62 2c 20 76 2d 3e 61 4f 70 2c 20  (p->db, v->aOp, 
0d40: 6e 4e 65 77 2a 73 69 7a 65 6f 66 28 4f 70 29 29  nNew*sizeof(Op))
0d50: 3b 0a 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a  ;.  if( pNew ){.
0d60: 20 20 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20      p->nOpAlloc 
0d70: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
0d80: 63 53 69 7a 65 28 70 2d 3e 64 62 2c 20 70 4e 65  cSize(p->db, pNe
0d90: 77 29 2f 73 69 7a 65 6f 66 28 4f 70 29 3b 0a 20  w)/sizeof(Op);. 
0da0: 20 20 20 76 2d 3e 61 4f 70 20 3d 20 70 4e 65 77     v->aOp = pNew
0db0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
0dc0: 70 4e 65 77 20 3f 20 53 51 4c 49 54 45 5f 4f 4b  pNew ? SQLITE_OK
0dd0: 20 3a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29   : SQLITE_NOMEM)
0de0: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
0df0: 54 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73  TE_DEBUG./* This
0e00: 20 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74   routine is just
0e10: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c   a convenient pl
0e20: 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65  ace to set a bre
0e30: 61 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c  akpoint that wil
0e40: 6c 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20  l.** fire after 
0e50: 65 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69  each opcode is i
0e60: 6e 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70  nserted and disp
0e70: 6c 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22  layed using.** "
0e80: 50 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f  PRAGMA vdbe_addo
0e90: 70 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73  ptrace=on"..*/.s
0ea0: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
0eb0: 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74  addop_breakpoint
0ec0: 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
0ed0: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b   int n = 0;.  n+
0ee0: 2b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  +;.}.#endif../*.
0ef0: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73  ** Add a new ins
0f00: 74 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  truction to the 
0f10: 6c 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74  list of instruct
0f20: 69 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20  ions current in 
0f30: 74 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65  the.** VDBE.  Re
0f40: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
0f50: 20 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74   of the new inst
0f60: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50  ruction..**.** P
0f70: 61 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a  arameters:.**.**
0f80: 20 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20      p           
0f90: 20 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74      Pointer to t
0fa0: 68 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20  he VDBE.**.**   
0fb0: 20 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20   op             
0fc0: 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20   The opcode for 
0fd0: 74 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e  this instruction
0fe0: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32  .**.**    p1, p2
0ff0: 2c 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e  , p3      Operan
1000: 64 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  ds.**.** Use the
1010: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1020: 6c 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74  lveLabel() funct
1030: 69 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64  ion to fix an ad
1040: 64 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65  dress and.** the
1050: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
1060: 67 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20  geP4() function 
1070: 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61  to change the va
1080: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a  lue of the P4.**
1090: 20 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 69 6e 74   operand..*/.int
10a0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
10b0: 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p3(Vdbe *p, int 
10c0: 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e 74 20  op, int p1, int 
10d0: 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20 20 69  p2, int p3){.  i
10e0: 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20 2a  nt i;.  VdbeOp *
10f0: 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d 3e 6e  pOp;..  i = p->n
1100: 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  Op;.  assert( p-
1110: 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47  >magic==VDBE_MAG
1120: 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61 73 73  IC_INIT );.  ass
1130: 65 72 74 28 20 6f 70 3e 30 20 26 26 20 6f 70 3c  ert( op>0 && op<
1140: 30 78 66 66 20 29 3b 0a 20 20 69 66 28 20 70 2d  0xff );.  if( p-
1150: 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f  >pParse->nOpAllo
1160: 63 3c 3d 69 20 29 7b 0a 20 20 20 20 69 66 28 20  c<=i ){.    if( 
1170: 67 72 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 31  growOpArray(p, 1
1180: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1190: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 1;.    }.  }. 
11a0: 20 70 2d 3e 6e 4f 70 2b 2b 3b 0a 20 20 70 4f 70   p->nOp++;.  pOp
11b0: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
11c0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 28   pOp->opcode = (
11d0: 75 38 29 6f 70 3b 0a 20 20 70 4f 70 2d 3e 70 35  u8)op;.  pOp->p5
11e0: 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 31 20   = 0;.  pOp->p1 
11f0: 3d 20 70 31 3b 0a 20 20 70 4f 70 2d 3e 70 32 20  = p1;.  pOp->p2 
1200: 3d 20 70 32 3b 0a 20 20 70 4f 70 2d 3e 70 33 20  = p2;.  pOp->p3 
1210: 3d 20 70 33 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  = p3;.  pOp->p4.
1220: 70 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 70 34  p = 0;.  pOp->p4
1230: 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45  type = P4_NOTUSE
1240: 44 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  D;.#ifdef SQLITE
1250: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
1260: 43 4f 4d 4d 45 4e 54 53 0a 20 20 70 4f 70 2d 3e  COMMENTS.  pOp->
1270: 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65  zComment = 0;.#e
1280: 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
1290: 54 45 5f 44 45 42 55 47 0a 20 20 69 66 28 20 70  TE_DEBUG.  if( p
12a0: 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51  ->db->flags & SQ
12b0: 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72  LITE_VdbeAddopTr
12c0: 61 63 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 6a  ace ){.    int j
12d0: 6a 2c 20 6b 6b 3b 0a 20 20 20 20 50 61 72 73 65  j, kk;.    Parse
12e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
12f0: 61 72 73 65 3b 0a 20 20 20 20 66 6f 72 28 6a 6a  arse;.    for(jj
1300: 3d 6b 6b 3d 30 3b 20 6a 6a 3c 53 51 4c 49 54 45  =kk=0; jj<SQLITE
1310: 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 6a 6a 2b  _N_COLCACHE; jj+
1320: 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74  +){.      struct
1330: 20 79 43 6f 6c 43 61 63 68 65 20 2a 78 20 3d 20   yColCache *x = 
1340: 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68  pParse->aColCach
1350: 65 20 2b 20 6a 6a 3b 0a 20 20 20 20 20 20 69 66  e + jj;.      if
1360: 28 20 78 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72  ( x->iLevel>pPar
1370: 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20  se->iCacheLevel 
1380: 7c 7c 20 78 2d 3e 69 52 65 67 3d 3d 30 20 29 20  || x->iReg==0 ) 
1390: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13a0: 70 72 69 6e 74 66 28 22 20 72 5b 25 64 5d 3d 7b  printf(" r[%d]={
13b0: 25 64 3a 25 64 7d 22 2c 20 78 2d 3e 69 52 65 67  %d:%d}", x->iReg
13c0: 2c 20 78 2d 3e 69 54 61 62 6c 65 2c 20 78 2d 3e  , x->iTable, x->
13d0: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
13e0: 6b 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  kk++;.    }.    
13f0: 69 66 28 20 6b 6b 20 29 20 70 72 69 6e 74 66 28  if( kk ) printf(
1400: 22 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74  "\n");.    sqlit
1410: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30 2c  e3VdbePrintOp(0,
1420: 20 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b   i, &p->aOp[i]);
1430: 0a 20 20 20 20 74 65 73 74 5f 61 64 64 6f 70 5f  .    test_addop_
1440: 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20  breakpoint();.  
1450: 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
1460: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 70  VDBE_PROFILE.  p
1470: 4f 70 2d 3e 63 79 63 6c 65 73 20 3d 20 30 3b 0a  Op->cycles = 0;.
1480: 20 20 70 4f 70 2d 3e 63 6e 74 20 3d 20 30 3b 0a    pOp->cnt = 0;.
1490: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
14a0: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
14b0: 47 45 0a 20 20 70 4f 70 2d 3e 69 53 72 63 4c 69  GE.  pOp->iSrcLi
14c0: 6e 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20  ne = 0;.#endif. 
14d0: 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 69 6e 74   return i;.}.int
14e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
14f0: 70 30 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  p0(Vdbe *p, int 
1500: 6f 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  op){.  return sq
1510: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28  lite3VdbeAddOp3(
1520: 70 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 29 3b  p, op, 0, 0, 0);
1530: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1540: 62 65 41 64 64 4f 70 31 28 56 64 62 65 20 2a 70  beAddOp1(Vdbe *p
1550: 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31  , int op, int p1
1560: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
1570: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1580: 20 6f 70 2c 20 70 31 2c 20 30 2c 20 30 29 3b 0a   op, p1, 0, 0);.
1590: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  }.int sqlite3Vdb
15a0: 65 41 64 64 4f 70 32 28 56 64 62 65 20 2a 70 2c  eAddOp2(Vdbe *p,
15b0: 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c   int op, int p1,
15c0: 20 69 6e 74 20 70 32 29 7b 0a 20 20 72 65 74 75   int p2){.  retu
15d0: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
15e0: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
15f0: 70 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  p2, 0);.}.../*.*
1600: 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20  * Add an opcode 
1610: 74 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68  that includes th
1620: 65 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 20  e p4 value as a 
1630: 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20  pointer..*/.int 
1640: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
1650: 34 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  4(.  Vdbe *p,   
1660: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
1670: 74 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68  the opcode to th
1680: 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f  is VM */.  int o
1690: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p,             /
16a0: 2a 20 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65  * The new opcode
16b0: 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20   */.  int p1,   
16c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
16d0: 20 50 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20   P1 operand */. 
16e0: 20 69 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20   int p2,        
16f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f       /* The P2 o
1700: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1710: 70 33 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p3,             
1720: 2f 2a 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e  /* The P3 operan
1730: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
1740: 72 20 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68  r *zP4,    /* Th
1750: 65 20 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  e P4 operand */.
1760: 20 20 69 6e 74 20 70 34 74 79 70 65 20 20 20 20    int p4type    
1770: 20 20 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72        /* P4 oper
1780: 61 6e 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20  and type */.){. 
1790: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
17a0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
17b0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
17c0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
17d0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
17e0: 20 7a 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20   zP4, p4type);. 
17f0: 20 72 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a   return addr;.}.
1800: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
1810: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
1820: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
1830: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
1840: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
1850: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
1860: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
1870: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
1880: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
1890: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
18a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
18b0: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
18c0: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
18d0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
18e0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
18f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
1900: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
1910: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
1920: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
1930: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
1940: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
1950: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
1960: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
1970: 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 61 64 64  int j;.  int add
1980: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
1990: 64 64 4f 70 33 28 70 2c 20 4f 50 5f 50 61 72 73  ddOp3(p, OP_Pars
19a0: 65 53 63 68 65 6d 61 2c 20 69 44 62 2c 20 30 2c  eSchema, iDb, 0,
19b0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64   0);.  sqlite3Vd
19c0: 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20 61 64  beChangeP4(p, ad
19d0: 64 72 2c 20 7a 57 68 65 72 65 2c 20 50 34 5f 44  dr, zWhere, P4_D
19e0: 59 4e 41 4d 49 43 29 3b 0a 20 20 66 6f 72 28 6a  YNAMIC);.  for(j
19f0: 3d 30 3b 20 6a 3c 70 2d 3e 64 62 2d 3e 6e 44 62  =0; j<p->db->nDb
1a00: 3b 20 6a 2b 2b 29 20 73 71 6c 69 74 65 33 56 64  ; j++) sqlite3Vd
1a10: 62 65 55 73 65 73 42 74 72 65 65 28 70 2c 20 6a  beUsesBtree(p, j
1a20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  );.}../*.** Add 
1a30: 61 6e 20 6f 70 63 6f 64 65 20 74 68 61 74 20 69  an opcode that i
1a40: 6e 63 6c 75 64 65 73 20 74 68 65 20 70 34 20 76  ncludes the p4 v
1a50: 61 6c 75 65 20 61 73 20 61 6e 20 69 6e 74 65 67  alue as an integ
1a60: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
1a70: 65 33 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28  e3VdbeAddOp4Int(
1a80: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1aa0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1ab0: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ad0: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1ae0: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1b00: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1b10: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1b20: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1b30: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1b40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1b50: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1b60: 2a 2f 0a 20 20 69 6e 74 20 70 34 20 20 20 20 20  */.  int p4     
1b70: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b80: 50 34 20 6f 70 65 72 61 6e 64 20 61 73 20 61 6e  P4 operand as an
1b90: 20 69 6e 74 65 67 65 72 20 2a 2f 0a 29 7b 0a 20   integer */.){. 
1ba0: 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69   int addr = sqli
1bb0: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c  te3VdbeAddOp3(p,
1bc0: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1bd0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
1be0: 68 61 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c  hangeP4(p, addr,
1bf0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
1c00: 54 52 28 70 34 29 2c 20 50 34 5f 49 4e 54 33 32  TR(p4), P4_INT32
1c10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72  );.  return addr
1c20: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1c30: 65 20 61 20 6e 65 77 20 73 79 6d 62 6f 6c 69 63  e a new symbolic
1c40: 20 6c 61 62 65 6c 20 66 6f 72 20 61 6e 20 69 6e   label for an in
1c50: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 68  struction that h
1c60: 61 73 20 79 65 74 20 74 6f 20 62 65 0a 2a 2a 20  as yet to be.** 
1c70: 63 6f 64 65 64 2e 20 20 54 68 65 20 73 79 6d 62  coded.  The symb
1c80: 6f 6c 69 63 20 6c 61 62 65 6c 20 69 73 20 72 65  olic label is re
1c90: 61 6c 6c 79 20 6a 75 73 74 20 61 20 6e 65 67 61  ally just a nega
1ca0: 74 69 76 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  tive number.  Th
1cb0: 65 0a 2a 2a 20 6c 61 62 65 6c 20 63 61 6e 20 62  e.** label can b
1cc0: 65 20 75 73 65 64 20 61 73 20 74 68 65 20 50 32  e used as the P2
1cd0: 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 6f 70 65   value of an ope
1ce0: 72 61 74 69 6f 6e 2e 20 20 4c 61 74 65 72 2c 20  ration.  Later, 
1cf0: 77 68 65 6e 0a 2a 2a 20 74 68 65 20 6c 61 62 65  when.** the labe
1d00: 6c 20 69 73 20 72 65 73 6f 6c 76 65 64 20 74 6f  l is resolved to
1d10: 20 61 20 73 70 65 63 69 66 69 63 20 61 64 64 72   a specific addr
1d20: 65 73 73 2c 20 74 68 65 20 56 44 42 45 20 77 69  ess, the VDBE wi
1d30: 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74 68 72 6f 75  ll scan.** throu
1d40: 67 68 20 69 74 73 20 6f 70 65 72 61 74 69 6f 6e  gh its operation
1d50: 20 6c 69 73 74 20 61 6e 64 20 63 68 61 6e 67 65   list and change
1d60: 20 61 6c 6c 20 76 61 6c 75 65 73 20 6f 66 20 50   all values of P
1d70: 32 20 77 68 69 63 68 20 6d 61 74 63 68 0a 2a 2a  2 which match.**
1d80: 20 74 68 65 20 6c 61 62 65 6c 20 69 6e 74 6f 20   the label into 
1d90: 74 68 65 20 72 65 73 6f 6c 76 65 64 20 61 64 64  the resolved add
1da0: 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ress..**.** The 
1db0: 56 44 42 45 20 6b 6e 6f 77 73 20 74 68 61 74 20  VDBE knows that 
1dc0: 61 20 50 32 20 76 61 6c 75 65 20 69 73 20 61 20  a P2 value is a 
1dd0: 6c 61 62 65 6c 20 62 65 63 61 75 73 65 20 6c 61  label because la
1de0: 62 65 6c 73 20 61 72 65 0a 2a 2a 20 61 6c 77 61  bels are.** alwa
1df0: 79 73 20 6e 65 67 61 74 69 76 65 20 61 6e 64 20  ys negative and 
1e00: 50 32 20 76 61 6c 75 65 73 20 61 72 65 20 73 75  P2 values are su
1e10: 70 70 6f 73 65 20 74 6f 20 62 65 20 6e 6f 6e 2d  ppose to be non-
1e20: 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 48 65 6e  negative..** Hen
1e30: 63 65 2c 20 61 20 6e 65 67 61 74 69 76 65 20 50  ce, a negative P
1e40: 32 20 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62  2 value is a lab
1e50: 65 6c 20 74 68 61 74 20 68 61 73 20 79 65 74 20  el that has yet 
1e60: 74 6f 20 62 65 20 72 65 73 6f 6c 76 65 64 2e 0a  to be resolved..
1e70: 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65  **.** Zero is re
1e80: 74 75 72 6e 65 64 20 69 66 20 61 20 6d 61 6c 6c  turned if a mall
1e90: 6f 63 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a 69  oc() fails..*/.i
1ea0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  nt sqlite3VdbeMa
1eb0: 6b 65 4c 61 62 65 6c 28 56 64 62 65 20 2a 76 29  keLabel(Vdbe *v)
1ec0: 7b 0a 20 20 50 61 72 73 65 20 2a 70 20 3d 20 76  {.  Parse *p = v
1ed0: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74 20  ->pParse;.  int 
1ee0: 69 20 3d 20 70 2d 3e 6e 4c 61 62 65 6c 2b 2b 3b  i = p->nLabel++;
1ef0: 0a 20 20 61 73 73 65 72 74 28 20 76 2d 3e 6d 61  .  assert( v->ma
1f00: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
1f10: 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 28 69  INIT );.  if( (i
1f20: 20 26 20 28 69 2d 31 29 29 3d 3d 30 20 29 7b 0a   & (i-1))==0 ){.
1f30: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 20 3d 20      p->aLabel = 
1f40: 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f 63  sqlite3DbRealloc
1f50: 4f 72 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  OrFree(p->db, p-
1f60: 3e 61 4c 61 62 65 6c 2c 20 0a 20 20 20 20 20 20  >aLabel, .      
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 28 69 2a 32 2b 31 29 2a 73 69 7a 65 6f 66 28   (i*2+1)*sizeof(
1fa0: 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d 29 29 3b 0a  p->aLabel[0]));.
1fb0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4c 61    }.  if( p->aLa
1fc0: 62 65 6c 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c  bel ){.    p->aL
1fd0: 61 62 65 6c 5b 69 5d 20 3d 20 2d 31 3b 0a 20 20  abel[i] = -1;.  
1fe0: 7d 0a 20 20 72 65 74 75 72 6e 20 2d 31 2d 69 3b  }.  return -1-i;
1ff0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
2000: 65 20 6c 61 62 65 6c 20 22 78 22 20 74 6f 20 62  e label "x" to b
2010: 65 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  e the address of
2020: 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72 75   the next instru
2030: 63 74 69 6f 6e 20 74 6f 0a 2a 2a 20 62 65 20 69  ction to.** be i
2040: 6e 73 65 72 74 65 64 2e 20 20 54 68 65 20 70 61  nserted.  The pa
2050: 72 61 6d 65 74 65 72 20 22 78 22 20 6d 75 73 74  rameter "x" must
2060: 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61 69   have been obtai
2070: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
2080: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
2090: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
20a0: 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
20b0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
20c0: 62 65 6c 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  bel(Vdbe *v, int
20d0: 20 78 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 20   x){.  Parse *p 
20e0: 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69  = v->pParse;.  i
20f0: 6e 74 20 6a 20 3d 20 2d 31 2d 78 3b 0a 20 20 61  nt j = -1-x;.  a
2100: 73 73 65 72 74 28 20 76 2d 3e 6d 61 67 69 63 3d  ssert( v->magic=
2110: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
2120: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6a 3c   );.  assert( j<
2130: 70 2d 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 69  p->nLabel );.  i
2140: 66 28 20 41 4c 57 41 59 53 28 6a 3e 3d 30 29 20  f( ALWAYS(j>=0) 
2150: 26 26 20 70 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a  && p->aLabel ){.
2160: 20 20 20 20 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d      p->aLabel[j]
2170: 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 20   = v->nOp;.  }. 
2180: 20 70 2d 3e 69 46 69 78 65 64 4f 70 20 3d 20 76   p->iFixedOp = v
2190: 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a  ->nOp - 1;.}../*
21a0: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
21b0: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
21c0: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
21d0: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
21e0: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
21f0: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2200: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2210: 65 20 3d 20 31 3b 0a 7d 0a 0a 23 69 66 64 65 66  e = 1;.}..#ifdef
2220: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a   SQLITE_DEBUG /*
2230: 20 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61   sqlite3AssertMa
2240: 79 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a  yAbort() logic *
2250: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  /../*.** The fol
2260: 6c 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20  lowing type and 
2270: 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65  function are use
2280: 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72  d to iterate thr
2290: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
22a0: 0a 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61  .** in a Vdbe ma
22b0: 69 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65  in program and e
22c0: 61 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70  ach of the sub-p
22d0: 72 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72  rograms (trigger
22e0: 73 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e  s) it may .** in
22f0: 76 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72  voke directly or
2300: 20 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20   indirectly. It 
2310: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61  should be used a
2320: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
2330: 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20     Op *pOp;.**  
2340: 20 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65   VdbeOpIter sIte
2350: 72 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65  r;.**.**   memse
2360: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
2370: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20  eof(sIter));.** 
2380: 20 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20    sIter.v = v;  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23a0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69            // v i
23b0: 73 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20  s of type Vdbe* 
23c0: 0a 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f  .**   while( (pO
23d0: 70 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26  p = opIterNext(&
23e0: 73 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20  sIter)) ){.**   
23f0: 20 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e    // Do somethin
2400: 67 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20  g with pOp.**   
2410: 7d 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62  }.**   sqlite3Db
2420: 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65  Free(v->db, sIte
2430: 72 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f  r.apSub);.** .*/
2440: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2450: 56 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f  VdbeOpIter VdbeO
2460: 70 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64  pIter;.struct Vd
2470: 62 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62  beOpIter {.  Vdb
2480: 65 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20  e *v;           
2490: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
24a0: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
24b0: 67 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f  gh the opcodes o
24c0: 66 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  f */.  SubProgra
24d0: 6d 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20  m **apSub;      
24e0: 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75    /* Array of su
24f0: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
2500: 6e 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20  nt nSub;        
2510: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2520: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
2530: 6e 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74  n apSub */.  int
2540: 20 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20   iAddr;         
2550: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
2560: 73 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72  ss of next instr
2570: 75 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e  uction to return
2580: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20   */.  int iSub; 
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 20 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f   /* 0 = main pro
25b0: 67 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20  gram, 1 = first 
25c0: 73 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e  sub-program etc.
25d0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70   */.};.static Op
25e0: 20 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62   *opIterNext(Vdb
25f0: 65 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56  eOpIter *p){.  V
2600: 64 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20  dbe *v = p->v;. 
2610: 20 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20   Op *pRet = 0;. 
2620: 20 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20   Op *aOp;.  int 
2630: 6e 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69  nOp;..  if( p->i
2640: 53 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a  Sub<=p->nSub ){.
2650: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62  .    if( p->iSub
2660: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70  ==0 ){.      aOp
2670: 20 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20   = v->aOp;.     
2680: 20 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20   nOp = v->nOp;. 
2690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26a0: 61 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70  aOp = p->apSub[p
26b0: 2d 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a  ->iSub-1]->aOp;.
26c0: 20 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61        nOp = p->a
26d0: 70 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d  pSub[p->iSub-1]-
26e0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >nOp;.    }.    
26f0: 61 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72  assert( p->iAddr
2700: 3c 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65  <nOp );..    pRe
2710: 74 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64  t = &aOp[p->iAdd
2720: 72 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72  r];.    p->iAddr
2730: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69  ++;.    if( p->i
2740: 41 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20  Addr==nOp ){.   
2750: 20 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20     p->iSub++;.  
2760: 20 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30      p->iAddr = 0
2770: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  ;.    }.  .    i
2780: 66 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d  f( pRet->p4type=
2790: 3d 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29  =P4_SUBPROGRAM )
27a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74  {.      int nByt
27b0: 65 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a  e = (p->nSub+1)*
27c0: 73 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61  sizeof(SubProgra
27d0: 6d 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  m*);.      int j
27e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
27f0: 20 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29   j<p->nSub; j++)
2800: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
2810: 3e 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d  >apSub[j]==pRet-
2820: 3e 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62  >p4.pProgram ) b
2830: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2840: 20 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53      if( j==p->nS
2850: 75 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ub ){.        p-
2860: 3e 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33  >apSub = sqlite3
2870: 44 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28  DbReallocOrFree(
2880: 76 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c  v->db, p->apSub,
2890: 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20   nByte);.       
28a0: 20 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29   if( !p->apSub )
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74  {.          pRet
28c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
28d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
28e0: 2d 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b  ->apSub[p->nSub+
28f0: 2b 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50  +] = pRet->p4.pP
2900: 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20  rogram;.        
2910: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2920: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52    }..  return pR
2930: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  et;.}../*.** Che
2940: 63 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61  ck if the progra
2950: 6d 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  m stored in the 
2960: 56 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  VM associated wi
2970: 74 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a  th pParse may.**
2980: 20 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20   throw an ABORT 
2990: 65 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69  exception (causi
29a0: 6e 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ng the statement
29b0: 2c 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65  , but not entire
29c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20   transaction.** 
29d0: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
29e0: 6b 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69  k). This conditi
29f0: 6f 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68  on is true if th
2a00: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f  e main program o
2a10: 72 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f  r any.** sub-pro
2a20: 67 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61  grams contains a
2a30: 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
2a40: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  ing:.**.**   *  
2a50: 4f 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d  OP_Halt with P1=
2a60: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
2a70: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
2a80: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  t..**   *  OP_Ha
2a90: 6c 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31  ltIfNull with P1
2aa0: 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  =SQLITE_CONSTRAI
2ab0: 4e 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f  NT and P2=OE_Abo
2ac0: 72 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44  rt..**   *  OP_D
2ad0: 65 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f  estroy.**   *  O
2ae0: 50 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a  P_VUpdate.**   *
2af0: 20 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20    OP_VRename.** 
2b00: 20 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65    *  OP_FkCounte
2b10: 72 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d  r with P2==0 (im
2b20: 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20  mediate foreign 
2b30: 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a  key constraint).
2b40: 2a 2a 0a 2a 2a 20 54 68 65 6e 20 63 68 65 63 6b  **.** Then check
2b50: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 20   that the value 
2b60: 6f 66 20 50 61 72 73 65 2e 6d 61 79 41 62 6f 72  of Parse.mayAbor
2b70: 74 20 69 73 20 74 72 75 65 20 69 66 20 61 6e 0a  t is true if an.
2b80: 2a 2a 20 41 42 4f 52 54 20 6d 61 79 20 62 65 20  ** ABORT may be 
2b90: 74 68 72 6f 77 6e 2c 20 6f 72 20 66 61 6c 73 65  thrown, or false
2ba0: 20 6f 74 68 65 72 77 69 73 65 2e 20 52 65 74 75   otherwise. Retu
2bb0: 72 6e 20 74 72 75 65 20 69 66 20 69 74 20 64 6f  rn true if it do
2bc0: 65 73 0a 2a 2a 20 6d 61 74 63 68 2c 20 6f 72 20  es.** match, or 
2bd0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
2be0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2bf0: 73 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65  s intended to be
2c00: 20 75 73 65 64 20 61 73 0a 2a 2a 20 70 61 72 74   used as.** part
2c10: 20 6f 66 20 61 6e 20 61 73 73 65 72 74 20 73 74   of an assert st
2c20: 61 74 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 63  atement in the c
2c30: 6f 6d 70 69 6c 65 72 2e 20 53 69 6d 69 6c 61 72  ompiler. Similar
2c40: 20 74 6f 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73   to:.**.**   ass
2c50: 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62 65  ert( sqlite3Vdbe
2c60: 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 70  AssertMayAbort(p
2c70: 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 70 50  Parse->pVdbe, pP
2c80: 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74 29 20  arse->mayAbort) 
2c90: 29 3b 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  );.*/.int sqlite
2ca0: 33 56 64 62 65 41 73 73 65 72 74 4d 61 79 41 62  3VdbeAssertMayAb
2cb0: 6f 72 74 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ort(Vdbe *v, int
2cc0: 20 6d 61 79 41 62 6f 72 74 29 7b 0a 20 20 69 6e   mayAbort){.  in
2cd0: 74 20 68 61 73 41 62 6f 72 74 20 3d 20 30 3b 0a  t hasAbort = 0;.
2ce0: 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20 56 64 62    Op *pOp;.  Vdb
2cf0: 65 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 20  eOpIter sIter;. 
2d00: 20 6d 65 6d 73 65 74 28 26 73 49 74 65 72 2c 20   memset(&sIter, 
2d10: 30 2c 20 73 69 7a 65 6f 66 28 73 49 74 65 72 29  0, sizeof(sIter)
2d20: 29 3b 0a 20 20 73 49 74 65 72 2e 76 20 3d 20 76  );.  sIter.v = v
2d30: 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 70 4f 70  ;..  while( (pOp
2d40: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2d50: 49 74 65 72 29 29 21 3d 30 20 29 7b 0a 20 20 20  Iter))!=0 ){.   
2d60: 20 69 6e 74 20 6f 70 63 6f 64 65 20 3d 20 70 4f   int opcode = pO
2d70: 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 69  p->opcode;.    i
2d80: 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 44 65  f( opcode==OP_De
2d90: 73 74 72 6f 79 20 7c 7c 20 6f 70 63 6f 64 65 3d  stroy || opcode=
2da0: 3d 4f 50 5f 56 55 70 64 61 74 65 20 7c 7c 20 6f  =OP_VUpdate || o
2db0: 70 63 6f 64 65 3d 3d 4f 50 5f 56 52 65 6e 61 6d  pcode==OP_VRenam
2dc0: 65 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  e .#ifndef SQLIT
2dd0: 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b  E_OMIT_FOREIGN_K
2de0: 45 59 0a 20 20 20 20 20 7c 7c 20 28 6f 70 63 6f  EY.     || (opco
2df0: 64 65 3d 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72  de==OP_FkCounter
2e00: 20 26 26 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26   && pOp->p1==0 &
2e10: 26 20 70 4f 70 2d 3e 70 32 3d 3d 31 29 20 0a 23  & pOp->p2==1) .#
2e20: 65 6e 64 69 66 0a 20 20 20 20 20 7c 7c 20 28 28  endif.     || ((
2e30: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61 6c 74 20  opcode==OP_Halt 
2e40: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61  || opcode==OP_Ha
2e50: 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20 20 20 20  ltIfNull) .     
2e60: 20 26 26 20 28 28 70 4f 70 2d 3e 70 31 26 30 78   && ((pOp->p1&0x
2e70: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53  ff)==SQLITE_CONS
2e80: 54 52 41 49 4e 54 20 26 26 20 70 4f 70 2d 3e 70  TRAINT && pOp->p
2e90: 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29 0a 20 20  2==OE_Abort)).  
2ea0: 20 20 29 7b 0a 20 20 20 20 20 20 68 61 73 41 62    ){.      hasAb
2eb0: 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 62  ort = 1;.      b
2ec0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2ed0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2ee0: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2ef0: 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  ub);..  /* Retur
2f00: 6e 20 74 72 75 65 20 69 66 20 68 61 73 41 62 6f  n true if hasAbo
2f10: 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20 4f 72  rt==mayAbort. Or
2f20: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69   if a malloc fai
2f30: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
2f40: 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20 66 61   ** If malloc fa
2f50: 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 77  iled, then the w
2f60: 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62 6f 76  hile() loop abov
2f70: 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20 69  e may not have i
2f80: 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74 68 72  terated.  ** thr
2f90: 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73  ough all opcodes
2fa0: 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20 6d 61   and hasAbort ma
2fb0: 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72 72 65  y be set incorre
2fc0: 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20 20 2a  ctly. Return.  *
2fd0: 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69 73 20  * true for this 
2fe0: 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e 74 20  case to prevent 
2ff0: 74 68 65 20 61 73 73 65 72 74 28 29 20 69 6e 20  the assert() in 
3000: 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72 61 6d  the callers fram
3010: 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61 69 6c  e.  ** from fail
3020: 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  ing.  */.  retur
3030: 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  n ( v->db->mallo
3040: 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73 41 62  cFailed || hasAb
3050: 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20 29 3b  ort==mayAbort );
3060: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
3070: 49 54 45 5f 44 45 42 55 47 20 2d 20 74 68 65 20  ITE_DEBUG - the 
3080: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
3090: 41 62 6f 72 74 28 29 20 66 75 6e 63 74 69 6f 6e  Abort() function
30a0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 70 20   */../*.** Loop 
30b0: 74 68 72 6f 75 67 68 20 74 68 65 20 70 72 6f 67  through the prog
30c0: 72 61 6d 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ram looking for 
30d0: 50 32 20 76 61 6c 75 65 73 20 74 68 61 74 20 61  P2 values that a
30e0: 72 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 6f  re negative.** o
30f0: 6e 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  n jump instructi
3100: 6f 6e 73 2e 20 20 45 61 63 68 20 73 75 63 68 20  ons.  Each such 
3110: 76 61 6c 75 65 20 69 73 20 61 20 6c 61 62 65 6c  value is a label
3120: 2e 20 20 52 65 73 6f 6c 76 65 20 74 68 65 0a 2a  .  Resolve the.*
3130: 2a 20 6c 61 62 65 6c 20 62 79 20 73 65 74 74 69  * label by setti
3140: 6e 67 20 74 68 65 20 50 32 20 76 61 6c 75 65 20  ng the P2 value 
3150: 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 6e  to its correct n
3160: 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a  on-zero value..*
3170: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3180: 65 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 63 65  e is called once
3190: 20 61 66 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64   after all opcod
31a0: 65 73 20 68 61 76 65 20 62 65 65 6e 20 69 6e 73  es have been ins
31b0: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 56 61 72  erted..**.** Var
31c0: 69 61 62 6c 65 20 2a 70 4d 61 78 46 75 6e 63 41  iable *pMaxFuncA
31d0: 72 67 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  rgs is set to th
31e0: 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 75 65 20  e maximum value 
31f0: 6f 66 20 61 6e 79 20 50 32 20 61 72 67 75 6d 65  of any P2 argume
3200: 6e 74 20 0a 2a 2a 20 74 6f 20 61 6e 20 4f 50 5f  nt .** to an OP_
3210: 46 75 6e 63 74 69 6f 6e 2c 20 4f 50 5f 41 67 67  Function, OP_Agg
3220: 53 74 65 70 20 6f 72 20 4f 50 5f 56 46 69 6c 74  Step or OP_VFilt
3230: 65 72 20 6f 70 63 6f 64 65 2e 20 54 68 69 73 20  er opcode. This 
3240: 69 73 20 75 73 65 64 20 62 79 20 0a 2a 2a 20 73  is used by .** s
3250: 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65  qlite3VdbeMakeRe
3260: 61 64 79 28 29 20 74 6f 20 73 69 7a 65 20 74 68  ady() to size th
3270: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3280: 72 72 61 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rray..**.** The 
3290: 4f 70 2e 6f 70 66 6c 61 67 73 20 66 69 65 6c 64  Op.opflags field
32a0: 20 69 73 20 73 65 74 20 6f 6e 20 61 6c 6c 20 6f   is set on all o
32b0: 70 63 6f 64 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  pcodes..*/.stati
32c0: 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 50 32  c void resolveP2
32d0: 56 61 6c 75 65 73 28 56 64 62 65 20 2a 70 2c 20  Values(Vdbe *p, 
32e0: 69 6e 74 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  int *pMaxFuncArg
32f0: 73 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  s){.  int i;.  i
3300: 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70  nt nMaxArgs = *p
3310: 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f  MaxFuncArgs;.  O
3320: 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65 20  p *pOp;.  Parse 
3330: 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50 61  *pParse = p->pPa
3340: 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62  rse;.  int *aLab
3350: 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61  el = pParse->aLa
3360: 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e  bel;.  p->readOn
3370: 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73  ly = 1;.  p->bIs
3380: 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 66 6f  Reader = 0;.  fo
3390: 72 28 70 4f 70 3d 70 2d 3e 61 4f 70 2c 20 69 3d  r(pOp=p->aOp, i=
33a0: 70 2d 3e 6e 4f 70 2d 31 3b 20 69 3e 3d 30 3b 20  p->nOp-1; i>=0; 
33b0: 69 2d 2d 2c 20 70 4f 70 2b 2b 29 7b 0a 20 20 20  i--, pOp++){.   
33c0: 20 75 38 20 6f 70 63 6f 64 65 20 3d 20 70 4f 70   u8 opcode = pOp
33d0: 2d 3e 6f 70 63 6f 64 65 3b 0a 0a 20 20 20 20 2f  ->opcode;..    /
33e0: 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20  * NOTE: Be sure 
33f0: 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f  to update mkopco
3400: 64 65 68 2e 61 77 6b 20 77 68 65 6e 20 61 64 64  deh.awk when add
3410: 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a  ing or removing.
3420: 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72 6f      ** cases fro
3430: 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20 2a  m this switch! *
3440: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 70  /.    switch( op
3450: 63 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 63 61  code ){.      ca
3460: 73 65 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 3a 0a  se OP_Function:.
3470: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 67        case OP_Ag
3480: 67 53 74 65 70 3a 20 7b 0a 20 20 20 20 20 20 20  gStep: {.       
3490: 20 69 66 28 20 70 4f 70 2d 3e 70 35 3e 6e 4d 61   if( pOp->p5>nMa
34a0: 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67 73  xArgs ) nMaxArgs
34b0: 20 3d 20 70 4f 70 2d 3e 70 35 3b 0a 20 20 20 20   = pOp->p5;.    
34c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
34d0: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 4f 50   }.      case OP
34e0: 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a  _Transaction: {.
34f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
3500: 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61 64  >p2!=0 ) p->read
3510: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  Only = 0;.      
3520: 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72 75 20 2a    /* fall thru *
3530: 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  /.      }.      
3540: 63 61 73 65 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d  case OP_AutoComm
3550: 69 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  it:.      case O
3560: 50 5f 53 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20  P_Savepoint: {. 
3570: 20 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61         p->bIsRea
3580: 64 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  der = 1;.       
3590: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
35a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
35b0: 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 63 61  MIT_WAL.      ca
35c0: 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74  se OP_Checkpoint
35d0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  :.#endif.      c
35e0: 61 73 65 20 4f 50 5f 56 61 63 75 75 6d 3a 0a 20  ase OP_Vacuum:. 
35f0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4a 6f 75       case OP_Jou
3600: 72 6e 61 6c 4d 6f 64 65 3a 20 7b 0a 20 20 20 20  rnalMode: {.    
3610: 20 20 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20      p->readOnly 
3620: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  = 0;.        p->
3630: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
3640: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3650: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
3660: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
3670: 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 63 61 73  LTABLE.      cas
3680: 65 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a  e OP_VUpdate: {.
3690: 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d          if( pOp-
36a0: 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e  >p2>nMaxArgs ) n
36b0: 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70  MaxArgs = pOp->p
36c0: 32 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  2;.        break
36d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36e0: 63 61 73 65 20 4f 50 5f 56 46 69 6c 74 65 72 3a  case OP_VFilter:
36f0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e   {.        int n
3700: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
3710: 28 20 70 2d 3e 6e 4f 70 20 2d 20 69 20 3e 3d 20  ( p->nOp - i >= 
3720: 33 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  3 );.        ass
3730: 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70 63  ert( pOp[-1].opc
3740: 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72 20  ode==OP_Integer 
3750: 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 70  );.        n = p
3760: 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20 20 20 20  Op[-1].p1;.     
3770: 20 20 20 69 66 28 20 6e 3e 6e 4d 61 78 41 72 67     if( n>nMaxArg
3780: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 6e  s ) nMaxArgs = n
3790: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
37a0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37b0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65        case OP_Ne
37c0: 78 74 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  xt:.      case O
37d0: 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20  P_NextIfOpen:.  
37e0: 20 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74      case OP_Sort
37f0: 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20  erNext: {.      
3800: 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61 6e    pOp->p4.xAdvan
3810: 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  ce = sqlite3Btre
3820: 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 70  eNext;.        p
3830: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3840: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3860: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72        case OP_Pr
3870: 65 76 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  ev:.      case O
3880: 50 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a  P_PrevIfOpen: {.
3890: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
38a0: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
38b0: 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73 3b  e3BtreePrevious;
38c0: 0a 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34  .        pOp->p4
38d0: 74 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43  type = P4_ADVANC
38e0: 45 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  E;.        break
38f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3900: 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 66 6c 61 67  .    pOp->opflag
3910: 73 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  s = sqlite3Opcod
3920: 65 50 72 6f 70 65 72 74 79 5b 6f 70 63 6f 64 65  eProperty[opcode
3930: 5d 3b 0a 20 20 20 20 69 66 28 20 28 70 4f 70 2d  ];.    if( (pOp-
3940: 3e 6f 70 66 6c 61 67 73 20 26 20 4f 50 46 4c 47  >opflags & OPFLG
3950: 5f 4a 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70  _JUMP)!=0 && pOp
3960: 2d 3e 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20  ->p2<0 ){.      
3970: 61 73 73 65 72 74 28 20 2d 31 2d 70 4f 70 2d 3e  assert( -1-pOp->
3980: 70 32 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  p2<pParse->nLabe
3990: 6c 20 29 3b 0a 20 20 20 20 20 20 70 4f 70 2d 3e  l );.      pOp->
39a0: 70 32 20 3d 20 61 4c 61 62 65 6c 5b 2d 31 2d 70  p2 = aLabel[-1-p
39b0: 4f 70 2d 3e 70 32 5d 3b 0a 20 20 20 20 7d 0a 20  Op->p2];.    }. 
39c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72   }.  sqlite3DbFr
39d0: 65 65 28 70 2d 3e 64 62 2c 20 70 50 61 72 73 65  ee(p->db, pParse
39e0: 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20 20 70 50 61  ->aLabel);.  pPa
39f0: 72 73 65 2d 3e 61 4c 61 62 65 6c 20 3d 20 30 3b  rse->aLabel = 0;
3a00: 0a 20 20 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65  .  pParse->nLabe
3a10: 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d 61 78 46 75  l = 0;.  *pMaxFu
3a20: 6e 63 41 72 67 73 20 3d 20 6e 4d 61 78 41 72 67  ncArgs = nMaxArg
3a30: 73 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  s;.  assert( p->
3a40: 62 49 73 52 65 61 64 65 72 21 3d 30 20 7c 7c 20  bIsReader!=0 || 
3a50: 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d  DbMaskAllZero(p-
3a60: 3e 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 7d  >btreeMask) );.}
3a70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3a80: 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 68  he address of th
3a90: 65 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69  e next instructi
3aa0: 6f 6e 20 74 6f 20 62 65 20 69 6e 73 65 72 74 65  on to be inserte
3ab0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
3ac0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
3ad0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 61 73 73  (Vdbe *p){.  ass
3ae0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3af0: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3b00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 6e 4f  ;.  return p->nO
3b10: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  p;.}../*.** This
3b20: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
3b30: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
3b40: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
3b50: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
3b60: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
3b70: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
3b80: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
3b90: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
3ba0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
3bb0: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
3bc0: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
3bd0: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
3be0: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
3bf0: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
3c00: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
3c10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
3c20: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
3c30: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
3c40: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
3c50: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
3c60: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
3c70: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
3c80: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
3c90: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
3ca0: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
3cb0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
3cc0: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
3cd0: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
3ce0: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
3cf0: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
3d00: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
3d10: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
3d20: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
3d30: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
3d40: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
3d50: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
3d60: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
3d70: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
3d80: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
3d90: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
3da0: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
3db0: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
3dc0: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
3dd0: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
3de0: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
3df0: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
3e00: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
3e10: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
3e20: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
3e30: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
3e40: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
3e50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
3e60: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
3e70: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
3e80: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
3e90: 20 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20    Return the.** 
3ea0: 61 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 66  address of the f
3eb0: 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 61  irst operation a
3ec0: 64 64 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  dded..*/.int sql
3ed0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73  ite3VdbeAddOpLis
3ee0: 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e  t(Vdbe *p, int n
3ef0: 4f 70 2c 20 56 64 62 65 4f 70 4c 69 73 74 20 63  Op, VdbeOpList c
3f00: 6f 6e 73 74 20 2a 61 4f 70 2c 20 69 6e 74 20 69  onst *aOp, int i
3f10: 4c 69 6e 65 6e 6f 29 7b 0a 20 20 69 6e 74 20 61  Lineno){.  int a
3f20: 64 64 72 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ddr;.  assert( p
3f30: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
3f40: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
3f50: 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e  ( p->nOp + nOp >
3f60: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
3f70: 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72  lloc && growOpAr
3f80: 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20  ray(p, nOp) ){. 
3f90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3fa0: 0a 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70  .  addr = p->nOp
3fb0: 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 6e  ;.  if( ALWAYS(n
3fc0: 4f 70 3e 30 29 20 29 7b 0a 20 20 20 20 69 6e 74  Op>0) ){.    int
3fd0: 20 69 3b 0a 20 20 20 20 56 64 62 65 4f 70 4c 69   i;.    VdbeOpLi
3fe0: 73 74 20 63 6f 6e 73 74 20 2a 70 49 6e 20 3d 20  st const *pIn = 
3ff0: 61 4f 70 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  aOp;.    for(i=0
4000: 3b 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 70 49  ; i<nOp; i++, pI
4010: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  n++){.      int 
4020: 70 32 20 3d 20 70 49 6e 2d 3e 70 32 3b 0a 20 20  p2 = pIn->p2;.  
4030: 20 20 20 20 56 64 62 65 4f 70 20 2a 70 4f 75 74      VdbeOp *pOut
4040: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64 64   = &p->aOp[i+add
4050: 72 5d 3b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  r];.      pOut->
4060: 6f 70 63 6f 64 65 20 3d 20 70 49 6e 2d 3e 6f 70  opcode = pIn->op
4070: 63 6f 64 65 3b 0a 20 20 20 20 20 20 70 4f 75 74  code;.      pOut
4080: 2d 3e 70 31 20 3d 20 70 49 6e 2d 3e 70 31 3b 0a  ->p1 = pIn->p1;.
4090: 20 20 20 20 20 20 69 66 28 20 70 32 3c 30 20 29        if( p2<0 )
40a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
40b0: 28 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50  ( sqlite3OpcodeP
40c0: 72 6f 70 65 72 74 79 5b 70 4f 75 74 2d 3e 6f 70  roperty[pOut->op
40d0: 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55  code] & OPFLG_JU
40e0: 4d 50 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f  MP );.        pO
40f0: 75 74 2d 3e 70 32 20 3d 20 61 64 64 72 20 2b 20  ut->p2 = addr + 
4100: 41 44 44 52 28 70 32 29 3b 0a 20 20 20 20 20 20  ADDR(p2);.      
4110: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4120: 4f 75 74 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20  Out->p2 = p2;.  
4130: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4f 75 74      }.      pOut
4140: 2d 3e 70 33 20 3d 20 70 49 6e 2d 3e 70 33 3b 0a  ->p3 = pIn->p3;.
4150: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 74 79        pOut->p4ty
4160: 70 65 20 3d 20 50 34 5f 4e 4f 54 55 53 45 44 3b  pe = P4_NOTUSED;
4170: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 34 2e  .      pOut->p4.
4180: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 4f 75  p = 0;.      pOu
4190: 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66 64 65  t->p5 = 0;.#ifde
41a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41b0: 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53  EXPLAIN_COMMENTS
41c0: 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  .      pOut->zCo
41d0: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
41e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
41f0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
4200: 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69      pOut->iSrcLi
4210: 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a  ne = iLineno+i;.
4220: 23 65 6c 73 65 0a 20 20 20 20 20 20 28 76 6f 69  #else.      (voi
4230: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
4240: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
4250: 44 45 42 55 47 0a 20 20 20 20 20 20 69 66 28 20  DEBUG.      if( 
4260: 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  p->db->flags & S
4270: 51 4c 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54  QLITE_VdbeAddopT
4280: 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
4290: 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
42a0: 4f 70 28 30 2c 20 69 2b 61 64 64 72 2c 20 26 70  Op(0, i+addr, &p
42b0: 2d 3e 61 4f 70 5b 69 2b 61 64 64 72 5d 29 3b 0a  ->aOp[i+addr]);.
42c0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
42d0: 20 20 20 7d 0a 20 20 20 20 70 2d 3e 6e 4f 70 20     }.    p->nOp 
42e0: 2b 3d 20 6e 4f 70 3b 0a 20 20 7d 0a 20 20 72 65  += nOp;.  }.  re
42f0: 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 23 69  turn addr;.}..#i
4300: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
4310: 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41  _ENABLE_STMT_SCA
4320: 4e 53 54 41 54 55 53 29 0a 2f 2a 0a 2a 2a 20 41  NSTATUS)./*.** A
4330: 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
4340: 68 65 20 61 72 72 61 79 20 6f 66 20 63 6f 75 6e  he array of coun
4350: 74 65 72 73 20 6d 61 6e 61 67 65 64 20 62 79 20  ters managed by 
4360: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
4370: 6e 73 74 61 74 75 73 28 29 2e 0a 2a 2f 0a 76 6f  nstatus()..*/.vo
4380: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 63  id sqlite3VdbeSc
4390: 61 6e 53 74 61 74 75 73 28 0a 20 20 56 64 62 65  anStatus(.  Vdbe
43a0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
43c0: 4d 20 74 6f 20 61 64 64 20 73 63 61 6e 73 74 61  M to add scansta
43d0: 74 75 73 28 29 20 74 6f 20 2a 2f 0a 20 20 69 6e  tus() to */.  in
43e0: 74 20 61 64 64 72 45 78 70 6c 61 69 6e 2c 20 20  t addrExplain,  
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4400: 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 45   Address of OP_E
4410: 78 70 6c 61 69 6e 20 28 6f 72 20 30 29 20 2a 2f  xplain (or 0) */
4420: 0a 20 20 69 6e 74 20 61 64 64 72 4c 6f 6f 70 2c  .  int addrLoop,
4430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4440: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
4450: 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
4460: 20 0a 20 20 69 6e 74 20 61 64 64 72 56 69 73 69   .  int addrVisi
4470: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
4480: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4490: 66 20 72 6f 77 73 20 76 69 73 69 74 65 64 20 63  f rows visited c
44a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 4c 6f 67 45  ounter */.  LogE
44b0: 73 74 20 6e 45 73 74 2c 20 20 20 20 20 20 20 20  st nEst,        
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
44d0: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
44e0: 6f 66 20 6f 75 74 70 75 74 20 72 6f 77 73 20 2a  of output rows *
44f0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4500: 7a 4e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  zName           
4510: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4520: 61 62 6c 65 20 6f 72 20 69 6e 64 65 78 20 62 65  able or index be
4530: 69 6e 67 20 73 63 61 6e 6e 65 64 20 2a 2f 0a 29  ing scanned */.)
4540: 7b 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20  {.  int nByte = 
4550: 28 70 2d 3e 6e 53 63 61 6e 2b 31 29 20 2a 20 73  (p->nScan+1) * s
4560: 69 7a 65 6f 66 28 53 63 61 6e 53 74 61 74 75 73  izeof(ScanStatus
4570: 29 3b 0a 20 20 53 63 61 6e 53 74 61 74 75 73 20  );.  ScanStatus 
4580: 2a 61 4e 65 77 3b 0a 20 20 61 4e 65 77 20 3d 20  *aNew;.  aNew = 
4590: 28 53 63 61 6e 53 74 61 74 75 73 2a 29 73 71 6c  (ScanStatus*)sql
45a0: 69 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 70 2d  ite3DbRealloc(p-
45b0: 3e 64 62 2c 20 70 2d 3e 61 53 63 61 6e 2c 20 6e  >db, p->aScan, n
45c0: 42 79 74 65 29 3b 0a 20 20 69 66 28 20 61 4e 65  Byte);.  if( aNe
45d0: 77 20 29 7b 0a 20 20 20 20 53 63 61 6e 53 74 61  w ){.    ScanSta
45e0: 74 75 73 20 2a 70 4e 65 77 20 3d 20 26 61 4e 65  tus *pNew = &aNe
45f0: 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b 5d 3b 0a 20  w[p->nScan++];. 
4600: 20 20 20 70 4e 65 77 2d 3e 61 64 64 72 45 78 70     pNew->addrExp
4610: 6c 61 69 6e 20 3d 20 61 64 64 72 45 78 70 6c 61  lain = addrExpla
4620: 69 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64  in;.    pNew->ad
4630: 64 72 4c 6f 6f 70 20 3d 20 61 64 64 72 4c 6f 6f  drLoop = addrLoo
4640: 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  p;.    pNew->add
4650: 72 56 69 73 69 74 20 3d 20 61 64 64 72 56 69 73  rVisit = addrVis
4660: 69 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6e 45  it;.    pNew->nE
4670: 73 74 20 3d 20 6e 45 73 74 3b 0a 20 20 20 20 70  st = nEst;.    p
4680: 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  New->zName = sql
4690: 69 74 65 33 44 62 53 74 72 44 75 70 28 70 2d 3e  ite3DbStrDup(p->
46a0: 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  db, zName);.    
46b0: 70 2d 3e 61 53 63 61 6e 20 3d 20 61 4e 65 77 3b  p->aScan = aNew;
46c0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .  }.}.#endif...
46d0: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
46e0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 31   value of the P1
46f0: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73   operand for a s
4700: 70 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74  pecific instruct
4710: 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ion..** This rou
4720: 74 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77  tine is useful w
4730: 68 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67  hen a large prog
4740: 72 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72  ram is loaded fr
4750: 6f 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61  om a.** static a
4760: 72 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74  rray using sqlit
4770: 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20  e3VdbeAddOpList 
4780: 62 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d  but we want to m
4790: 61 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e  ake a.** few min
47a0: 6f 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  or changes to th
47b0: 65 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  e program..*/.vo
47c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
47d0: 61 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20  angeP1(Vdbe *p, 
47e0: 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61  u32 addr, int va
47f0: 6c 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21  l){.  assert( p!
4800: 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33  =0 );.  if( ((u3
4810: 32 29 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29  2)p->nOp)>addr )
4820: 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64  {.    p->aOp[add
4830: 72 5d 2e 70 31 20 3d 20 76 61 6c 3b 0a 20 20 7d  r].p1 = val;.  }
4840: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
4850: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
4860: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 66 6f 72  e P2 operand for
4870: 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73 74   a specific inst
4880: 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69 73  ruction..** This
4890: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 66   routine is usef
48a0: 75 6c 20 66 6f 72 20 73 65 74 74 69 6e 67 20 61  ul for setting a
48b0: 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
48c0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
48d0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 56  e3VdbeChangeP2(V
48e0: 64 62 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72  dbe *p, u32 addr
48f0: 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73  , int val){.  as
4900: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
4910: 69 66 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70  if( ((u32)p->nOp
4920: 29 3e 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d  )>addr ){.    p-
4930: 3e 61 4f 70 5b 61 64 64 72 5d 2e 70 32 20 3d 20  >aOp[addr].p2 = 
4940: 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  val;.  }.}../*.*
4950: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
4960: 75 65 20 6f 66 20 74 68 65 20 50 33 20 6f 70 65  ue of the P3 ope
4970: 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69  rand for a speci
4980: 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  fic instruction.
4990: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
49a0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 56 64 62  VdbeChangeP3(Vdb
49b0: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
49c0: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
49d0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
49e0: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
49f0: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4a00: 4f 70 5b 61 64 64 72 5d 2e 70 33 20 3d 20 76 61  Op[addr].p3 = va
4a10: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4a20: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
4a30: 20 6f 66 20 74 68 65 20 50 35 20 6f 70 65 72 61   of the P5 opera
4a40: 6e 64 20 66 6f 72 20 74 68 65 20 6d 6f 73 74 20  nd for the most 
4a50: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 61 64 64 65  recently.** adde
4a60: 64 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a  d operation..*/.
4a70: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
4a80: 43 68 61 6e 67 65 50 35 28 56 64 62 65 20 2a 70  ChangeP5(Vdbe *p
4a90: 2c 20 75 38 20 76 61 6c 29 7b 0a 20 20 61 73 73  , u8 val){.  ass
4aa0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69  ert( p!=0 );.  i
4ab0: 66 28 20 70 2d 3e 61 4f 70 20 29 7b 0a 20 20 20  f( p->aOp ){.   
4ac0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e   assert( p->nOp>
4ad0: 30 20 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b  0 );.    p->aOp[
4ae0: 70 2d 3e 6e 4f 70 2d 31 5d 2e 70 35 20 3d 20 76  p->nOp-1].p5 = v
4af0: 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  al;.  }.}../*.**
4b00: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
4b10: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
4b20: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
4b30: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
4b40: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
4b50: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
4b60: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
4b70: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
4b80: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
4b90: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
4ba0: 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  r){.  sqlite3Vdb
4bb0: 65 43 68 61 6e 67 65 50 32 28 70 2c 20 61 64 64  eChangeP2(p, add
4bc0: 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20 70 2d  r, p->nOp);.  p-
4bd0: 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64 4f  >pParse->iFixedO
4be0: 70 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a  p = p->nOp - 1;.
4bf0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
4c00: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
4c10: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
4c20: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
4c30: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
4c40: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
4c50: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
4c60: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
4c70: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
4c80: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
4c90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
4ca0: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
4cb0: 28 20 41 4c 57 41 59 53 28 70 44 65 66 29 20 26  ( ALWAYS(pDef) &
4cc0: 26 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  & (pDef->funcFla
4cd0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
4ce0: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
4cf0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4d00: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
4d10: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
4d20: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
4d30: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
4d40: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
4d50: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
4d60: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
4d70: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 50  tatic void freeP
4d80: 34 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  4(sqlite3 *db, i
4d90: 6e 74 20 70 34 74 79 70 65 2c 20 76 6f 69 64 20  nt p4type, void 
4da0: 2a 70 34 29 7b 0a 20 20 69 66 28 20 70 34 20 29  *p4){.  if( p4 )
4db0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
4dc0: 20 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20   );.    switch( 
4dd0: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20  p4type ){.      
4de0: 63 61 73 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20  case P4_REAL:.  
4df0: 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54 36      case P4_INT6
4e00: 34 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50 34  4:.      case P4
4e10: 5f 44 59 4e 41 4d 49 43 3a 0a 20 20 20 20 20 20  _DYNAMIC:.      
4e20: 63 61 73 65 20 50 34 5f 49 4e 54 41 52 52 41 59  case P4_INTARRAY
4e30: 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
4e40: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 34  te3DbFree(db, p4
4e50: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4e60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4e70: 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a  case P4_KEYINFO:
4e80: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 64   {.        if( d
4e90: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
4ea0: 3d 30 20 29 20 73 71 6c 69 74 65 33 4b 65 79 49  =0 ) sqlite3KeyI
4eb0: 6e 66 6f 55 6e 72 65 66 28 28 4b 65 79 49 6e 66  nfoUnref((KeyInf
4ec0: 6f 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 20 20  o*)p4);.        
4ed0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4ee0: 20 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52       case P4_MPR
4ef0: 49 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 20 20  INTF: {.        
4f00: 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46  if( db->pnBytesF
4f10: 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74 65  reed==0 ) sqlite
4f20: 33 5f 66 72 65 65 28 70 34 29 3b 0a 20 20 20 20  3_free(p4);.    
4f30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4f40: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50 34   }.      case P4
4f50: 5f 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20  _FUNCDEF: {.    
4f60: 20 20 20 20 66 72 65 65 45 70 68 65 6d 65 72 61      freeEphemera
4f70: 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 28 46  lFunction(db, (F
4f80: 75 6e 63 44 65 66 2a 29 70 34 29 3b 0a 20 20 20  uncDef*)p4);.   
4f90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4fa0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
4fb0: 34 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 20  4_MEM: {.       
4fc0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4fd0: 46 72 65 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  Freed==0 ){.    
4fe0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c        sqlite3Val
4ff0: 75 65 46 72 65 65 28 28 73 71 6c 69 74 65 33 5f  ueFree((sqlite3_
5000: 76 61 6c 75 65 2a 29 70 34 29 3b 0a 20 20 20 20  value*)p4);.    
5010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5020: 20 20 20 20 20 4d 65 6d 20 2a 70 20 3d 20 28 4d       Mem *p = (M
5030: 65 6d 2a 29 70 34 3b 0a 20 20 20 20 20 20 20 20  em*)p4;.        
5040: 20 20 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f    if( p->szMallo
5050: 63 20 29 20 73 71 6c 69 74 65 33 44 62 46 72 65  c ) sqlite3DbFre
5060: 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63  e(db, p->zMalloc
5070: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
5080: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
50a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
50b0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 50    }.      case P
50c0: 34 5f 56 54 41 42 20 3a 20 7b 0a 20 20 20 20 20  4_VTAB : {.     
50d0: 20 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74     if( db->pnByt
50e0: 65 73 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c  esFreed==0 ) sql
50f0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 28 28  ite3VtabUnlock((
5100: 56 54 61 62 6c 65 20 2a 29 70 34 29 3b 0a 20 20  VTable *)p4);.  
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d     }.    }.  }.}
5130: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65  ../*.** Free the
5140: 20 73 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64   space allocated
5150: 20 66 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79   for aOp and any
5160: 20 70 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63   p4 values alloc
5170: 61 74 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ated for the.** 
5180: 6f 70 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65  opcodes containe
5190: 64 20 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70  d within. If aOp
51a0: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20   is not NULL it 
51b0: 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f  is assumed to co
51c0: 6e 74 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e  ntain .** nOp en
51d0: 74 72 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69  tries. .*/.stati
51e0: 63 20 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f  c void vdbeFreeO
51f0: 70 41 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a  pArray(sqlite3 *
5200: 64 62 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74  db, Op *aOp, int
5210: 20 6e 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70   nOp){.  if( aOp
5220: 20 29 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b   ){.    Op *pOp;
5230: 0a 20 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70  .    for(pOp=aOp
5240: 3b 20 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b  ; pOp<&aOp[nOp];
5250: 20 70 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 66   pOp++){.      f
5260: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
5270: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
5280: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
5290: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
52a0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73  COMMENTS.      s
52b0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
52c0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
52d0: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
52e0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
52f0: 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b  DbFree(db, aOp);
5300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74  .}../*.** Link t
5310: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62  he SubProgram ob
5320: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
5330: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
5340: 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  nt into the link
5350: 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64  ed.** list at Vd
5360: 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20  be.pSubProgram. 
5370: 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65  This list is use
5380: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
5390: 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f  sub-program.** o
53a0: 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20  bjects when the 
53b0: 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  VM is no longer 
53c0: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69  required..*/.voi
53d0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e  d sqlite3VdbeLin
53e0: 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65  kSubProgram(Vdbe
53f0: 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67   *pVdbe, SubProg
5400: 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e  ram *p){.  p->pN
5410: 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72  ext = pVdbe->pPr
5420: 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e  ogram;.  pVdbe->
5430: 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a  pProgram = p;.}.
5440: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
5450: 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72  e opcode at addr
5460: 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f   into OP_Noop.*/
5470: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5480: 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64  eChangeToNoop(Vd
5490: 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29  be *p, int addr)
54a0: 7b 0a 20 20 69 66 28 20 61 64 64 72 3c 70 2d 3e  {.  if( addr<p->
54b0: 6e 4f 70 20 29 7b 0a 20 20 20 20 56 64 62 65 4f  nOp ){.    VdbeO
54c0: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
54d0: 5b 61 64 64 72 5d 3b 0a 20 20 20 20 73 71 6c 69  [addr];.    sqli
54e0: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
54f0: 0a 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20  .    freeP4(db, 
5500: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
5510: 2d 3e 70 34 2e 70 29 3b 0a 20 20 20 20 6d 65 6d  ->p4.p);.    mem
5520: 73 65 74 28 70 4f 70 2c 20 30 2c 20 73 69 7a 65  set(pOp, 0, size
5530: 6f 66 28 70 4f 70 5b 30 5d 29 29 3b 0a 20 20 20  of(pOp[0]));.   
5540: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 3d 20 4f   pOp->opcode = O
5550: 50 5f 4e 6f 6f 70 3b 0a 20 20 20 20 69 66 28 20  P_Noop;.    if( 
5560: 61 64 64 72 3d 3d 70 2d 3e 6e 4f 70 2d 31 20 29  addr==p->nOp-1 )
5570: 20 70 2d 3e 6e 4f 70 2d 2d 3b 0a 20 20 7d 0a 7d   p->nOp--;.  }.}
5580: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ../*.** If the l
5590: 61 73 74 20 6f 70 63 6f 64 65 20 69 73 20 22 6f  ast opcode is "o
55a0: 70 22 20 61 6e 64 20 69 74 20 69 73 20 6e 6f 74  p" and it is not
55b0: 20 61 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74   a jump destinat
55c0: 69 6f 6e 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d  ion,.** then rem
55d0: 6f 76 65 20 69 74 2e 20 20 52 65 74 75 72 6e 20  ove it.  Return 
55e0: 74 72 75 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79  true if and only
55f0: 20 69 66 20 61 6e 20 6f 70 63 6f 64 65 20 77 61   if an opcode wa
5600: 73 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e  s removed..*/.in
5610: 74 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c  t sqlite3VdbeDel
5620: 65 74 65 50 72 69 6f 72 4f 70 63 6f 64 65 28 56  etePriorOpcode(V
5630: 64 62 65 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a  dbe *p, u8 op){.
5640: 20 20 69 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29    if( (p->nOp-1)
5650: 3e 28 70 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69  >(p->pParse->iFi
5660: 78 65 64 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70  xedOp) && p->aOp
5670: 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64  [p->nOp-1].opcod
5680: 65 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 73 71 6c  e==op ){.    sql
5690: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f  ite3VdbeChangeTo
56a0: 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31  Noop(p, p->nOp-1
56b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
56c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
56d0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
56e0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
56f0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20  value of the P4 
5700: 6f 70 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70  operand for a sp
5710: 65 63 69 66 69 63 20 69 6e 73 74 72 75 63 74 69  ecific instructi
5720: 6f 6e 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  on..** This rout
5730: 69 6e 65 20 69 73 20 75 73 65 66 75 6c 20 77 68  ine is useful wh
5740: 65 6e 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72  en a large progr
5750: 61 6d 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f  am is loaded fro
5760: 6d 20 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72  m a.** static ar
5770: 72 61 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ray using sqlite
5780: 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62  3VdbeAddOpList b
5790: 75 74 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61  ut we want to ma
57a0: 6b 65 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f  ke a.** few mino
57b0: 72 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  r changes to the
57c0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20   program..**.** 
57d0: 49 66 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65  If n>=0 then the
57e0: 20 50 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64   P4 operand is d
57f0: 79 6e 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20  ynamic, meaning 
5800: 74 68 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a  that a copy of.*
5810: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 69 73 20  * the string is 
5820: 6d 61 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  made into memory
5830: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73   obtained from s
5840: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e  qlite3_malloc().
5850: 0a 2a 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e  .** A value of n
5860: 3d 3d 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62  ==0 means copy b
5870: 79 74 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74  ytes of zP4 up t
5880: 6f 20 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20  o and including 
5890: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c  the.** first nul
58a0: 6c 20 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20  l byte.  If n>0 
58b0: 74 68 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79  then copy n+1 by
58c0: 74 65 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a  tes of zP4..** .
58d0: 2a 2a 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20  ** Other values 
58e0: 6f 66 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c  of n (P4_STATIC,
58f0: 20 50 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e   P4_COLLSEQ etc.
5900: 29 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  ) indicate that 
5910: 7a 50 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f  zP4 points.** to
5920: 20 61 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72   a string or str
5930: 75 63 74 75 72 65 20 74 68 61 74 20 69 73 20 67  ucture that is g
5940: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
5950: 73 74 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74  st for the lifet
5960: 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64  ime of.** the Vd
5970: 62 65 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73  be. In these cas
5980: 65 73 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63  es we can just c
5990: 6f 70 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e  opy the pointer.
59a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30  .**.** If addr<0
59b0: 20 74 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20   then change P4 
59c0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
59d0: 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e  ntly inserted in
59e0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
59f0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
5a00: 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c 20  angeP4(Vdbe *p, 
5a10: 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74 20  int addr, const 
5a20: 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20 6e  char *zP4, int n
5a30: 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  ){.  Op *pOp;.  
5a40: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 61  sqlite3 *db;.  a
5a50: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
5a60: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
5a70: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
5a80: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
5a90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70   );.  if( p->aOp
5aa0: 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  ==0 || db->mallo
5ab0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69  cFailed ){.    i
5ac0: 66 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 7b  f( n!=P4_VTAB ){
5ad0: 0a 20 20 20 20 20 20 66 72 65 65 50 34 28 64 62  .      freeP4(db
5ae0: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
5af0: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
5b00: 7d 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  }.    return;.  
5b10: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  }.  assert( p->n
5b20: 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  Op>0 );.  assert
5b30: 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20 29 3b  ( addr<p->nOp );
5b40: 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b  .  if( addr<0 ){
5b50: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e  .    addr = p->n
5b60: 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 70 4f  Op - 1;.  }.  pO
5b70: 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  p = &p->aOp[addr
5b80: 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4f 70  ];.  assert( pOp
5b90: 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4e 4f 54  ->p4type==P4_NOT
5ba0: 55 53 45 44 0a 20 20 20 20 20 20 20 7c 7c 20 70  USED.       || p
5bb0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 49  Op->p4type==P4_I
5bc0: 4e 54 33 32 0a 20 20 20 20 20 20 20 7c 7c 20 70  NT32.       || p
5bd0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 4b  Op->p4type==P4_K
5be0: 45 59 49 4e 46 4f 20 29 3b 0a 20 20 66 72 65 65  EYINFO );.  free
5bf0: 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79  P4(db, pOp->p4ty
5c00: 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a  pe, pOp->p4.p);.
5c10: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b    pOp->p4.p = 0;
5c20: 0a 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54  .  if( n==P4_INT
5c30: 33 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74  32 ){.    /* Not
5c40: 65 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20  e: this cast is 
5c50: 73 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68  safe, because th
5c60: 65 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f  e origin data po
5c70: 69 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20  int was an int. 
5c80: 20 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63     ** that was c
5c90: 61 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20  ast to a (const 
5ca0: 63 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20  char *). */.    
5cb0: 70 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49  pOp->p4.i = SQLI
5cc0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50  TE_PTR_TO_INT(zP
5cd0: 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  4);.    pOp->p4t
5ce0: 79 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a  ype = P4_INT32;.
5cf0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 3d    }else if( zP4=
5d00: 3d 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  =0 ){.    pOp->p
5d10: 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70 4f 70  4.p = 0;.    pOp
5d20: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
5d30: 54 55 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69  TUSED;.  }else i
5d40: 66 28 20 6e 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f  f( n==P4_KEYINFO
5d50: 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e   ){.    pOp->p4.
5d60: 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34 3b 0a  p = (void*)zP4;.
5d70: 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20      pOp->p4type 
5d80: 3d 20 50 34 5f 4b 45 59 49 4e 46 4f 3b 0a 20 20  = P4_KEYINFO;.  
5d90: 7d 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f  }else if( n==P4_
5da0: 56 54 41 42 20 29 7b 0a 20 20 20 20 70 4f 70 2d  VTAB ){.    pOp-
5db0: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
5dc0: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
5dd0: 79 70 65 20 3d 20 50 34 5f 56 54 41 42 3b 0a 20  ype = P4_VTAB;. 
5de0: 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f     sqlite3VtabLo
5df0: 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 7a 50 34  ck((VTable *)zP4
5e00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
5e10: 28 56 54 61 62 6c 65 20 2a 29 7a 50 34 29 2d 3e  (VTable *)zP4)->
5e20: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
5e30: 65 6c 73 65 20 69 66 28 20 6e 3c 30 20 29 7b 0a  else if( n<0 ){.
5e40: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
5e50: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
5e60: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
5e70: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
5e80: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 6e  }else{.    if( n
5e90: 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69 74 65  ==0 ) n = sqlite
5ea0: 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29 3b 0a  3Strlen30(zP4);.
5eb0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20 3d 20      pOp->p4.z = 
5ec0: 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44 75 70  sqlite3DbStrNDup
5ed0: 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e 29 3b  (p->db, zP4, n);
5ee0: 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65  .    pOp->p4type
5ef0: 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b 0a 20   = P4_DYNAMIC;. 
5f00: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20   }.}../*.** Set 
5f10: 74 68 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f  the P4 on the mo
5f20: 73 74 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65  st recently adde
5f30: 64 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 65 20  d opcode to the 
5f40: 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74 68 65 0a  KeyInfo for the.
5f50: 2a 2a 20 69 6e 64 65 78 20 67 69 76 65 6e 2e 0a  ** index given..
5f60: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5f70: 64 62 65 53 65 74 50 34 4b 65 79 49 6e 66 6f 28  dbeSetP4KeyInfo(
5f80: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 49  Parse *pParse, I
5f90: 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a 20 20 56  ndex *pIdx){.  V
5fa0: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5fb0: 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
5fc0: 28 20 76 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( v!=0 );.  asse
5fd0: 72 74 28 20 70 49 64 78 21 3d 30 20 29 3b 0a 20  rt( pIdx!=0 );. 
5fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
5ff0: 67 65 50 34 28 76 2c 20 2d 31 2c 20 28 63 68 61  geP4(v, -1, (cha
6000: 72 2a 29 73 71 6c 69 74 65 33 4b 65 79 49 6e 66  r*)sqlite3KeyInf
6010: 6f 4f 66 49 6e 64 65 78 28 70 50 61 72 73 65 2c  oOfIndex(pParse,
6020: 20 70 49 64 78 29 2c 0a 20 20 20 20 20 20 20 20   pIdx),.        
6030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 34                P4
6040: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a 0a 23 69  _KEYINFO);.}..#i
6050: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6060: 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45  LE_EXPLAIN_COMME
6070: 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  NTS./*.** Change
6080: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
6090: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
60a0: 79 20 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74  y coded instruct
60b0: 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69 6e 73 65  ion.  Or.** inse
60c0: 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e 64 20 61  rt a No-op and a
60d0: 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 74  dd the comment t
60e0: 6f 20 74 68 61 74 20 6e 65 77 20 69 6e 73 74 72  o that new instr
60f0: 75 63 74 69 6f 6e 2e 20 20 54 68 69 73 0a 2a 2a  uction.  This.**
6100: 20 6d 61 6b 65 73 20 74 68 65 20 63 6f 64 65 20   makes the code 
6110: 65 61 73 69 65 72 20 74 6f 20 72 65 61 64 20 64  easier to read d
6120: 75 72 69 6e 67 20 64 65 62 75 67 67 69 6e 67 2e  uring debugging.
6130: 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69 73 20 68    None of this h
6140: 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20 61 20 70  appens.** in a p
6150: 72 6f 64 75 63 74 69 6f 6e 20 62 75 69 6c 64 2e  roduction build.
6160: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6170: 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 56 64 62  vdbeVComment(Vdb
6180: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6190: 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61 5f 6c 69   *zFormat, va_li
61a0: 73 74 20 61 70 29 7b 0a 20 20 61 73 73 65 72 74  st ap){.  assert
61b0: 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c 20 70 2d  ( p->nOp>0 || p-
61c0: 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20 61 73 73  >aOp==0 );.  ass
61d0: 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d 30 20 7c  ert( p->aOp==0 |
61e0: 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  | p->aOp[p->nOp-
61f0: 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d 30 20 7c  1].zComment==0 |
6200: 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  | p->db->mallocF
6210: 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70  ailed );.  if( p
6220: 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 61 73 73  ->nOp ){.    ass
6230: 65 72 74 28 20 70 2d 3e 61 4f 70 20 29 3b 0a 20  ert( p->aOp );. 
6240: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6250: 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f 70 5b 70  (p->db, p->aOp[p
6260: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6270: 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 70  t);.    p->aOp[p
6280: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6290: 74 20 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69  t = sqlite3VMPri
62a0: 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d  ntf(p->db, zForm
62b0: 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76  at, ap);.  }.}.v
62c0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
62d0: 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20  omment(Vdbe *p, 
62e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
62f0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
6300: 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70  list ap;.  if( p
6310: 20 29 7b 0a 20 20 20 20 76 61 5f 73 74 61 72 74   ){.    va_start
6320: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
6330: 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28     vdbeVComment(
6340: 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  p, zFormat, ap);
6350: 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  .    va_end(ap);
6360: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
6370: 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f 6d 6d 65  te3VdbeNoopComme
6380: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
6390: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
63a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
63b0: 20 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a   ap;.  if( p ){.
63c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
63d0: 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e 6f 6f 70  ddOp0(p, OP_Noop
63e0: 29 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28  );.    va_start(
63f0: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
6400: 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28 70    vdbeVComment(p
6410: 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
6420: 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a      va_end(ap);.
6430: 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 20 2f 2a    }.}.#endif  /*
6440: 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66 64   NDEBUG */..#ifd
6450: 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43  ef SQLITE_VDBE_C
6460: 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a 20 53 65  OVERAGE./*.** Se
6470: 74 20 74 68 65 20 76 61 6c 75 65 20 69 66 20 74  t the value if t
6480: 68 65 20 69 53 72 63 4c 69 6e 65 20 66 69 65 6c  he iSrcLine fiel
6490: 64 20 66 6f 72 20 74 68 65 20 70 72 65 76 69 6f  d for the previo
64a0: 75 73 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  usly coded instr
64b0: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  uction..*/.void 
64c0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4c 69  sqlite3VdbeSetLi
64d0: 6e 65 4e 75 6d 62 65 72 28 56 64 62 65 20 2a 76  neNumber(Vdbe *v
64e0: 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b 0a 20 20  , int iLine){.  
64f0: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
6500: 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c 69 6e 65  (v,-1)->iSrcLine
6510: 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23 65 6e 64   = iLine;.}.#end
6520: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 56 44 42  if /* SQLITE_VDB
6530: 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f 0a 0a 2f  E_COVERAGE */../
6540: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6550: 6f 70 63 6f 64 65 20 66 6f 72 20 61 20 67 69 76  opcode for a giv
6560: 65 6e 20 61 64 64 72 65 73 73 2e 20 20 49 66 20  en address.  If 
6570: 74 68 65 20 61 64 64 72 65 73 73 20 69 73 20 2d  the address is -
6580: 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65 74 75 72  1, then.** retur
6590: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
65a0: 74 6c 79 20 69 6e 73 65 72 74 65 64 20 6f 70 63  tly inserted opc
65b0: 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  ode..**.** If a 
65c0: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
65d0: 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75  n error has occu
65e0: 72 72 65 64 20 70 72 69 6f 72 20 74 6f 20 74 68  rred prior to th
65f0: 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20 74 68 69  e calling of thi
6600: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 74 68  s.** routine, th
6610: 65 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  en a pointer to 
6620: 61 20 64 75 6d 6d 79 20 56 64 62 65 4f 70 20 77  a dummy VdbeOp w
6630: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
6640: 20 20 54 68 61 74 20 6f 70 63 6f 64 65 0a 2a 2a    That opcode.**
6650: 20 69 73 20 72 65 61 64 61 62 6c 65 20 62 75 74   is readable but
6660: 20 6e 6f 74 20 77 72 69 74 61 62 6c 65 2c 20 74   not writable, t
6670: 68 6f 75 67 68 20 69 74 20 69 73 20 63 61 73 74  hough it is cast
6680: 20 74 6f 20 61 20 77 72 69 74 61 62 6c 65 20 76   to a writable v
6690: 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20 72 65 74  alue..** The ret
66a0: 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d 79 20 6f  urn of a dummy o
66b0: 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20 74 68 65  pcode allows the
66c0: 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74 69 6e 75   call to continu
66d0: 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67 0a 2a 2a  e functioning.**
66e0: 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d 20 66 61   after an OOM fa
66f0: 75 6c 74 20 77 69 74 68 6f 75 74 20 68 61 76 69  ult without havi
6700: 6e 67 20 74 6f 20 63 68 65 63 6b 20 74 6f 20 73  ng to check to s
6710: 65 65 20 69 66 20 74 68 65 20 72 65 74 75 72 6e  ee if the return
6720: 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69 73 20 72   from .** this r
6730: 6f 75 74 69 6e 65 20 69 73 20 61 20 76 61 6c 69  outine is a vali
6740: 64 20 70 6f 69 6e 74 65 72 2e 20 20 42 75 74 20  d pointer.  But 
6750: 62 65 63 61 75 73 65 20 74 68 65 20 64 75 6d 6d  because the dumm
6760: 79 2e 6f 70 63 6f 64 65 20 69 73 20 30 2c 0a 2a  y.opcode is 0,.*
6770: 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20 6e 65 76  * dummy will nev
6780: 65 72 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  er be written to
6790: 2e 20 20 54 68 69 73 20 69 73 20 76 65 72 69 66  .  This is verif
67a0: 69 65 64 20 62 79 20 63 6f 64 65 20 69 6e 73 70  ied by code insp
67b0: 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a 20 62 79  ection and.** by
67c0: 20 72 75 6e 6e 69 6e 67 20 77 69 74 68 20 56 61   running with Va
67d0: 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64 62 65 4f  lgrind..*/.VdbeO
67e0: 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65  p *sqlite3VdbeGe
67f0: 74 4f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  tOp(Vdbe *p, int
6800: 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20 43 38 39   addr){.  /* C89
6810: 20 73 70 65 63 69 66 69 65 73 20 74 68 61 74 20   specifies that 
6820: 74 68 65 20 63 6f 6e 73 74 61 6e 74 20 22 64 75  the constant "du
6830: 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20 69 6e 69  mmy" will be ini
6840: 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 0a  tialized to all.
6850: 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77 68 69 63    ** zeros, whic
6860: 68 20 69 73 20 63 6f 72 72 65 63 74 2e 20 20 4d  h is correct.  M
6870: 53 56 43 20 67 65 6e 65 72 61 74 65 73 20 61 20  SVC generates a 
6880: 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65 72 74 68  warning, neverth
6890: 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73 74 61 74  eless. */.  stat
68a0: 69 63 20 56 64 62 65 4f 70 20 64 75 6d 6d 79 3b  ic VdbeOp dummy;
68b0: 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20    /* Ignore the 
68c0: 4d 53 56 43 20 77 61 72 6e 69 6e 67 20 61 62 6f  MSVC warning abo
68d0: 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ut no initialize
68e0: 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  r */.  assert( p
68f0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
6900: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
6910: 28 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20  ( addr<0 ){.    
6920: 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20  addr = p->nOp - 
6930: 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  1;.  }.  assert(
6940: 20 28 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64   (addr>=0 && add
6950: 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20 70 2d 3e  r<p->nOp) || p->
6960: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
6970: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d   );.  if( p->db-
6980: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
6990: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 56 64 62  .    return (Vdb
69a0: 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a 20 20 7d  eOp*)&dummy;.  }
69b0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
69c0: 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a   &p->aOp[addr];.
69d0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e    }.}..#if defin
69e0: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
69f0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
6a00: 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  S)./*.** Return 
6a10: 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
6a20: 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
6a30: 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 74 68  parameters to th
6a40: 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a 2a 2a 20  e opcode pOp.** 
6a50: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 63 68  determined by ch
6a60: 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f 0a 73 74  aracter c..*/.st
6a70: 61 74 69 63 20 69 6e 74 20 74 72 61 6e 73 6c 61  atic int transla
6a80: 74 65 50 28 63 68 61 72 20 63 2c 20 63 6f 6e 73  teP(char c, cons
6a90: 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 69 66  t Op *pOp){.  if
6aa0: 28 20 63 3d 3d 27 31 27 20 29 20 72 65 74 75 72  ( c=='1' ) retur
6ab0: 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20 69 66 28  n pOp->p1;.  if(
6ac0: 20 63 3d 3d 27 32 27 20 29 20 72 65 74 75 72 6e   c=='2' ) return
6ad0: 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69 66 28 20   pOp->p2;.  if( 
6ae0: 63 3d 3d 27 33 27 20 29 20 72 65 74 75 72 6e 20  c=='3' ) return 
6af0: 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66 28 20 63  pOp->p3;.  if( c
6b00: 3d 3d 27 34 27 20 29 20 72 65 74 75 72 6e 20 70  =='4' ) return p
6b10: 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72 65 74 75  Op->p4.i;.  retu
6b20: 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f  rn pOp->p5;.}../
6b30: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
6b40: 74 72 69 6e 67 20 66 6f 72 20 74 68 65 20 22 63  tring for the "c
6b50: 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64 20 6f 66  omment" field of
6b60: 20 61 20 56 44 42 45 20 6f 70 63 6f 64 65 20 6c   a VDBE opcode l
6b70: 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68  isting..**.** Th
6b80: 65 20 53 79 6e 6f 70 73 69 73 3a 20 66 69 65 6c  e Synopsis: fiel
6b90: 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73 20 69 6e  d in comments in
6ba0: 20 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72   the vdbe.c sour
6bb0: 63 65 20 66 69 6c 65 20 67 65 74 73 20 63 6f 6e  ce file gets con
6bc0: 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20 61 6e 20  verted.** to an 
6bd0: 65 78 74 72 61 20 73 74 72 69 6e 67 20 74 68 61  extra string tha
6be0: 74 20 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f  t is appended to
6bf0: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f   the sqlite3Opco
6c00: 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e 20 74 68  deName().  In th
6c10: 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20 6f 66 20  e.** absence of 
6c20: 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74 73 2c 20  other comments, 
6c30: 74 68 69 73 20 73 79 6e 6f 70 73 69 73 20 62 65  this synopsis be
6c40: 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d 6d 65 6e  comes the commen
6c50: 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f 64 65 2e  t on the opcode.
6c60: 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e 73 6c 61  .** Some transla
6c70: 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a 2a 2a 0a  tion occurs:.**.
6c80: 2a 2a 20 20 20 20 20 20 20 22 50 58 22 20 20 20  **       "PX"   
6c90: 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22 0a 2a 2a     ->  "r[X]".**
6ca0: 20 20 20 20 20 20 20 22 50 58 40 50 59 22 20 20         "PX@PY"  
6cb0: 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 2d 31   ->  "r[X..X+Y-1
6cc0: 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66  ]"  or "r[x]" if
6cd0: 20 79 20 69 73 20 30 20 6f 72 20 31 0a 2a 2a 20   y is 0 or 1.** 
6ce0: 20 20 20 20 20 20 22 50 58 40 50 59 2b 31 22 20        "PX@PY+1" 
6cf0: 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59 5d 22 20  ->  "r[X..X+Y]" 
6d00: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6d10: 79 20 69 73 20 30 0a 2a 2a 20 20 20 20 20 20 20  y is 0.**       
6d20: 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20 20 22 72  "PY..PY"  ->  "r
6d30: 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20 6f 72 20  [X..Y]"      or 
6d40: 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d 78 0a 2a  "r[x]" if y<=x.*
6d50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
6d60: 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a 20 20 63  playComment(.  c
6d70: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c 20 20 20  onst Op *pOp,   
6d80: 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20    /* The opcode 
6d90: 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74 65 64 20  to be commented 
6da0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
6db0: 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72 65 76 69  *zP4,   /* Previ
6dc0: 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65 64 20 76  ously obtained v
6dd0: 61 6c 75 65 20 66 6f 72 20 50 34 20 2a 2f 0a 20  alue for P4 */. 
6de0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 20 20   char *zTemp,   
6df0: 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
6e00: 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  ult here */.  in
6e10: 74 20 6e 54 65 6d 70 20 20 20 20 20 20 20 20 20  t nTemp         
6e20: 20 2f 2a 20 53 70 61 63 65 20 61 76 61 69 6c 61   /* Space availa
6e30: 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b 5d 20 2a  ble in zTemp[] *
6e40: 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
6e50: 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 63 6f  r *zOpName;.  co
6e60: 6e 73 74 20 63 68 61 72 20 2a 7a 53 79 6e 6f 70  nst char *zSynop
6e70: 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f 70 4e 61  sis;.  int nOpNa
6e80: 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c 20 6a 6a  me;.  int ii, jj
6e90: 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  zOpName = sq
6ea0: 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28  lite3OpcodeName(
6eb0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 0a 20 20  pOp->opcode);.  
6ec0: 6e 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  nOpName = sqlite
6ed0: 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d  3Strlen30(zOpNam
6ee0: 65 29 3b 0a 20 20 69 66 28 20 7a 4f 70 4e 61 6d  e);.  if( zOpNam
6ef0: 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a  e[nOpName+1] ){.
6f00: 20 20 20 20 69 6e 74 20 73 65 65 6e 43 6f 6d 20      int seenCom 
6f10: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 63 3b  = 0;.    char c;
6f20: 0a 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20 3d  .    zSynopsis =
6f30: 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e   zOpName += nOpN
6f40: 61 6d 65 20 2b 20 31 3b 0a 20 20 20 20 66 6f 72  ame + 1;.    for
6f50: 28 69 69 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65  (ii=jj=0; jj<nTe
6f60: 6d 70 2d 31 20 26 26 20 28 63 20 3d 20 7a 53 79  mp-1 && (c = zSy
6f70: 6e 6f 70 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20  nopsis[ii])!=0; 
6f80: 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  ii++){.      if(
6f90: 20 63 3d 3d 27 50 27 20 29 7b 0a 20 20 20 20 20   c=='P' ){.     
6fa0: 20 20 20 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73     c = zSynopsis
6fb0: 5b 2b 2b 69 69 5d 3b 0a 20 20 20 20 20 20 20 20  [++ii];.        
6fc0: 69 66 28 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20  if( c=='4' ){.  
6fd0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
6fe0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
6ff0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73  j, zTemp+jj, "%s
7000: 22 2c 20 7a 50 34 29 3b 0a 20 20 20 20 20 20 20  ", zP4);.       
7010: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 58   }else if( c=='X
7020: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ' ){.          s
7030: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7040: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
7050: 6a 6a 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a  jj, "%s", pOp->z
7060: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
7070: 20 20 20 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b      seenCom = 1;
7080: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7090: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 76 31            int v1
70a0: 20 3d 20 74 72 61 6e 73 6c 61 74 65 50 28 63 2c   = translateP(c,
70b0: 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20 20   pOp);.         
70c0: 20 69 6e 74 20 76 32 3b 0a 20 20 20 20 20 20 20   int v2;.       
70d0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
70e0: 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54  ntf(nTemp-jj, zT
70f0: 65 6d 70 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31  emp+jj, "%d", v1
7100: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7110: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7120: 69 73 2b 69 69 2b 31 2c 20 22 40 50 22 2c 20 32  is+ii+1, "@P", 2
7130: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
7140: 20 20 20 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20      ii += 3;.   
7150: 20 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73           jj += s
7160: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7170: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20  Temp+jj);.      
7180: 20 20 20 20 20 20 76 32 20 3d 20 74 72 61 6e 73        v2 = trans
7190: 6c 61 74 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b  lateP(zSynopsis[
71a0: 69 69 5d 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20  ii], pOp);.     
71b0: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63         if( strnc
71c0: 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b  mp(zSynopsis+ii+
71d0: 31 2c 22 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a  1,"+1",2)==0 ){.
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 69                ii
71f0: 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20   += 2;.         
7200: 20 20 20 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20       v2++;.     
7210: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7220: 20 20 20 20 20 69 66 28 20 76 32 3e 31 20 29 7b       if( v2>1 ){
7230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
7240: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7250: 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b  nTemp-jj, zTemp+
7260: 6a 6a 2c 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76  jj, "..%d", v1+v
7270: 32 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  2-1);.          
7280: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
7290: 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
72a0: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20  zSynopsis+ii+1, 
72b0: 22 2e 2e 50 33 22 2c 20 34 29 3d 3d 30 20 26 26  "..P3", 4)==0 &&
72c0: 20 70 4f 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20   pOp->p3==0 ){. 
72d0: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
72e0: 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   4;.          }.
72f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7300: 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53    jj += sqlite3S
7310: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a  trlen30(zTemp+jj
7320: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
7330: 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a          zTemp[jj
7340: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d  ++] = c;.      }
7350: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 21  .    }.    if( !
7360: 73 65 65 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54  seenCom && jj<nT
7370: 65 6d 70 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43  emp-5 && pOp->zC
7380: 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  omment ){.      
7390: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
73a0: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
73b0: 2b 6a 6a 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70  +jj, "; %s", pOp
73c0: 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20  ->zComment);.   
73d0: 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33     jj += sqlite3
73e0: 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a  Strlen30(zTemp+j
73f0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  j);.    }.    if
7400: 28 20 6a 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65  ( jj<nTemp ) zTe
7410: 6d 70 5b 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65  mp[jj] = 0;.  }e
7420: 6c 73 65 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f  lse if( pOp->zCo
7430: 6d 6d 65 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c  mment ){.    sql
7440: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7450: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22  emp, zTemp, "%s"
7460: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
7470: 3b 0a 20 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74  ;.    jj = sqlit
7480: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7490: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
74a0: 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20  zTemp[0] = 0;.  
74b0: 20 20 6a 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    jj = 0;.  }.  
74c0: 72 65 74 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e  return jj;.}.#en
74d0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45  dif /* SQLITE_DE
74e0: 42 55 47 20 2a 2f 0a 0a 0a 23 69 66 20 21 64 65  BUG */...#if !de
74f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7500: 54 5f 45 58 50 4c 41 49 4e 29 20 7c 7c 20 21 64  T_EXPLAIN) || !d
7510: 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 5c  efined(NDEBUG) \
7520: 0a 20 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64  .     || defined
7530: 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29 20 7c  (VDBE_PROFILE) |
7540: 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
7550: 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a 2a 20 43 6f  _DEBUG)./*.** Co
7560: 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67 20 74  mpute a string t
7570: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
7580: 65 20 50 34 20 70 61 72 61 6d 65 74 65 72 20 66  e P4 parameter f
7590: 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e 0a 2a 2a  or an opcode..**
75a0: 20 55 73 65 20 7a 54 65 6d 70 20 66 6f 72 20 61   Use zTemp for a
75b0: 6e 79 20 72 65 71 75 69 72 65 64 20 74 65 6d 70  ny required temp
75c0: 6f 72 61 72 79 20 62 75 66 66 65 72 20 73 70 61  orary buffer spa
75d0: 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ce..*/.static ch
75e0: 61 72 20 2a 64 69 73 70 6c 61 79 50 34 28 4f 70  ar *displayP4(Op
75f0: 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a 7a 54 65   *pOp, char *zTe
7600: 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70 29 7b 0a  mp, int nTemp){.
7610: 20 20 63 68 61 72 20 2a 7a 50 34 20 3d 20 7a 54    char *zP4 = zT
7620: 65 6d 70 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  emp;.  assert( n
7630: 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73 77  Temp>=20 );.  sw
7640: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
7650: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
7660: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
7670: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20    int i, j;.    
7680: 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
7690: 6e 66 6f 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b  nfo = pOp->p4.pK
76a0: 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73  eyInfo;.      as
76b0: 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
76c0: 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
76d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
76e0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
76f0: 54 65 6d 70 2c 20 22 6b 28 25 64 22 2c 20 70 4b  Temp, "k(%d", pK
7700: 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29 3b  eyInfo->nField);
7710: 0a 20 20 20 20 20 20 69 20 3d 20 73 71 6c 69 74  .      i = sqlit
7720: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70  e3Strlen30(zTemp
7730: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  );.      for(j=0
7740: 3b 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  ; j<pKeyInfo->nF
7750: 69 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  ield; j++){.    
7760: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f      CollSeq *pCo
7770: 6c 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  ll = pKeyInfo->a
7780: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
7790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
77a0: 6c 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f  ll = pColl ? pCo
77b0: 6c 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 6e 69 6c  ll->zName : "nil
77c0: 22 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ";.        int n
77d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
77e0: 33 30 28 7a 43 6f 6c 6c 29 3b 0a 20 20 20 20 20  30(zColl);.     
77f0: 20 20 20 69 66 28 20 6e 3d 3d 36 20 26 26 20 6d     if( n==6 && m
7800: 65 6d 63 6d 70 28 7a 43 6f 6c 6c 2c 22 42 49 4e  emcmp(zColl,"BIN
7810: 41 52 59 22 2c 36 29 3d 3d 30 20 29 7b 0a 20 20  ARY",6)==0 ){.  
7820: 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 20 3d 20          zColl = 
7830: 22 42 22 3b 0a 20 20 20 20 20 20 20 20 20 20 6e  "B";.          n
7840: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
7850: 20 20 20 20 20 20 20 20 69 66 28 20 69 2b 6e 3e          if( i+n>
7860: 6e 54 65 6d 70 2d 36 20 29 7b 0a 20 20 20 20 20  nTemp-6 ){.     
7870: 20 20 20 20 20 6d 65 6d 63 70 79 28 26 7a 54 65       memcpy(&zTe
7880: 6d 70 5b 69 5d 2c 22 2c 2e 2e 2e 22 2c 34 29 3b  mp[i],",...",4);
7890: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
78a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
78b0: 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b 5d 20 3d      zTemp[i++] =
78c0: 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69 66   ',';.        if
78d0: 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
78e0: 74 4f 72 64 65 72 5b 6a 5d 20 29 7b 0a 20 20 20  tOrder[j] ){.   
78f0: 20 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b 2b         zTemp[i++
7900: 5d 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20  ] = '-';.       
7910: 20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70   }.        memcp
7920: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 20 7a 43 6f  y(&zTemp[i], zCo
7930: 6c 6c 2c 20 6e 2b 31 29 3b 0a 20 20 20 20 20 20  ll, n+1);.      
7940: 20 20 69 20 2b 3d 20 6e 3b 0a 20 20 20 20 20 20    i += n;.      
7950: 7d 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 2b  }.      zTemp[i+
7960: 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 20 20  +] = ')';.      
7970: 7a 54 65 6d 70 5b 69 5d 20 3d 20 30 3b 0a 20 20  zTemp[i] = 0;.  
7980: 20 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 54      assert( i<nT
7990: 65 6d 70 20 29 3b 0a 20 20 20 20 20 20 62 72 65  emp );.      bre
79a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
79b0: 73 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b  se P4_COLLSEQ: {
79c0: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
79d0: 70 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e  pColl = pOp->p4.
79e0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  pColl;.      sql
79f0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7a00: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 28 25 2e  emp, zTemp, "(%.
7a10: 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e  20s)", pColl->zN
7a20: 61 6d 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ame);.      brea
7a30: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7a40: 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20 7b 0a  e P4_FUNCDEF: {.
7a50: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
7a60: 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 46  Def = pOp->p4.pF
7a70: 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  unc;.      sqlit
7a80: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d  e3_snprintf(nTem
7a90: 70 2c 20 7a 54 65 6d 70 2c 20 22 25 73 28 25 64  p, zTemp, "%s(%d
7aa0: 29 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c  )", pDef->zName,
7ab0: 20 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20   pDef->nArg);.  
7ac0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7ad0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
7ae0: 36 34 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  64: {.      sqli
7af0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
7b00: 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64  mp, zTemp, "%lld
7b10: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
7b20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
7b30: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
7b40: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
7b50: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7b60: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7b70: 22 25 64 22 2c 20 70 4f 70 2d 3e 70 34 2e 69 29  "%d", pOp->p4.i)
7b80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7b90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
7ba0: 5f 52 45 41 4c 3a 20 7b 0a 20 20 20 20 20 20 73  _REAL: {.      s
7bb0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7bc0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7bd0: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
7be0: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
7bf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7c00: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
7c10: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
7c20: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
7c30: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
7c40: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
7c50: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
7c60: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }e
7c70: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
7c80: 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b  ags & MEM_Int ){
7c90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
7ca0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7cb0: 20 7a 54 65 6d 70 2c 20 22 25 6c 6c 64 22 2c 20   zTemp, "%lld", 
7cc0: 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a 20 20 20 20  pMem->u.i);.    
7cd0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d    }else if( pMem
7ce0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65  ->flags & MEM_Re
7cf0: 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  al ){.        sq
7d00: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7d10: 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25 2e  Temp, zTemp, "%.
7d20: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
7d30: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7d40: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
7d50: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
7d60: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d70: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d80: 70 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  p, "NULL");.    
7d90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
7da0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66   assert( pMem->f
7db0: 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20  lags & MEM_Blob 
7dc0: 29 3b 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d  );.        zP4 =
7dd0: 20 22 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20   "(blob)";.     
7de0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7df0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
7e00: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
7e10: 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20  LTABLE.    case 
7e20: 50 34 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20  P4_VTAB: {.     
7e30: 20 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70   sqlite3_vtab *p
7e40: 56 74 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Vtab = pOp->p4.p
7e50: 56 74 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20  Vtab->pVtab;.   
7e60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7e70: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7e80: 2c 20 22 76 74 61 62 3a 25 70 3a 25 70 22 2c 20  , "vtab:%p:%p", 
7e90: 70 56 74 61 62 2c 20 70 56 74 61 62 2d 3e 70 4d  pVtab, pVtab->pM
7ea0: 6f 64 75 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  odule);.      br
7eb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
7ec0: 66 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e  f.    case P4_IN
7ed0: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
7ee0: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
7ef0: 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22  (nTemp, zTemp, "
7f00: 69 6e 74 61 72 72 61 79 22 29 3b 0a 20 20 20 20  intarray");.    
7f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7f20: 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50 52     case P4_SUBPR
7f30: 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20 73  OGRAM: {.      s
7f40: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7f50: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 70  nTemp, zTemp, "p
7f60: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
7f70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7f80: 20 63 61 73 65 20 50 34 5f 41 44 56 41 4e 43 45   case P4_ADVANCE
7f90: 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b  : {.      zTemp[
7fa0: 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72  0] = 0;.      br
7fb0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
7fc0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
7fd0: 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b  zP4 = pOp->p4.z;
7fe0: 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34 3d 3d  .      if( zP4==
7ff0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34  0 ){.        zP4
8000: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 20 20   = zTemp;.      
8010: 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a    zTemp[0] = 0;.
8020: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8030: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21  }.  assert( zP4!
8040: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  =0 );.  return z
8050: 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  P4;.}.#endif../*
8060: 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 6f 20 74  .** Declare to t
8070: 68 65 20 56 64 62 65 20 74 68 61 74 20 74 68 65  he Vdbe that the
8080: 20 42 54 72 65 65 20 6f 62 6a 65 63 74 20 61 74   BTree object at
8090: 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75   db->aDb[i] is u
80a0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  sed..**.** The p
80b0: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
80c0: 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  ts need to know 
80d0: 69 6e 20 61 64 76 61 6e 63 65 20 74 68 65 20 63  in advance the c
80e0: 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a  omplete set of.*
80f0: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
8100: 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20 62  ases that will b
8110: 65 20 75 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f  e use.  A mask o
8120: 66 20 74 68 65 73 65 20 64 61 74 61 62 61 73 65  f these database
8130: 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e  s.** is maintain
8140: 65 64 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61  ed in p->btreeMa
8150: 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b  sk.  The p->lock
8160: 4d 61 73 6b 20 76 61 6c 75 65 20 69 73 20 74 68  Mask value is th
8170: 65 20 73 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70  e subset of.** p
8180: 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f 66 20 64  ->btreeMask of d
8190: 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69  atabases that wi
81a0: 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6c 6f 63  ll require a loc
81b0: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
81c0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
81d0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b  Vdbe *p, int i){
81e0: 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20  .  assert( i>=0 
81f0: 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20  && i<p->db->nDb 
8200: 26 26 20 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66  && i<(int)sizeof
8210: 28 79 44 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  (yDbMask)*8 );. 
8220: 20 61 73 73 65 72 74 28 20 69 3c 28 69 6e 74 29   assert( i<(int)
8230: 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d  sizeof(p->btreeM
8240: 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61  ask)*8 );.  DbMa
8250: 73 6b 53 65 74 28 70 2d 3e 62 74 72 65 65 4d 61  skSet(p->btreeMa
8260: 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28 20 69 21  sk, i);.  if( i!
8270: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 42 74 72  =1 && sqlite3Btr
8280: 65 65 53 68 61 72 61 62 6c 65 28 70 2d 3e 64 62  eeSharable(p->db
8290: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b  ->aDb[i].pBt) ){
82a0: 0a 20 20 20 20 44 62 4d 61 73 6b 53 65 74 28 70  .    DbMaskSet(p
82b0: 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a  ->lockMask, i);.
82c0: 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69    }.}..#if !defi
82d0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
82e0: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26  SHARED_CACHE) &&
82f0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
8300: 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  FE>0./*.** If SQ
8310: 4c 69 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64  Lite is compiled
8320: 20 74 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72   to support shar
8330: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e  ed-cache mode an
8340: 64 20 74 6f 20 62 65 20 74 68 72 65 61 64 73 61  d to be threadsa
8350: 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  fe,.** this rout
8360: 69 6e 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20  ine obtains the 
8370: 6d 75 74 65 78 20 61 73 73 6f 63 69 61 74 65 64  mutex associated
8380: 20 77 69 74 68 20 65 61 63 68 20 42 74 53 68 61   with each BtSha
8390: 72 65 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  red structure.**
83a0: 20 74 68 61 74 20 6d 61 79 20 62 65 20 61 63 63   that may be acc
83b0: 65 73 73 65 64 20 62 79 20 74 68 65 20 56 4d 20  essed by the VM 
83c0: 70 61 73 73 65 64 20 61 73 20 61 6e 20 61 72 67  passed as an arg
83d0: 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20  ument. In doing 
83e0: 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65  so it also.** se
83f0: 74 73 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  ts the BtShared.
8400: 64 62 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63  db member of eac
8410: 68 20 6f 66 20 74 68 65 20 42 74 53 68 61 72 65  h of the BtShare
8420: 64 20 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e  d structures, en
8430: 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74  suring.** that t
8440: 68 65 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d  he correct busy-
8450: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
8460: 20 69 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72   is invoked if r
8470: 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  equired..**.** I
8480: 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20  f SQLite is not 
8490: 74 68 72 65 61 64 73 61 66 65 20 62 75 74 20 64  threadsafe but d
84a0: 6f 65 73 20 73 75 70 70 6f 72 74 20 73 68 61 72  oes support shar
84b0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
84c0: 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  hen.** sqlite3Bt
84d0: 72 65 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e  reeEnter() is in
84e0: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65  voked to set the
84f0: 20 42 74 53 68 61 72 65 64 2e 64 62 20 76 61 72   BtShared.db var
8500: 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c  iables.** of all
8510: 20 6f 66 20 42 74 53 68 61 72 65 64 20 73 74 72   of BtShared str
8520: 75 63 74 75 72 65 73 20 61 63 63 65 73 73 69 62  uctures accessib
8530: 6c 65 20 76 69 61 20 74 68 65 20 64 61 74 61 62  le via the datab
8540: 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61  ase handle .** a
8550: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
8560: 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  he VM..**.** If 
8570: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
8580: 72 65 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65  readsafe and doe
8590: 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68  s not support sh
85a0: 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c  ared-cache mode,
85b0: 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
85c0: 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  n is a no-op..**
85d0: 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65  .** The p->btree
85e0: 4d 61 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20  Mask field is a 
85f0: 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62  bitmask of all b
8600: 74 72 65 65 73 20 74 68 61 74 20 74 68 65 20 70  trees that the p
8610: 72 65 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74  repared .** stat
8620: 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65  ement p will eve
8630: 72 20 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65  r use.  Let N be
8640: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
8650: 69 74 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d  its in p->btreeM
8660: 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  ask.** correspon
8670: 64 69 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74  ding to btrees t
8680: 68 61 74 20 75 73 65 20 73 68 61 72 65 64 20 63  hat use shared c
8690: 61 63 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20  ache.  Then the 
86a0: 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68  runtime of.** th
86b0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a  is routine is N*
86c0: 4e 2e 20 20 42 75 74 20 61 73 20 4e 20 69 73 20  N.  But as N is 
86d0: 72 61 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e  rarely more than
86e0: 20 31 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20   1, this should 
86f0: 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62  not.** be a prob
8700: 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lem..*/.void sql
8710: 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 56 64  ite3VdbeEnter(Vd
8720: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
8730: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
8740: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
8750: 20 6e 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61   nDb;.  if( DbMa
8760: 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63  skAllZero(p->loc
8770: 6b 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b  kMask) ) return;
8780: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20    /* The common 
8790: 63 61 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70  case */.  db = p
87a0: 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62  ->db;.  aDb = db
87b0: 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64  ->aDb;.  nDb = d
87c0: 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d  b->nDb;.  for(i=
87d0: 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a  0; i<nDb; i++){.
87e0: 20 20 20 20 69 66 28 20 69 21 3d 31 20 26 26 20      if( i!=1 && 
87f0: 44 62 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f  DbMaskTest(p->lo
8800: 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57  ckMask,i) && ALW
8810: 41 59 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d  AYS(aDb[i].pBt!=
8820: 30 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  0) ){.      sqli
8830: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 61 44  te3BtreeEnter(aD
8840: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d  b[i].pBt);.    }
8850: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  .  }.}.#endif..#
8860: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
8870: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
8880: 41 43 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f  ACHE) && SQLITE_
8890: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a  THREADSAFE>0./*.
88a0: 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66  ** Unlock all of
88b0: 20 74 68 65 20 62 74 72 65 65 73 20 70 72 65 76   the btrees prev
88c0: 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79  iously locked by
88d0: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
88e0: 65 33 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a  e3VdbeEnter()..*
88f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
8900: 62 65 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29  beLeave(Vdbe *p)
8910: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
8920: 69 74 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a  ite3 *db;.  Db *
8930: 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a  aDb;.  int nDb;.
8940: 20 20 69 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a    if( DbMaskAllZ
8950: 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29  ero(p->lockMask)
8960: 20 29 20 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54   ) return;  /* T
8970: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a  he common case *
8980: 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  /.  db = p->db;.
8990: 20 20 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 3b    aDb = db->aDb;
89a0: 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e 6e 44 62  .  nDb = db->nDb
89b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
89c0: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
89d0: 28 20 69 21 3d 31 20 26 26 20 44 62 4d 61 73 6b  ( i!=1 && DbMask
89e0: 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b  Test(p->lockMask
89f0: 2c 69 29 20 26 26 20 41 4c 57 41 59 53 28 61 44  ,i) && ALWAYS(aD
8a00: 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20 29 7b 0a  b[i].pBt!=0) ){.
8a10: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
8a20: 65 65 4c 65 61 76 65 28 61 44 62 5b 69 5d 2e 70  eeLeave(aDb[i].p
8a30: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  Bt);.    }.  }.}
8a40: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
8a50: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
8a60: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
8a70: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
8a80: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
8a90: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
8aa0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
8ab0: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
8ac0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
8ad0: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
8ae0: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
8af0: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
8b00: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
8b10: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72  zPtr[50];.  char
8b20: 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74   zCom[100];.  st
8b30: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8b40: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
8b50: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
8b60: 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73  4d %-13s %.2X %s
8b70: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
8b80: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
8b90: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
8ba0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
8bb0: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
8bc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
8bd0: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
8be0: 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43  MENTS.  displayC
8bf0: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
8c00: 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43   zCom, sizeof(zC
8c10: 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43  om));.#else.  zC
8c20: 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69  om[0] = 0;.#endi
8c30: 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20  f.  /* NB:  The 
8c40: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
8c50: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  e() function is 
8c60: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
8c70: 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a  ode created.  **
8c80: 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   by the mkopcode
8c90: 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f  h.awk and mkopco
8ca0: 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20  dec.awk scripts 
8cb0: 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68  which extract th
8cc0: 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  e.  ** informati
8cd0: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65  on from the vdbe
8ce0: 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a  .c source text *
8cf0: 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  /.  fprintf(pOut
8d00: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
8d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
8d20: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
8d30: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
8d40: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
8d50: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
8d60: 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a        zCom.  );.
8d70: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
8d80: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8d90: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
8da0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
8db0: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
8dc0: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
8dd0: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
8de0: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
8df0: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
8e00: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
8e10: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
8e20: 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c 6f 63 5f  ;.    u8 malloc_
8e30: 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e 6d 61 6c  failed = db->mal
8e40: 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20 20 69  locFailed;.    i
8e50: 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72  f( db->pnBytesFr
8e60: 65 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b  eed ){.      do{
8e70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
8e80: 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74  szMalloc ) sqlit
8e90: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
8ea0: 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20  zMalloc);.      
8eb0: 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45  }while( (++p)<pE
8ec0: 6e 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nd );.      retu
8ed0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f  rn;.    }.    do
8ee0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
8ef0: 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c  (&p[1])==pEnd ||
8f00: 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64   p[0].db==p[1].d
8f10: 62 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  b );.      asser
8f20: 74 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  t( sqlite3VdbeCh
8f30: 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73  eckMemInvariants
8f40: 28 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  (p) );..      /*
8f50: 20 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72   This block is r
8f60: 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64  eally an inlined
8f70: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69   version of sqli
8f80: 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73  te3VdbeMemReleas
8f90: 65 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  e().      ** tha
8fa0: 74 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67  t takes advantag
8fb0: 65 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68  e of the fact th
8fc0: 61 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  at the memory ce
8fd0: 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20  ll value is .   
8fe0: 20 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20     ** being set 
8ff0: 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65  to NULL after re
9000: 6c 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61  leasing any dyna
9010: 6d 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20  mic resources.. 
9020: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9030: 20 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69   The justificati
9040: 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69  on for duplicati
9050: 6e 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20  ng code is that 
9060: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20  according to .  
9070: 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64      ** callgrind
9080: 2c 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20  , this causes a 
9090: 63 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73  certain test cas
90a0: 65 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55  e to hit the CPU
90b0: 20 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70   4.7 .      ** p
90c0: 65 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36  ercent less (x86
90d0: 20 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73   linux, gcc vers
90e0: 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20  ion 4.1.2, -O6) 
90f0: 74 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a  than if .      *
9100: 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65  * sqlite3MemRele
9110: 61 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65  ase() were calle
9120: 64 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74  d from here. Wit
9130: 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70  h -O2, this jump
9140: 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e  s.      ** to 6.
9150: 36 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74  6 percent. The t
9160: 65 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65  est case is inse
9170: 72 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20  rting 1000 rows 
9180: 69 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20  into a table .  
9190: 20 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69      ** with no i
91a0: 6e 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73  ndexes using a s
91b0: 69 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49  ingle prepared I
91c0: 4e 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c  NSERT statement,
91d0: 20 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a   bind() .      *
91e0: 2a 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49  * and reset(). I
91f0: 6e 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70  nserts are group
9200: 65 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61  ed into a transa
9210: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ction..      */.
9220: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
9230: 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41  p->flags & MEM_A
9240: 67 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  gg );.      test
9250: 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26  case( p->flags &
9260: 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20   MEM_Dyn );.    
9270: 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66    testcase( p->f
9280: 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65  lags & MEM_Frame
9290: 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
92a0: 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d  se( p->flags & M
92b0: 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20  EM_RowSet );.   
92c0: 20 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26     if( p->flags&
92d0: 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e  (MEM_Agg|MEM_Dyn
92e0: 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52  |MEM_Frame|MEM_R
92f0: 6f 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20  owSet) ){.      
9300: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
9310: 52 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20  Release(p);.    
9320: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73    }else if( p->s
9330: 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  zMalloc ){.     
9340: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
9350: 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29  (db, p->zMalloc)
9360: 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d  ;.        p->szM
9370: 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20  alloc = 0;.     
9380: 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61   }..      p->fla
9390: 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e  gs = MEM_Undefin
93a0: 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  ed;.    }while( 
93b0: 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20  (++p)<pEnd );.  
93c0: 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c    db->mallocFail
93d0: 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ed = malloc_fail
93e0: 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed;.  }.}../*.**
93f0: 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46 72   Delete a VdbeFr
9400: 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20 69  ame object and i
9410: 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64 62  ts contents. Vdb
9420: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20 61  eFrame objects a
9430: 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
9440: 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72 61  by the OP_Progra
9450: 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c 69  m opcode in sqli
9460: 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a 2a  te3VdbeExec()..*
9470: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
9480: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56 64  beFrameDelete(Vd
9490: 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20 69  beFrame *p){.  i
94a0: 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d 65  nt i;.  Mem *aMe
94b0: 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65 6d  m = VdbeFrameMem
94c0: 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73 6f  (p);.  VdbeCurso
94d0: 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64 62  r **apCsr = (Vdb
94e0: 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65 6d  eCursor **)&aMem
94f0: 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b 0a  [p->nChildMem];.
9500: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
9510: 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29 7b  nChildCsr; i++){
9520: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9530: 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76 2c  FreeCursor(p->v,
9540: 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d 0a   apCsr[i]);.  }.
9550: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
9560: 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69 6c  y(aMem, p->nChil
9570: 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33  dMem);.  sqlite3
9580: 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e 64 62 2c  DbFree(p->v->db,
9590: 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   p);.}..#ifndef 
95a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c  SQLITE_OMIT_EXPL
95b0: 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76 65 20 61  AIN./*.** Give a
95c0: 20 6c 69 73 74 69 6e 67 20 6f 66 20 74 68 65 20   listing of the 
95d0: 70 72 6f 67 72 61 6d 20 69 6e 20 74 68 65 20 76  program in the v
95e0: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
95f0: 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74 65 72 66  **.** The interf
9600: 61 63 65 20 69 73 20 74 68 65 20 73 61 6d 65 20  ace is the same 
9610: 61 73 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  as sqlite3VdbeEx
9620: 65 63 28 29 2e 20 20 42 75 74 20 69 6e 73 74 65  ec().  But inste
9630: 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ad of.** running
9640: 20 74 68 65 20 63 6f 64 65 2c 20 69 74 20 69 6e   the code, it in
9650: 76 6f 6b 65 73 20 74 68 65 20 63 61 6c 6c 62 61  vokes the callba
9660: 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ck once for each
9670: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a   instruction..**
9680: 20 54 68 69 73 20 66 65 61 74 75 72 65 20 69 73   This feature is
9690: 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65   used to impleme
96a0: 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a  nt "EXPLAIN"..**
96b0: 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c  .** When p->expl
96c0: 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20 69 6e 73  ain==1, each ins
96d0: 74 72 75 63 74 69 6f 6e 20 69 73 20 6c 69 73 74  truction is list
96e0: 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e  ed.  When.** p->
96f0: 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79  explain==2, only
9700: 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69 6e 73 74   OP_Explain inst
9710: 72 75 63 74 69 6f 6e 73 20 61 72 65 20 6c 69 73  ructions are lis
9720: 74 65 64 20 61 6e 64 20 74 68 65 73 65 0a 2a 2a  ted and these.**
9730: 20 61 72 65 20 73 68 6f 77 6e 20 69 6e 20 61 20   are shown in a 
9740: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 6d 61 74  different format
9750: 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32  .  p->explain==2
9760: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
9770: 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c 41 49 4e  ement.** EXPLAIN
9780: 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a   QUERY PLAN..**.
9790: 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61  ** When p->expla
97a0: 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20 74 68 65  in==1, first the
97b0: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 69 73   main program is
97c0: 20 6c 69 73 74 65 64 2c 20 74 68 65 6e 20 65 61   listed, then ea
97d0: 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20 74 72 69  ch of.** the tri
97e0: 67 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73  gger subprograms
97f0: 20 61 72 65 20 6c 69 73 74 65 64 20 6f 6e 65 20   are listed one 
9800: 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73  by one..*/.int s
9810: 71 6c 69 74 65 33 56 64 62 65 4c 69 73 74 28 0a  qlite3VdbeList(.
9820: 20 20 56 64 62 65 20 2a 70 20 20 20 20 20 20 20    Vdbe *p       
9830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9840: 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b 0a 20 20  he VDBE */.){.  
9850: 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20 20 20 20  int nRow;       
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9870: 20 20 20 20 20 2f 2a 20 53 74 6f 70 20 77 68 65       /* Stop whe
9880: 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72 65 61 63  n row count reac
9890: 68 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 69 6e  hes this */.  in
98a0: 74 20 6e 53 75 62 20 3d 20 30 3b 20 20 20 20 20  t nSub = 0;     
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
98d0: 73 75 62 2d 76 64 62 65 73 20 73 65 65 6e 20 73  sub-vdbes seen s
98e0: 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75 62 50 72  o far */.  SubPr
98f0: 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62 20 3d 20  ogram **apSub = 
9900: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
9910: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62 2d  /* Array of sub-
9920: 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a  vdbes */.  Mem *
9930: 70 53 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20  pSub = 0;       
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 68  /* Memory cell h
9960: 6f 6c 64 20 61 72 72 61 79 20 6f 66 20 73 75 62  old array of sub
9970: 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  progs */.  sqlit
9980: 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 20  e3 *db = p->db; 
9990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99a0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
99b0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
99c0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
99f0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  nter */.  int rc
9a00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
9a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9a20: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
9a30: 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26  .  Mem *pMem = &
9a40: 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20 20 20 20  p->aMem[1];     
9a50: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
9a60: 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c 74 20 73   Mem of result s
9a70: 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  et */..  assert(
9a80: 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29 3b 0a 20   p->explain );. 
9a90: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
9aa0: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55  c==VDBE_MAGIC_RU
9ab0: 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  N );.  assert( p
9ac0: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
9ad0: 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  || p->rc==SQLITE
9ae0: 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d  _BUSY || p->rc==
9af0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a  SQLITE_NOMEM );.
9b00: 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68 6f 75 67  .  /* Even thoug
9b10: 68 20 74 68 69 73 20 6f 70 63 6f 64 65 20 64 6f  h this opcode do
9b20: 65 73 20 6e 6f 74 20 75 73 65 20 64 79 6e 61 6d  es not use dynam
9b30: 69 63 20 73 74 72 69 6e 67 73 20 66 6f 72 0a 20  ic strings for. 
9b40: 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 2c 20   ** the result, 
9b50: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d  result columns m
9b60: 61 79 20 62 65 63 6f 6d 65 20 64 79 6e 61 6d 69  ay become dynami
9b70: 63 20 69 66 20 74 68 65 20 75 73 65 72 20 63 61  c if the user ca
9b80: 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  lls.  ** sqlite3
9b90: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29  _column_text16()
9ba0: 2c 20 63 61 75 73 69 6e 67 20 61 20 74 72 61 6e  , causing a tran
9bb0: 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54 46 2d 31  slation to UTF-1
9bc0: 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f  6 encoding..  */
9bd0: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
9be0: 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a 20 20 70  ay(pMem, 8);.  p
9bf0: 2d 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30  ->pResultSet = 0
9c00: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d  ;..  if( p->rc==
9c10: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
9c20: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70      /* This happ
9c30: 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  ens if a malloc(
9c40: 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c 20  ) inside a call 
9c50: 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  to sqlite3_colum
9c60: 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20 20  n_text() or.    
9c70: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ** sqlite3_colum
9c80: 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c 65  n_text16() faile
9c90: 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d  d.  */.    db->m
9ca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
9cb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9cc0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
9cd0: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
9ce0: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
9cf0: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
9d00: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
9d10: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
9d20: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
9d30: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
9d40: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
9d50: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
9d60: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
9d70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
9d80: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
9d90: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
9da0: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
9db0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
9dc0: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
9dd0: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
9de0: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
9df0: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
9e00: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
9e10: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
9e20: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
9e30: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
9e40: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
9e50: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
9e60: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
9e70: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
9e80: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
9e90: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
9ea0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
9eb0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
9ec0: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
9ed0: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
9ee0: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
9ef0: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
9f00: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
9f10: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
9f20: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
9f30: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
9f40: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
9f50: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
9f60: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
9f70: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
9f80: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
9f90: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
9fa0: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
9fb0: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
9fc0: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
9fd0: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
9fe0: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
9ff0: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
a000: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
a010: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
a020: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
a030: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
a040: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
a050: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
a060: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
a070: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
a080: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
a090: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
a0a0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
a0b0: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
a0c0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
a0d0: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
a0e0: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
a0f0: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
a100: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
a110: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
a120: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
a130: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
a140: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
a150: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
a160: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
a170: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
a180: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
a190: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
a1a0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
a1b0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
a1c0: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
a1d0: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
a1e0: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
a1f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
a200: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
a210: 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20 64 62  (&p->zErrMsg, db
a220: 2c 20 22 25 73 22 2c 20 73 71 6c 69 74 65 33 45  , "%s", sqlite3E
a230: 72 72 53 74 72 28 70 2d 3e 72 63 29 29 3b 0a 20  rrStr(p->rc));. 
a240: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
a250: 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70 20 2a 70   *zP4;.    Op *p
a260: 4f 70 3b 0a 20 20 20 20 69 66 28 20 69 3c 70 2d  Op;.    if( i<p-
a270: 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 2f 2a  >nOp ){.      /*
a280: 20 54 68 65 20 6f 75 74 70 75 74 20 6c 69 6e 65   The output line
a290: 20 6e 75 6d 62 65 72 20 69 73 20 73 6d 61 6c 6c   number is small
a2a0: 20 65 6e 6f 75 67 68 20 74 68 61 74 20 77 65 20   enough that we 
a2b0: 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 74 68 65  are still in the
a2c0: 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69 6e 20 70  .      ** main p
a2d0: 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20 20 20 20  rogram. */.     
a2e0: 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 69   pOp = &p->aOp[i
a2f0: 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
a300: 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 63 75      /* We are cu
a310: 72 72 65 6e 74 6c 79 20 6c 69 73 74 69 6e 67 20  rrently listing 
a320: 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 46 69  subprograms.  Fi
a330: 67 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6f  gure out which o
a340: 6e 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ne and.      ** 
a350: 70 69 63 6b 20 75 70 20 74 68 65 20 61 70 70 72  pick up the appr
a360: 6f 70 72 69 61 74 65 20 6f 70 63 6f 64 65 2e 20  opriate opcode. 
a370: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  */.      int j;.
a380: 20 20 20 20 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f        i -= p->nO
a390: 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  p;.      for(j=0
a3a0: 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e  ; i>=apSub[j]->n
a3b0: 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; j++){.      
a3c0: 20 20 69 20 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d    i -= apSub[j]-
a3d0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  >nOp;.      }.  
a3e0: 20 20 20 20 70 4f 70 20 3d 20 26 61 70 53 75 62      pOp = &apSub
a3f0: 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20  [j]->aOp[i];.   
a400: 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78   }.    if( p->ex
a410: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
a420: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
a430: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 70  MEM_Int;.      p
a440: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b 20 20 20  Mem->u.i = i;   
a450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a460: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a470: 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65 72 20  Program counter 
a480: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  */.      pMem++;
a490: 0a 20 20 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  .  .      pMem->
a4a0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 61 74  flags = MEM_Stat
a4b0: 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54  ic|MEM_Str|MEM_T
a4c0: 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  erm;.      pMem-
a4d0: 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  >z = (char*)sqli
a4e0: 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f  te3OpcodeName(pO
a4f0: 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f 2a 20 4f  p->opcode); /* O
a500: 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 61  pcode */.      a
a510: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d  ssert( pMem->z!=
a520: 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  0 );.      pMem-
a530: 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  >n = sqlite3Strl
a540: 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20  en30(pMem->z);. 
a550: 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d       pMem->enc =
a560: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20   SQLITE_UTF8;.  
a570: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
a580: 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e 20 4f 50     /* When an OP
a590: 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64 65 20  _Program opcode 
a5a0: 69 73 20 65 6e 63 6f 75 6e 74 65 72 20 28 74 68  is encounter (th
a5b0: 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65 20 74 68  e only opcode th
a5c0: 61 74 20 68 61 73 0a 20 20 20 20 20 20 2a 2a 20  at has.      ** 
a5d0: 61 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20  a P4_SUBPROGRAM 
a5e0: 61 72 67 75 6d 65 6e 74 29 2c 20 65 78 70 61 6e  argument), expan
a5f0: 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
a600: 65 20 61 72 72 61 79 20 6f 66 20 73 75 62 70 72  e array of subpr
a610: 6f 67 72 61 6d 73 0a 20 20 20 20 20 20 2a 2a 20  ograms.      ** 
a620: 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b  kept in p->aMem[
a630: 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20 74 68 65  9].z to hold the
a640: 20 6e 65 77 20 70 72 6f 67 72 61 6d 20 2d 20 61   new program - a
a650: 73 73 75 6d 69 6e 67 20 74 68 69 73 20 73 75 62  ssuming this sub
a660: 70 72 6f 67 72 61 6d 0a 20 20 20 20 20 20 2a 2a  program.      **
a670: 20 68 61 73 20 6e 6f 74 20 61 6c 72 65 61 64 79   has not already
a680: 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20 20 20 20   been seen..    
a690: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
a6a0: 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  Op->p4type==P4_S
a6b0: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
a6c0: 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d       int nByte =
a6d0: 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f 66   (nSub+1)*sizeof
a6e0: 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20  (SubProgram*);. 
a6f0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
a700: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
a710: 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nSub; j++){.   
a720: 20 20 20 20 20 20 20 69 66 28 20 61 70 53 75 62         if( apSub
a730: 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e 70 50 72  [j]==pOp->p4.pPr
a740: 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b 0a 20  ogram ) break;. 
a750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a760: 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20 26 26 20   if( j==nSub && 
a770: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74  SQLITE_OK==sqlit
a780: 65 33 56 64 62 65 4d 65 6d 47 72 6f 77 28 70 53  e3VdbeMemGrow(pS
a790: 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53 75 62 21  ub, nByte, nSub!
a7a0: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =0) ){.         
a7b0: 20 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f   apSub = (SubPro
a7c0: 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b  gram **)pSub->z;
a7d0: 0a 20 20 20 20 20 20 20 20 20 20 61 70 53 75 62  .          apSub
a7e0: 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e  [nSub++] = pOp->
a7f0: 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 20  p4.pProgram;.   
a800: 20 20 20 20 20 20 20 70 53 75 62 2d 3e 66 6c 61         pSub->fla
a810: 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a  gs |= MEM_Blob;.
a820: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
a830: 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65 6f 66 28  n = nSub*sizeof(
a840: 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20  SubProgram*);.  
a850: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a860: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d      }..    pMem-
a870: 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
a880: 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20  ;.    pMem->u.i 
a890: 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20 20 20 20  = pOp->p1;      
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8b0: 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a 20 20 20      /* P1 */.   
a8c0: 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d   pMem++;..    pM
a8d0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a8e0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
a8f0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b 20 20 20  .i = pOp->p2;   
a900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a910: 20 20 20 20 20 20 20 2f 2a 20 50 32 20 2a 2f 0a         /* P2 */.
a920: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
a930: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a940: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a950: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 33 3b  ->u.i = pOp->p3;
a960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a970: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 33 20            /* P3 
a980: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a990: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
a9a0: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
a9b0: 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32 29 20 29  size(pMem, 32) )
a9c0: 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20  { /* P4 */.     
a9d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e   assert( p->db->
a9e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
a9f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
aa00: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
aa10: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
aa20: 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54   = MEM_Str|MEM_T
aa30: 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64  erm;.    zP4 = d
aa40: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d  isplayP4(pOp, pM
aa50: 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20 20 20 20  em->z, 32);.    
aa60: 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e 7a  if( zP4!=pMem->z
aa70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
aa80: 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28 70  3VdbeMemSetStr(p
aa90: 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53 51  Mem, zP4, -1, SQ
aaa0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a 20  LITE_UTF8, 0);. 
aab0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
aac0: 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a 21  assert( pMem->z!
aad0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d  =0 );.      pMem
aae0: 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ->n = sqlite3Str
aaf0: 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b 0a  len30(pMem->z);.
ab00: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20        pMem->enc 
ab10: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 20  = SQLITE_UTF8;. 
ab20: 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b     }.    pMem++;
ab30: 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78 70  ..    if( p->exp
ab40: 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20  lain==1 ){.     
ab50: 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65   if( sqlite3Vdbe
ab60: 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a  MemClearAndResiz
ab70: 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20 20  e(pMem, 4) ){.  
ab80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ab90: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
aba0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
abb0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
abc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
abd0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
abe0: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
abf0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
ac00: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
ac10: 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d 65  _snprintf(3, pMe
ac20: 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70 4f  m->z, "%.2x", pO
ac30: 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35 20  p->p5);   /* P5 
ac40: 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  */.      pMem->e
ac50: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
ac60: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
ac70: 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45    .#ifdef SQLITE
ac80: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
ac90: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 69  COMMENTS.      i
aca0: 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  f( sqlite3VdbeMe
acb0: 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65 28  mClearAndResize(
acc0: 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20 20  pMem, 500) ){.  
acd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
ace0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
acf0: 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  d );.        ret
ad00: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
ad10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad20: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
ad30: 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b 0a  M_Str|MEM_Term;.
ad40: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
ad50: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
ad60: 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e 7a  Op, zP4, pMem->z
ad70: 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70 4d  , 500);.      pM
ad80: 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45  em->enc = SQLITE
ad90: 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20 20  _UTF8;.#else.   
ada0: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
adb0: 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20 20   MEM_Null;      
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a 23   /* Comment */.#
ade0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20  endif.    }..   
adf0: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d   p->nResColumn =
ae00: 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c 61   8 - 4*(p->expla
ae10: 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70 52  in-1);.    p->pR
ae20: 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e 61  esultSet = &p->a
ae30: 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e 72  Mem[1];.    p->r
ae40: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
ae50: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52     rc = SQLITE_R
ae60: 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OW;.  }.  return
ae70: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
ae80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
ae90: 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  LAIN */..#ifdef 
aea0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
aeb0: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51 4c  ** Print the SQL
aec0: 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20 74   that was used t
aed0: 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44 42  o generate a VDB
aee0: 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76 6f  E program..*/.vo
aef0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
af00: 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29 7b  intSql(Vdbe *p){
af10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
af20: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = 0;.  if( p->z
af30: 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20 70  Sql ){.    z = p
af40: 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65 20  ->zSql;.  }else 
af50: 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29 7b  if( p->nOp>=1 ){
af60: 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65 4f  .    const VdbeO
af70: 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70  p *pOp = &p->aOp
af80: 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f 70  [0];.    if( pOp
af90: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
afa0: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
afb0: 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 70  0 ){.      z = p
afc0: 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20 20  Op->p4.z;.      
afd0: 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49 73  while( sqlite3Is
afe0: 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b  space(*z) ) z++;
aff0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b000: 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51 4c   z ) printf("SQL
b010: 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a 7d  : [%s]\n", z);.}
b020: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
b030: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b040: 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66 69  T_TRACE) && defi
b050: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
b060: 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a 2a  E_IOTRACE)./*.**
b070: 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41 43   Print an IOTRAC
b080: 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69 6e  E message showin
b090: 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a 2a  g SQL content..*
b0a0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
b0b0: 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64 62  beIOTraceSql(Vdb
b0c0: 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f 70  e *p){.  int nOp
b0d0: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64 62   = p->nOp;.  Vdb
b0e0: 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28 20  eOp *pOp;.  if( 
b0f0: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d 3d  sqlite3IoTrace==
b100: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
b110: 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72 6e  ( nOp<1 ) return
b120: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
b130: 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70 2d  p[0];.  if( pOp-
b140: 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74  >opcode==OP_Init
b150: 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d 30   && pOp->p4.z!=0
b160: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
b170: 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30 30  ;.    char z[100
b180: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0];.    sqlite3_
b190: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
b1a0: 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f 70  z), z, "%s", pOp
b1b0: 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f 72  ->p4.z);.    for
b1c0: 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73 73  (i=0; sqlite3Iss
b1d0: 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29  pace(z[i]); i++)
b1e0: 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  {}.    for(j=0; 
b1f0: 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  z[i]; i++){.    
b200: 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 73    if( sqlite3Iss
b210: 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20 20  pace(z[i]) ){.  
b220: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31 5d        if( z[i-1]
b230: 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20  !=' ' ){.       
b240: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27 3b     z[j++] = ' ';
b250: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b260: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b270: 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20  z[j++] = z[i];. 
b280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
b290: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 73   z[j] = 0;.    s
b2a0: 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22 53  qlite3IoTrace("S
b2b0: 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  QL %s\n", z);.  
b2c0: 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53  }.}.#endif /* !S
b2d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
b2e0: 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
b2f0: 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a  E_IOTRACE */../*
b300: 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61  .** Allocate spa
b310: 63 65 20 66 72 6f 6d 20 61 20 66 69 78 65 64 20  ce from a fixed 
b320: 73 69 7a 65 20 62 75 66 66 65 72 20 61 6e 64 20  size buffer and 
b330: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
b340: 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73 70 61 63   to.** that spac
b350: 65 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  e.  If insuffici
b360: 65 6e 74 20 73 70 61 63 65 20 69 73 20 61 76 61  ent space is ava
b370: 69 6c 61 62 6c 65 2c 20 72 65 74 75 72 6e 20 4e  ilable, return N
b380: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ULL..**.** The p
b390: 42 75 66 20 70 61 72 61 6d 65 74 65 72 20 69 73  Buf parameter is
b3a0: 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c   the initial val
b3b0: 75 65 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  ue of a pointer 
b3c0: 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a 20 72 65  which will.** re
b3d0: 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 6d 65  ceive the new me
b3e0: 6d 6f 72 79 2e 20 20 70 42 75 66 20 69 73 20 6e  mory.  pBuf is n
b3f0: 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e 20 20 49  ormally NULL.  I
b400: 66 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a  f pBuf is not.**
b410: 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61 6e 73 20   NULL, it means 
b420: 74 68 61 74 20 6d 65 6d 6f 72 79 20 73 70 61 63  that memory spac
b430: 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
b440: 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  en allocated and
b450: 20 74 68 61 74 0a 2a 2a 20 74 68 69 73 20 72 6f   that.** this ro
b460: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
b470: 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79 20 6e 65   allocate any ne
b480: 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68 65 6e 20  w memory.  When 
b490: 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a 2a 20 4e  pBuf is not.** N
b4a0: 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65 74 75 72  ULL simply retur
b4b0: 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79 20 61 6c  n pBuf.  Only al
b4c0: 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65 6d 6f 72  locate new memor
b4d0: 79 20 73 70 61 63 65 20 77 68 65 6e 20 70 42 75  y space when pBu
b4e0: 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e 0a 2a 2a  f.** is NULL..**
b4f0: 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20 74 68 65  .** nByte is the
b500: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
b510: 20 6f 66 20 73 70 61 63 65 20 6e 65 65 64 65 64   of space needed
b520: 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72 6f 6d 20  ..**.** *ppFrom 
b530: 70 6f 69 6e 74 73 20 74 6f 20 61 76 61 69 6c 61  points to availa
b540: 62 6c 65 20 73 70 61 63 65 20 61 6e 64 20 70 45  ble space and pE
b550: 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  nd points to the
b560: 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 61   end of the.** a
b570: 76 61 69 6c 61 62 6c 65 20 73 70 61 63 65 2e 20  vailable space. 
b580: 20 57 68 65 6e 20 73 70 61 63 65 20 69 73 20 61   When space is a
b590: 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70 46 72 6f  llocated, *ppFro
b5a0: 6d 20 69 73 20 61 64 76 61 6e 63 65 64 20 70 61  m is advanced pa
b5b0: 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  st.** the end of
b5c0: 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73   the allocated s
b5d0: 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a 70 6e 42  pace..**.** *pnB
b5e0: 79 74 65 20 69 73 20 61 20 63 6f 75 6e 74 65 72  yte is a counter
b5f0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b600: 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65  f bytes of space
b610: 20 74 68 61 74 20 68 61 76 65 20 66 61 69 6c 65   that have faile
b620: 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74 65  d.** to allocate
b630: 2e 20 20 49 66 20 74 68 65 72 65 20 69 73 20 69  .  If there is i
b640: 6e 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63  nsufficient spac
b650: 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20 74 6f 20  e in *ppFrom to 
b660: 73 61 74 69 73 66 79 20 74 68 65 0a 2a 2a 20 72  satisfy the.** r
b670: 65 71 75 65 73 74 2c 20 74 68 65 6e 20 69 6e 63  equest, then inc
b680: 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74 65 20 62  rement *pnByte b
b690: 79 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  y the amount of 
b6a0: 74 68 65 20 72 65 71 75 65 73 74 2e 0a 2a 2f 0a  the request..*/.
b6b0: 73 74 61 74 69 63 20 76 6f 69 64 20 2a 61 6c 6c  static void *all
b6c0: 6f 63 53 70 61 63 65 28 0a 20 20 76 6f 69 64 20  ocSpace(.  void 
b6d0: 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
b6e0: 2f 2a 20 57 68 65 72 65 20 72 65 74 75 72 6e 20  /* Where return 
b6f0: 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20 62 65 20  pointer will be 
b700: 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  stored */.  int 
b710: 6e 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20  nByte,          
b720: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
b730: 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
b740: 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46 72 6f 6d  */.  u8 **ppFrom
b750: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f  ,         /* IN/
b760: 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65 20 66 72  OUT: Allocate fr
b770: 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f 0a 20 20  om *ppFrom */.  
b780: 75 38 20 2a 70 45 6e 64 2c 20 20 20 20 20 20 20  u8 *pEnd,       
b790: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
b7a0: 74 6f 20 31 20 62 79 74 65 20 70 61 73 74 20 74  to 1 byte past t
b7b0: 68 65 20 65 6e 64 20 6f 66 20 2a 70 70 46 72 6f  he end of *ppFro
b7c0: 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e  m buffer */.  in
b7d0: 74 20 2a 70 6e 42 79 74 65 20 20 20 20 20 20 20  t *pnByte       
b7e0: 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f 63 61 74     /* If allocat
b7f0: 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 6d 61  ion cannot be ma
b800: 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74 20 2a 70  de, increment *p
b810: 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20 20 61 73  nByte */.){.  as
b820: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
b830: 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70 70 46 72  _ALIGNMENT(*ppFr
b840: 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75  om) );.  if( pBu
b850: 66 20 29 20 72 65 74 75 72 6e 20 70 42 75 66 3b  f ) return pBuf;
b860: 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44  .  nByte = ROUND
b870: 38 28 6e 42 79 74 65 29 3b 0a 20 20 69 66 28 20  8(nByte);.  if( 
b880: 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42 79 74 65  &(*ppFrom)[nByte
b890: 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a 20 20 20  ] <= pEnd ){.   
b8a0: 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 2a   pBuf = (void*)*
b8b0: 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a 70 70 46  ppFrom;.    *ppF
b8c0: 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20  rom += nByte;.  
b8d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 6e 42 79  }else{.    *pnBy
b8e0: 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a 20 20 7d  te += nByte;.  }
b8f0: 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a  .  return pBuf;.
b900: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64 20  }../*.** Rewind 
b910: 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74 6f  the VDBE back to
b920: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 69   the beginning i
b930: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
b940: 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74 2e  r.** running it.
b950: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b960: 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65 20  VdbeRewind(Vdbe 
b970: 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  *p){.#if defined
b980: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c  (SQLITE_DEBUG) |
b990: 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50  | defined(VDBE_P
b9a0: 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69 3b  ROFILE).  int i;
b9b0: 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
b9c0: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
b9d0: 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  rt( p->magic==VD
b9e0: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b  BE_MAGIC_INIT );
b9f0: 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68 6f  ..  /* There sho
ba00: 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74 20  uld be at least 
ba10: 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a 2f  one opcode..  */
ba20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f  .  assert( p->nO
ba30: 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  p>0 );..  /* Set
ba40: 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56 44   the magic to VD
ba50: 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f 6f  BE_MAGIC_RUN soo
ba60: 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e 20  ner rather than 
ba70: 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e 6d  later. */.  p->m
ba80: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
ba90: 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20 53  C_RUN;..#ifdef S
baa0: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66 6f  QLITE_DEBUG.  fo
bab0: 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e 4d 65 6d  r(i=1; i<p->nMem
bac0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
bad0: 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 64  rt( p->aMem[i].d
bae0: 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d 0a  b==p->db );.  }.
baf0: 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20 3d  #endif.  p->pc =
bb00: 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20 53   -1;.  p->rc = S
bb10: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e 65  QLITE_OK;.  p->e
bb20: 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f  rrorAction = OE_
bb30: 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d 61 67 69  Abort;.  p->magi
bb40: 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 52  c = VDBE_MAGIC_R
bb50: 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61 6e 67 65  UN;.  p->nChange
bb60: 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65   = 0;.  p->cache
bb70: 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69  Ctr = 1;.  p->mi
bb80: 6e 57 72 69 74 65 46 69 6c 65 46 6f 72 6d 61 74  nWriteFileFormat
bb90: 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e 69 53 74   = 255;.  p->iSt
bba0: 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 70  atement = 0;.  p
bbb0: 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 20  ->nFkConstraint 
bbc0: 3d 20 30 3b 0a 23 69 66 64 65 66 20 56 44 42 45  = 0;.#ifdef VDBE
bbd0: 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f 72 28 69  _PROFILE.  for(i
bbe0: 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b  =0; i<p->nOp; i+
bbf0: 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f 70 5b 69  +){.    p->aOp[i
bc00: 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20 20 20 70  ].cnt = 0;.    p
bc10: 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 20  ->aOp[i].cycles 
bc20: 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
bc30: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65  }../*.** Prepare
bc40: 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69   a virtual machi
bc50: 6e 65 20 66 6f 72 20 65 78 65 63 75 74 69 6f 6e  ne for execution
bc60: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 74   for the first t
bc70: 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20 63 72 65  ime after.** cre
bc80: 61 74 69 6e 67 20 74 68 65 20 76 69 72 74 75 61  ating the virtua
bc90: 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54 68 69 73  l machine.  This
bca0: 20 69 6e 76 6f 6c 76 65 73 20 74 68 69 6e 67 73   involves things
bcb0: 20 73 75 63 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f   such.** as allo
bcc0: 63 61 74 69 6e 67 20 72 65 67 69 73 74 65 72 73  cating registers
bcd0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 69 6e   and initializin
bce0: 67 20 74 68 65 20 70 72 6f 67 72 61 6d 20 63 6f  g the program co
bcf0: 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74 65 72 20  unter..** After 
bd00: 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65 20  the VDBE has be 
bd10: 70 72 65 70 70 65 64 2c 20 69 74 20 63 61 6e 20  prepped, it can 
bd20: 62 65 20 65 78 65 63 75 74 65 64 20 62 79 20 6f  be executed by o
bd30: 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 63 61  ne or more.** ca
bd40: 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56 64  lls to sqlite3Vd
bd50: 62 65 45 78 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a  beExec().  .**.*
bd60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
bd70: 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 78  may be called ex
bd80: 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e 20 65 61  actly once on ea
bd90: 63 68 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ch virtual machi
bda0: 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 69  ne..** After thi
bdb0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
bdc0: 6c 65 64 20 74 68 65 20 56 4d 20 68 61 73 20 62  led the VM has b
bdd0: 65 65 6e 20 22 70 61 63 6b 61 67 65 64 22 20 61  een "packaged" a
bde0: 6e 64 20 69 73 20 72 65 61 64 79 0a 2a 2a 20 74  nd is ready.** t
bdf0: 6f 20 72 75 6e 2e 20 20 41 66 74 65 72 20 74 68  o run.  After th
be00: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
be10: 6c 6c 65 64 2c 20 66 75 72 74 68 65 72 20 63 61  lled, further ca
be20: 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71 6c 69 74  lls to .** sqlit
be30: 65 33 56 64 62 65 41 64 64 4f 70 28 29 20 66 75  e3VdbeAddOp() fu
be40: 6e 63 74 69 6f 6e 73 20 61 72 65 20 70 72 6f 68  nctions are proh
be50: 69 62 69 74 65 64 2e 20 20 54 68 69 73 20 72 6f  ibited.  This ro
be60: 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e 65 63 74  utine disconnect
be70: 73 0a 2a 2a 20 74 68 65 20 56 64 62 65 20 66 72  s.** the Vdbe fr
be80: 6f 6d 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a  om the Parse obj
be90: 65 63 74 20 74 68 61 74 20 68 65 6c 70 65 64 20  ect that helped 
bea0: 67 65 6e 65 72 61 74 65 20 69 74 20 73 6f 20 74  generate it so t
beb0: 68 61 74 20 74 68 65 0a 2a 2a 20 74 68 65 20 56  hat the.** the V
bec0: 64 62 65 20 62 65 63 6f 6d 65 73 20 61 6e 20 69  dbe becomes an i
bed0: 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e 74 69 74  ndependent entit
bee0: 79 20 61 6e 64 20 74 68 65 20 50 61 72 73 65 20  y and the Parse 
bef0: 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 0a 2a 2a  object can be.**
bf00: 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a   destroyed..**.*
bf10: 2a 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65  * Use the sqlite
bf20: 33 56 64 62 65 52 65 77 69 6e 64 28 29 20 70 72  3VdbeRewind() pr
bf30: 6f 63 65 64 75 72 65 20 74 6f 20 72 65 73 74 6f  ocedure to resto
bf40: 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61 63  re a virtual mac
bf50: 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  hine back.** to 
bf60: 69 74 73 20 69 6e 69 74 69 61 6c 20 73 74 61 74  its initial stat
bf70: 65 20 61 66 74 65 72 20 69 74 20 68 61 73 20 62  e after it has b
bf80: 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64  een run..*/.void
bf90: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
bfa0: 52 65 61 64 79 28 0a 20 20 56 64 62 65 20 2a 70  Ready(.  Vdbe *p
bfb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
bfc0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
bfd0: 44 42 45 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a  DBE */.  Parse *
bfe0: 70 50 61 72 73 65 20 20 20 20 20 20 20 20 20 20  pParse          
bff0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
c000: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b  ng context */.){
c010: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
c040: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
c050: 20 20 69 6e 74 20 6e 56 61 72 3b 20 20 20 20 20    int nVar;     
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
c080: 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 69 6e  rameters */.  in
c090: 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20 20  t nMem;         
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c0b0: 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20 6d 65 6d  Number of VM mem
c0c0: 6f 72 79 20 72 65 67 69 73 74 65 72 73 20 2a 2f  ory registers */
c0d0: 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f 72 3b 20  .  int nCursor; 
c0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
c100: 75 72 73 6f 72 73 20 72 65 71 75 69 72 65 64 20  ursors required 
c110: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c140: 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 73 75   arguments in su
c150: 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69  bprograms */.  i
c160: 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20 20 20 20  nt nOnce;       
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c180: 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50 5f 4f 6e   Number of OP_On
c190: 63 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20  ce instructions 
c1a0: 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1c0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
c1d0: 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a 7a 43 73  ter */.  u8 *zCs
c1e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c1f0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72          /* Memor
c200: 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  y available for 
c210: 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  allocation */.  
c220: 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20 20 20 20  u8 *zEnd;       
c230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c240: 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61 73  * First byte pas
c250: 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  t allocated memo
c260: 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  ry */.  int nByt
c270: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
c280: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
c290: 63 68 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20  ch extra memory 
c2a0: 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a 0a 20 20  is needed */..  
c2b0: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
c2c0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70    assert( p->nOp
c2d0: 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
c2e0: 70 50 61 72 73 65 21 3d 30 20 29 3b 0a 20 20 61  pParse!=0 );.  a
c2f0: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
c300: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
c310: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
c320: 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72 73 65 20  arse==p->pParse 
c330: 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  );.  db = p->db;
c340: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d  .  assert( db->m
c350: 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d 30 20 29  allocFailed==0 )
c360: 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50 61 72 73  ;.  nVar = pPars
c370: 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d 65 6d 20  e->nVar;.  nMem 
c380: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a  = pParse->nMem;.
c390: 20 20 6e 43 75 72 73 6f 72 20 3d 20 70 50 61 72    nCursor = pPar
c3a0: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e 41 72 67  se->nTab;.  nArg
c3b0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 61 78 41   = pParse->nMaxA
c3c0: 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d 20 70 50  rg;.  nOnce = pP
c3d0: 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a 20 20 69  arse->nOnce;.  i
c3e0: 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29 20 6e 4f  f( nOnce==0 ) nO
c3f0: 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45 6e 73 75  nce = 1; /* Ensu
c400: 72 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  re at least one 
c410: 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f 6e 63 65  byte in p->aOnce
c420: 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a 20 20 2f  Flag[] */.  .  /
c430: 2a 20 46 6f 72 20 65 61 63 68 20 63 75 72 73 6f  * For each curso
c440: 72 20 72 65 71 75 69 72 65 64 2c 20 61 6c 73 6f  r required, also
c450: 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 65 6d 6f   allocate a memo
c460: 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f 72 79 0a  ry cell. Memory.
c470: 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e 4d 65 6d    ** cells (nMem
c480: 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e 6e 4d 65  +1-nCursor)..nMe
c490: 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c 20 77 69  m, inclusive, wi
c4a0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 75 73 65 64  ll never be used
c4b0: 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 76 64 62   by.  ** the vdb
c4c0: 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e 73 74 65  e program. Inste
c4d0: 61 64 20 74 68 65 79 20 61 72 65 20 75 73 65 64  ad they are used
c4e0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   to allocate spa
c4f0: 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56 64 62 65  ce for.  ** Vdbe
c500: 43 75 72 73 6f 72 2f 42 74 43 75 72 73 6f 72 20  Cursor/BtCursor 
c510: 73 74 72 75 63 74 75 72 65 73 2e 20 54 68 65 20  structures. The 
c520: 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61  blob of memory a
c530: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 0a  ssociated with .
c540: 20 20 2a 2a 20 63 75 72 73 6f 72 20 30 20 69 73    ** cursor 0 is
c550: 20 73 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72   stored in memor
c560: 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20 4d 65 6d  y cell nMem. Mem
c570: 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65 6d 2d 31  ory cell (nMem-1
c580: 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74 68  ).  ** stores th
c590: 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
c5a0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
c5b0: 20 63 75 72 73 6f 72 20 31 2c 20 65 74 63 2e 0a   cursor 1, etc..
c5c0: 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65 20 61 6c    **.  ** See al
c5d0: 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73  so: allocateCurs
c5e0: 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65  or()..  */.  nMe
c5f0: 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 0a 20  m += nCursor;.. 
c600: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   /* Allocate spa
c610: 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 72 65  ce for memory re
c620: 67 69 73 74 65 72 73 2c 20 53 51 4c 20 76 61 72  gisters, SQL var
c630: 69 61 62 6c 65 73 2c 20 56 44 42 45 20 63 75 72  iables, VDBE cur
c640: 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a 2a 20 61  sors and .  ** a
c650: 6e 20 61 72 72 61 79 20 74 6f 20 6d 61 72 73 68  n array to marsh
c660: 61 6c 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  al SQL function 
c670: 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e 0a 20 20  arguments in..  
c680: 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28 75 38 2a  */.  zCsr = (u8*
c690: 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d  )&p->aOp[p->nOp]
c6a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c6b0: 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61 62 6c 65  Memory avaliable
c6c0: 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   for allocation 
c6d0: 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28 75 38 2a  */.  zEnd = (u8*
c6e0: 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72 73 65 2d  )&p->aOp[pParse-
c6f0: 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20 2f 2a 20  >nOpAlloc];  /* 
c700: 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
c710: 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d 20 2a 2f  end of zCsr[] */
c720: 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61 6c  ..  resolveP2Val
c730: 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20  ues(p, &nArg);. 
c740: 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72   p->usesStmtJour
c750: 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72 73  nal = (u8)(pPars
c760: 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65 20  e->isMultiWrite 
c770: 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41 62  && pParse->mayAb
c780: 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61 72  ort);.  if( pPar
c790: 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e  se->explain && n
c7a0: 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d  Mem<10 ){.    nM
c7b0: 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 6d  em = 10;.  }.  m
c7c0: 65 6d 73 65 74 28 7a 43 73 72 2c 20 30 2c 20 7a  emset(zCsr, 0, z
c7d0: 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20 7a 43 73  End-zCsr);.  zCs
c7e0: 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20 28 75 38  r += (zCsr - (u8
c7f0: 2a 29 30 29 26 37 3b 0a 20 20 61 73 73 65 72 74  *)0)&7;.  assert
c800: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
c810: 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20 29 3b 0a  GNMENT(zCsr) );.
c820: 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30    p->expired = 0
c830: 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  ;..  p->expired 
c840: 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20 4d 65 6d  = 0;.  .  /* Mem
c850: 6f 72 79 20 66 6f 72 20 72 65 67 69 73 74 65 72  ory for register
c860: 73 2c 20 70 61 72 61 6d 65 74 65 72 73 2c 20 63  s, parameters, c
c870: 75 72 73 6f 72 2c 20 65 74 63 2c 20 69 73 20 61  ursor, etc, is a
c880: 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74 77 6f 0a  llocated in two.
c890: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
c8a0: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
c8b0: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
c8c0: 20 75 6e 75 73 65 64 20 73 70 61 63 65 20 61 74   unused space at
c8d0: 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f   the .  ** end o
c8e0: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
c8f0: 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20 75  ay.  If we are u
c900: 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66 79  nable to satisfy
c910: 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a   all memory.  **
c920: 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62 79   requirements by
c930: 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70 63   reusing the opc
c940: 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c 20  ode array tail, 
c950: 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a  then the second.
c960: 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20 66    ** pass will f
c970: 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 73 74 20  ill in the rest 
c980: 75 73 69 6e 67 20 61 20 66 72 65 73 68 20 61 6c  using a fresh al
c990: 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a  location.  .  **
c9a0: 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70  .  ** This two-p
c9b0: 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68 61  ass approach tha
c9c0: 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63 68  t reuses as much
c9d0: 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69   memory as possi
c9e0: 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68  ble from.  ** th
c9f0: 65 20 6c 65 66 74 6f 76 65 72 20 73 70 61 63 65  e leftover space
ca00: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
ca10: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20  he opcode array 
ca20: 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74 6c  can significantl
ca30: 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74 68  y.  ** reduce th
ca40: 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d 6f  e amount of memo
ca50: 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72 65  ry held by a pre
ca60: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
ca70: 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20 20  .  */.  do {.   
ca80: 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20 20 20 20   nByte = 0;.    
ca90: 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53  p->aMem = allocS
caa0: 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c 20 6e 4d  pace(p->aMem, nM
cab0: 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20  em*sizeof(Mem), 
cac0: 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42  &zCsr, zEnd, &nB
cad0: 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e 61 56 61  yte);.    p->aVa
cae0: 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70  r = allocSpace(p
caf0: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
cb00: 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43 73 72 2c  eof(Mem), &zCsr,
cb10: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
cb20: 20 20 20 20 70 2d 3e 61 70 41 72 67 20 3d 20 61      p->apArg = a
cb30: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 41  llocSpace(p->apA
cb40: 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28  rg, nArg*sizeof(
cb50: 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45  Mem*), &zCsr, zE
cb60: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20  nd, &nByte);.   
cb70: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61 6c 6c 6f   p->azVar = allo
cb80: 63 53 70 61 63 65 28 70 2d 3e 61 7a 56 61 72 2c  cSpace(p->azVar,
cb90: 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28 63 68 61   nVar*sizeof(cha
cba0: 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64  r*), &zCsr, zEnd
cbb0: 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70  , &nByte);.    p
cbc0: 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c 6f 63 53  ->apCsr = allocS
cbd0: 70 61 63 65 28 70 2d 3e 61 70 43 73 72 2c 20 6e  pace(p->apCsr, n
cbe0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
cbf0: 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20 20 20 20  beCursor*),.    
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc10: 20 20 20 20 20 20 26 7a 43 73 72 2c 20 7a 45 6e        &zCsr, zEn
cc20: 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20 20 20  d, &nByte);.    
cc30: 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61  p->aOnceFlag = a
cc40: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 4f 6e  llocSpace(p->aOn
cc50: 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 2c 20 26  ceFlag, nOnce, &
cc60: 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79  zCsr, zEnd, &nBy
cc70: 74 65 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  te);.#ifdef SQLI
cc80: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
cc90: 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d  CANSTATUS.    p-
cca0: 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
ccb0: 70 61 63 65 28 70 2d 3e 61 6e 45 78 65 63 2c 20  pace(p->anExec, 
ccc0: 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
ccd0: 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c  4), &zCsr, zEnd,
cce0: 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e 64 69 66   &nByte);.#endif
ccf0: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 29  .    if( nByte )
cd00: 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46 72 65 65  {.      p->pFree
cd10: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
cd20: 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65  ocZero(db, nByte
cd30: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 43 73  );.    }.    zCs
cd40: 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b 0a 20 20  r = p->pFree;.  
cd50: 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73 72 5b 6e    zEnd = &zCsr[n
cd60: 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69 6c 65 28  Byte];.  }while(
cd70: 20 6e 42 79 74 65 20 26 26 20 21 64 62 2d 3e 6d   nByte && !db->m
cd80: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a  allocFailed );..
cd90: 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e    p->nCursor = n
cda0: 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f 6e  Cursor;.  p->nOn
cdb0: 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b 0a  ceFlag = nOnce;.
cdc0: 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29 7b    if( p->aVar ){
cdd0: 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28  .    p->nVar = (
cde0: 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20 20  ynVar)nVar;.    
cdf0: 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b  for(n=0; n<nVar;
ce00: 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e   n++){.      p->
ce10: 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20  aVar[n].flags = 
ce20: 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
ce30: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20  p->aVar[n].db = 
ce40: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
ce50: 69 66 28 20 70 2d 3e 61 7a 56 61 72 20 29 7b 0a  if( p->azVar ){.
ce60: 20 20 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70      p->nzVar = p
ce70: 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20  Parse->nzVar;.  
ce80: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 7a 56 61    memcpy(p->azVa
ce90: 72 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  r, pParse->azVar
cea0: 2c 20 70 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65 6f  , p->nzVar*sizeo
ceb0: 66 28 70 2d 3e 61 7a 56 61 72 5b 30 5d 29 29 3b  f(p->azVar[0]));
cec0: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 72  .    memset(pPar
ced0: 73 65 2d 3e 61 7a 56 61 72 2c 20 30 2c 20 70 50  se->azVar, 0, pP
cee0: 61 72 73 65 2d 3e 6e 7a 56 61 72 2a 73 69 7a 65  arse->nzVar*size
cef0: 6f 66 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  of(pParse->azVar
cf00: 5b 30 5d 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  [0]));.  }.  if(
cf10: 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20   p->aMem ){.    
cf20: 70 2d 3e 61 4d 65 6d 2d 2d 3b 20 20 20 20 20 20  p->aMem--;      
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 2f 2a 20 61 4d 65 6d 5b 5d 20 67 6f 65 73 20 66  /* aMem[] goes f
cf50: 72 6f 6d 20 31 2e 2e 6e 4d 65 6d 20 2a 2f 0a 20  rom 1..nMem */. 
cf60: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
cf70: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
cf80: 20 20 20 2f 2a 20 20 20 20 20 20 20 6e 6f 74 20     /*       not 
cf90: 66 72 6f 6d 20 30 2e 2e 6e 4d 65 6d 2d 31 20 2a  from 0..nMem-1 *
cfa0: 2f 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 6e  /.    for(n=1; n
cfb0: 3c 3d 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  <=nMem; n++){.  
cfc0: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
cfd0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
cfe0: 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ined;.      p->a
cff0: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
d000: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65      }.  }.  p->e
d010: 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
d020: 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69  >explain;.  sqli
d030: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
d040: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
d050: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
d060: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
d070: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
d080: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
d090: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
d0a0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
d0b0: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
d0c0: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
d0d0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
d0e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
d0f0: 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  n;.  }.  sqlite3
d100: 56 64 62 65 53 6f 72 74 65 72 43 6c 6f 73 65 28  VdbeSorterClose(
d110: 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a 20 20 69  p->db, pCx);.  i
d120: 66 28 20 70 43 78 2d 3e 70 42 74 20 29 7b 0a 20  f( pCx->pBt ){. 
d130: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
d140: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
d150: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
d160: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
d170: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
d180: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
d190: 73 2c 20 62 79 0a 20 20 20 20 2a 2a 20 74 68 65  s, by.    ** the
d1a0: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
d1b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 43 78 2d    }else if( pCx-
d1c0: 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
d1d0: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
d1e0: 65 43 75 72 73 6f 72 28 70 43 78 2d 3e 70 43 75  eCursor(pCx->pCu
d1f0: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  rsor);.  }.#ifnd
d200: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
d210: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 65 6c  IRTUALTABLE.  el
d220: 73 65 20 69 66 28 20 70 43 78 2d 3e 70 56 74 61  se if( pCx->pVta
d230: 62 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 73  bCursor ){.    s
d240: 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72 73  qlite3_vtab_curs
d250: 6f 72 20 2a 70 56 74 61 62 43 75 72 73 6f 72 20  or *pVtabCursor 
d260: 3d 20 70 43 78 2d 3e 70 56 74 61 62 43 75 72 73  = pCx->pVtabCurs
d270: 6f 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 73 71  or;.    const sq
d280: 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d  lite3_module *pM
d290: 6f 64 75 6c 65 20 3d 20 70 56 74 61 62 43 75 72  odule = pVtabCur
d2a0: 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 70 4d 6f 64  sor->pVtab->pMod
d2b0: 75 6c 65 3b 0a 20 20 20 20 70 2d 3e 69 6e 56 74  ule;.    p->inVt
d2c0: 61 62 4d 65 74 68 6f 64 20 3d 20 31 3b 0a 20 20  abMethod = 1;.  
d2d0: 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73    pModule->xClos
d2e0: 65 28 70 56 74 61 62 43 75 72 73 6f 72 29 3b 0a  e(pVtabCursor);.
d2f0: 20 20 20 20 70 2d 3e 69 6e 56 74 61 62 4d 65 74      p->inVtabMet
d300: 68 6f 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  hod = 0;.  }.#en
d310: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  dif.}../*.** Cop
d320: 79 20 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f  y the values sto
d330: 72 65 64 20 69 6e 20 74 68 65 20 56 64 62 65 46  red in the VdbeF
d340: 72 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 74  rame structure t
d350: 6f 20 69 74 73 20 56 64 62 65 2e 20 54 68 69 73  o its Vdbe. This
d360: 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72  .** is used, for
d370: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61   example, when a
d380: 20 74 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f   trigger sub-pro
d390: 67 72 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74  gram is halted t
d3a0: 6f 20 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e  o restore.** con
d3b0: 74 72 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e  trol to the main
d3c0: 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74   program..*/.int
d3d0: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
d3e0: 65 52 65 73 74 6f 72 65 28 56 64 62 65 46 72 61  eRestore(VdbeFra
d3f0: 6d 65 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56  me *pFrame){.  V
d400: 64 62 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d  dbe *v = pFrame-
d410: 3e 76 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  >v;.#ifdef SQLIT
d420: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
d430: 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e  ANSTATUS.  v->an
d440: 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61  Exec = pFrame->a
d450: 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20  nExec;.#endif.  
d460: 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70  v->aOnceFlag = p
d470: 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67  Frame->aOnceFlag
d480: 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67  ;.  v->nOnceFlag
d490: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65   = pFrame->nOnce
d4a0: 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d  Flag;.  v->aOp =
d4b0: 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20   pFrame->aOp;.  
d4c0: 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d  v->nOp = pFrame-
d4d0: 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20  >nOp;.  v->aMem 
d4e0: 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a  = pFrame->aMem;.
d4f0: 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61    v->nMem = pFra
d500: 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61  me->nMem;.  v->a
d510: 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61  pCsr = pFrame->a
d520: 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73  pCsr;.  v->nCurs
d530: 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75  or = pFrame->nCu
d540: 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c  rsor;.  v->db->l
d550: 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d  astRowid = pFram
d560: 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20  e->lastRowid;.  
d570: 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72  v->nChange = pFr
d580: 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20  ame->nChange;.  
d590: 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d  v->db->nChange =
d5a0: 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e   pFrame->nDbChan
d5b0: 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72  ge;.  return pFr
d5c0: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
d5d0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
d5e0: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
d5f0: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
d600: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
d610: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
d620: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
d630: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
d640: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
d650: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
d660: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
d670: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
d680: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
d690: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
d6a0: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
d6b0: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
d6c0: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
d6d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d6e0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
d6f0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
d700: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
d710: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
d720: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
d730: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
d740: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
d750: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
d760: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
d770: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
d780: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
d790: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
d7a0: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  .    p->nFrame =
d7b0: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
d7c0: 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29  ( p->nFrame==0 )
d7d0: 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73  ;..  if( p->apCs
d7e0: 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r ){.    int i;.
d7f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
d800: 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b  ->nCursor; i++){
d810: 0a 20 20 20 20 20 20 56 64 62 65 43 75 72 73 6f  .      VdbeCurso
d820: 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72  r *pC = p->apCsr
d830: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
d840: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  C ){.        sql
d850: 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73  ite3VdbeFreeCurs
d860: 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20  or(p, pC);.     
d870: 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d     p->apCsr[i] =
d880: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
d890: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61  }.  }.  if( p->a
d8a0: 4d 65 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61  Mem ){.    relea
d8b0: 73 65 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61  seMemArray(&p->a
d8c0: 4d 65 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29  Mem[1], p->nMem)
d8d0: 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70  ;.  }.  while( p
d8e0: 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20  ->pDelFrame ){. 
d8f0: 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44     VdbeFrame *pD
d900: 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d  el = p->pDelFram
d910: 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72  e;.    p->pDelFr
d920: 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72  ame = pDel->pPar
d930: 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ent;.    sqlite3
d940: 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28  VdbeFrameDelete(
d950: 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  pDel);.  }..  /*
d960: 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64   Delete any auxd
d970: 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20  ata allocations 
d980: 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a  made by the VM *
d990: 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44  /.  if( p->pAuxD
d9a0: 61 74 61 20 29 20 73 71 6c 69 74 65 33 56 64 62  ata ) sqlite3Vdb
d9b0: 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28 70  eDeleteAuxData(p
d9c0: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65  , -1, 0);.  asse
d9d0: 72 74 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d  rt( p->pAuxData=
d9e0: 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  =0 );.}../*.** C
d9f0: 6c 65 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61  lean up the VM a
da00: 66 74 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75  fter a single ru
da10: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
da20: 64 20 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a  d Cleanup(Vdbe *
da30: 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  p){.  sqlite3 *d
da40: 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64  b = p->db;..#ifd
da50: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
da60: 20 20 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73    /* Execute ass
da70: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
da80: 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
da90: 74 68 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d  the Vdbe.apCsr[]
daa0: 20 61 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e   and .  ** Vdbe.
dab0: 61 4d 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61  aMem[] arrays ha
dac0: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
dad0: 63 6c 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a  cleaned up.  */.
dae0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
daf0: 2d 3e 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d  ->apCsr ) for(i=
db00: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
db10: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
db20: 3e 61 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a  >apCsr[i]==0 );.
db30: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
db40: 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
db50: 3d 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61  =p->nMem; i++) a
db60: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
db70: 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64  ].flags==MEM_Und
db80: 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65  efined );.  }.#e
db90: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44  ndif..  sqlite3D
dba0: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
dbb0: 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72  rMsg);.  p->zErr
dbc0: 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52  Msg = 0;.  p->pR
dbd0: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a  esultSet = 0;.}.
dbe0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
dbf0: 75 6d 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20  umber of result 
dc00: 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c  columns that wil
dc10: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  l be returned by
dc20: 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61   this SQL.** sta
dc30: 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20  tement. This is 
dc40: 6e 6f 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69  now set at compi
dc50: 6c 65 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20  le time, rather 
dc60: 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65  than during.** e
dc70: 78 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20  xecution of the 
dc80: 76 64 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20  vdbe program so 
dc90: 74 68 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  that sqlite3_col
dca0: 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a  umn_count() can.
dcb0: 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ** be called on 
dcc0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
dcd0: 20 62 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f   before sqlite3_
dce0: 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  step()..*/.void 
dcf0: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75  sqlite3VdbeSetNu
dd00: 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69  mCols(Vdbe *p, i
dd10: 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a  nt nResColumn){.
dd20: 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b    Mem *pColName;
dd30: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
dd40: 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b  te3 *db = p->db;
dd50: 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ..  releaseMemAr
dd60: 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c  ray(p->aColName,
dd70: 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43   p->nResColumn*C
dd80: 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c  OLNAME_N);.  sql
dd90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
dda0: 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e  ->aColName);.  n
ddb0: 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f   = nResColumn*CO
ddc0: 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52  LNAME_N;.  p->nR
ddd0: 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29  esColumn = (u16)
dde0: 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d  nResColumn;.  p-
ddf0: 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c  >aColName = pCol
de00: 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c  Name = (Mem*)sql
de10: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
de20: 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29  (db, sizeof(Mem)
de30: 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61  *n );.  if( p->a
de40: 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ColName==0 ) ret
de50: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d  urn;.  while( n-
de60: 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f  - > 0 ){.    pCo
de70: 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d  lName->flags = M
de80: 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f  EM_Null;.    pCo
de90: 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64  lName->db = p->d
dea0: 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b  b;.    pColName+
deb0: 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  +;.  }.}../*.** 
dec0: 53 65 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  Set the name of 
ded0: 74 68 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d  the idx'th colum
dee0: 6e 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  n to be returned
def0: 20 62 79 20 74 68 65 20 53 51 4c 20 73 74 61 74   by the SQL stat
df00: 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20  ement..** zName 
df10: 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65  must be a pointe
df20: 72 20 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69  r to a nul termi
df30: 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a  nated string..**
df40: 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75  .** This call mu
df50: 73 74 20 62 65 20 6d 61 64 65 20 61 66 74 65 72  st be made after
df60: 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
df70: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
df80: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ()..**.** The fi
df90: 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78  nal parameter, x
dfa0: 44 65 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65  Del, must be one
dfb0: 20 6f 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d   of SQLITE_DYNAM
dfc0: 49 43 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  IC, SQLITE_STATI
dfd0: 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54  C.** or SQLITE_T
dfe0: 52 41 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20  RANSIENT. If it 
dff0: 69 73 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  is SQLITE_DYNAMI
e000: 43 2c 20 74 68 65 6e 20 74 68 65 20 62 75 66 66  C, then the buff
e010: 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  er pointed.** to
e020: 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62   by zName will b
e030: 65 20 66 72 65 65 64 20 62 79 20 73 71 6c 69 74  e freed by sqlit
e040: 65 33 44 62 46 72 65 65 28 29 20 77 68 65 6e 20  e3DbFree() when 
e050: 74 68 65 20 76 64 62 65 20 69 73 20 64 65 73 74  the vdbe is dest
e060: 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  royed..*/.int sq
e070: 6c 69 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e  lite3VdbeSetColN
e080: 61 6d 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20  ame(.  Vdbe *p, 
e090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0a0: 20 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20          /* Vdbe 
e0b0: 62 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64  being configured
e0c0: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20   */.  int idx,  
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e0e0: 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
e0f0: 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20  of column zName 
e100: 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20  applies to */.  
e110: 69 6e 74 20 76 61 72 2c 20 20 20 20 20 20 20 20  int var,        
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e130: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
e140: 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e  OLNAME_* constan
e150: 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ts */.  const ch
e160: 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20  ar *zName,      
e170: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
e180: 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f  ter to buffer co
e190: 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f  ntaining name */
e1a0: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
e1b0: 76 6f 69 64 2a 29 20 20 20 20 20 20 20 20 20 20  void*)          
e1c0: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61      /* Memory ma
e1d0: 6e 61 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67  nagement strateg
e1e0: 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29  y for zName */.)
e1f0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
e200: 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61  m *pColName;.  a
e210: 73 73 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52  ssert( idx<p->nR
e220: 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73  esColumn );.  as
e230: 73 65 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d  sert( var<COLNAM
e240: 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  E_N );.  if( p->
e250: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e260: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
e270: 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d  !zName || xDel!=
e280: 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29  SQLITE_DYNAMIC )
e290: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
e2a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
e2b0: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
e2c0: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
e2d0: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
e2e0: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
e2f0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
e300: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
e310: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
e320: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
e330: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
e340: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
e350: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
e360: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
e370: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
e380: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e390: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
e3a0: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
e3b0: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
e3c0: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
e3d0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
e3e0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
e3f0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
e400: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
e410: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
e420: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
e430: 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
e440: 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
e450: 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
e460: 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
e470: 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
e480: 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
e490: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4a0: 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
e4b0: 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
e4c0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
e4d0: 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
e4e0: 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
e4f0: 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
e500: 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
e510: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
e520: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e530: 20 69 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74   int needXcommit
e540: 20 3d 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51   = 0;..#ifdef SQ
e550: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
e560: 4c 54 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68  LTABLE.  /* With
e570: 20 74 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71   this option, sq
e580: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 29 20  lite3VtabSync() 
e590: 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65  is defined to be
e5a0: 20 73 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51   simply .  ** SQ
e5b0: 4c 49 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20  LITE_OK so p is 
e5c0: 6e 6f 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a  not used. .  */.
e5d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
e5e0: 45 52 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  ER(p);.#endif.. 
e5f0: 20 2f 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67   /* Before doing
e600: 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20   anything else, 
e610: 63 61 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29  call the xSync()
e620: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
e630: 79 0a 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d  y.  ** virtual m
e640: 6f 64 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69  odule tables wri
e650: 74 74 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61  tten in this tra
e660: 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68  nsaction. This h
e670: 61 73 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f  as to.  ** be do
e680: 6e 65 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d  ne before determ
e690: 69 6e 69 6e 67 20 77 68 65 74 68 65 72 20 61 20  ining whether a 
e6a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
e6b0: 69 6c 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71  ile is .  ** req
e6c0: 75 69 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79  uired, as an xSy
e6d0: 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61  nc() callback ma
e6e0: 79 20 61 64 64 20 61 6e 20 61 74 74 61 63 68 65  y add an attache
e6f0: 64 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  d database.  ** 
e700: 74 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  to the transacti
e710: 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  on..  */.  rc = 
e720: 73 71 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28  sqlite3VtabSync(
e730: 64 62 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68  db, p);..  /* Th
e740: 69 73 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e  is loop determin
e750: 65 73 20 28 61 29 20 69 66 20 74 68 65 20 63 6f  es (a) if the co
e760: 6d 6d 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64  mmit hook should
e770: 20 62 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a   be invoked and.
e780: 20 20 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e    ** (b) how man
e790: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  y database files
e7a0: 20 68 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65   have open write
e7b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e   transactions, n
e7c0: 6f 74 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69  ot .  ** includi
e7d0: 6e 67 20 74 68 65 20 74 65 6d 70 20 64 61 74 61  ng the temp data
e7e0: 62 61 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70  base. (b) is imp
e7f0: 6f 72 74 61 6e 74 20 62 65 63 61 75 73 65 20 69  ortant because i
e800: 66 20 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a  f more than .  *
e810: 2a 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  * one database f
e820: 69 6c 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20  ile has an open 
e830: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e840: 6e 2c 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  n, a master jour
e850: 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73  nal.  ** file is
e860: 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e   required for an
e870: 20 61 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a   atomic commit..
e880: 20 20 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b    */ .  for(i=0;
e890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
e8a0: 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  & i<db->nDb; i++
e8b0: 29 7b 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70  ){ .    Btree *p
e8c0: 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
e8d0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  pBt;.    if( sql
e8e0: 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61  ite3BtreeIsInTra
e8f0: 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  ns(pBt) ){.     
e900: 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31   needXcommit = 1
e910: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 21 3d 31  ;.      if( i!=1
e920: 20 29 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20   ) nTrans++;.   
e930: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
e940: 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
e950: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
e960: 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
e970: 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
e980: 72 28 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73  r(pBt));.      s
e990: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
e9a0: 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
e9b0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e9c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
e9d0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
e9e0: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
e9f0: 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
ea00: 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
ea10: 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
ea20: 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
ea30: 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
ea40: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
ea50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
ea60: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
ea70: 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
ea80: 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
ea90: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
eaa0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
eab0: 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a  MMITHOOK;.    }.
eac0: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
ead0: 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
eae0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
eaf0: 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
eb00: 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
eb10: 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
eb20: 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
eb30: 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
eb40: 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
eb50: 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
eb60: 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
eb70: 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
eb80: 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
eb90: 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
eba0: 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
ebb0: 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
ebc0: 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
ebd0: 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
ebe0: 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
ebf0: 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
ec00: 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
ec10: 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
ec20: 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
ec30: 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
ec40: 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
ec50: 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
ec60: 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
ec70: 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
ec80: 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
ec90: 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
eca0: 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
ecb0: 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
ecc0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
ecd0: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
ece0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
ecf0: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
ed00: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
ed10: 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
ed20: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
ed30: 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
ed40: 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
ed50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ed60: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
ed70: 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
ed80: 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
ed90: 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
eda0: 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
edb0: 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
edc0: 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
edd0: 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
ede0: 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
edf0: 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
ee00: 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
ee10: 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
ee20: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
ee30: 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
ee40: 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
ee50: 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
ee60: 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
ee70: 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
ee80: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
ee90: 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
eea0: 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
eeb0: 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
eec0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
eed0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
eee0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
eef0: 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
ef00: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ef10: 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
ef20: 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
ef30: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
ef40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ef50: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
ef60: 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
ef70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
ef80: 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
ef90: 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
efa0: 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
efb0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
efc0: 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
efd0: 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
efe0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
eff0: 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
f000: 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
f010: 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
f020: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ally..  */.#ifnd
f030: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
f040: 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
f050: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
f060: 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
f070: 20 20 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63      int needSync
f080: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
f090: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f  zMaster = 0;   /
f0a0: 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20  * File-name for 
f0b0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f0c0: 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63  al */.    char c
f0d0: 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20  onst *zMainFile 
f0e0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
f0f0: 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44  tFilename(db->aD
f100: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73  b[0].pBt);.    s
f110: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61  qlite3_file *pMa
f120: 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36  ster = 0;.    i6
f130: 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20  4 offset = 0;.  
f140: 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69    int res;.    i
f150: 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20  nt retryCount = 
f160: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e  0;.    int nMain
f170: 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  File;..    /* Se
f180: 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f  lect a master jo
f190: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
f1a0: 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65  */.    nMainFile
f1b0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
f1c0: 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  30(zMainFile);. 
f1d0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c     zMaster = sql
f1e0: 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
f1f0: 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a  "%s-mjXXXXXX9XXz
f200: 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20  ", zMainFile);. 
f210: 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d     if( zMaster==
f220: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
f230: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20  E_NOMEM;.    do 
f240: 7b 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e  {.      u32 iRan
f250: 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72  dom;.      if( r
f260: 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20  etryCount ){.   
f270: 20 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f       if( retryCo
f280: 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  unt>100 ){.     
f290: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67       sqlite3_log
f2a0: 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d  (SQLITE_FULL, "M
f2b0: 4a 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a  J delete: %s", z
f2c0: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f2d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
f2e0: 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
f2f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
f300: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f310: 65 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f  else if( retryCo
f320: 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  unt==1 ){.      
f330: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
f340: 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
f350: 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a   collide: %s", z
f360: 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Master);.       
f370: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f380: 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20   retryCount++;. 
f390: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e       sqlite3_ran
f3a0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69  domness(sizeof(i
f3b0: 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f  Random), &iRando
f3c0: 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  m);.      sqlite
f3d0: 33 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26  3_snprintf(13, &
f3e0: 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c  zMaster[nMainFil
f3f0: 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32  e], "-mj%06X9%02
f400: 58 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X",.            
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26     (iRandom>>8)&
f430: 30 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f  0xffffff, iRando
f440: 6d 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f  m&0xff);.      /
f450: 2a 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74  * The antipenult
f460: 69 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20  imate character 
f470: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
f480: 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a  urnal name must.
f490: 20 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20        ** be "9" 
f4a0: 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f  to avoid name co
f4b0: 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73  llisions when us
f4c0: 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65  ing 8+3 filename
f4d0: 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  s. */.      asse
f4e0: 72 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69  rt( zMaster[sqli
f4f0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73  te3Strlen30(zMas
f500: 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a  ter)-3]=='9' );.
f510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c        sqlite3Fil
f520: 65 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69  eSuffix3(zMainFi
f530: 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  le, zMaster);.  
f540: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f550: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
f560: 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
f570: 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
f580: 65 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  es);.    }while(
f590: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
f5a0: 26 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28  & res );.    if(
f5b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f5c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  {.      /* Open 
f5d0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
f5e0: 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20  al. */.      rc 
f5f0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d  = sqlite3OsOpenM
f600: 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73  alloc(pVfs, zMas
f610: 74 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a  ter, &pMaster, .
f620: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f630: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
f640: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
f650: 54 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51  TE|.          SQ
f660: 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
f670: 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  IVE|SQLITE_OPEN_
f680: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20  MASTER_JOURNAL, 
f690: 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
f6a0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
f6b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f6c0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f6d0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f6e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
f6f0: 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74   }. .    /* Writ
f700: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61  e the name of ea
f710: 63 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ch database file
f720: 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
f730: 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77  ion into the new
f740: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
f750: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
f760: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
f770: 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c  at this point cl
f780: 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64  ose.    ** and d
f790: 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
f7a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
f7b0: 6c 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  ll the individua
f7c0: 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a  l journal files.
f7d0: 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76      ** still hav
f7e0: 65 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20  e 'null' as the 
f7f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
f800: 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20  ointer, so they 
f810: 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a  will roll.    **
f820: 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
f830: 74 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65  tly if a failure
f840: 20 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a   occurs..    */.
f850: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
f860: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
f870: 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
f880: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
f890: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
f8a0: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
f8b0: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
f8c0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
f8d0: 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  le = sqlite3Btre
f8e0: 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  eGetJournalname(
f8f0: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  pBt);.        if
f900: 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ( zFile==0 ){.  
f910: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
f920: 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d  ;  /* Ignore TEM
f930: 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64  P and :memory: d
f940: 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20  atabases */.    
f950: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73      }.        as
f960: 73 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d  sert( zFile[0]!=
f970: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
f980: 20 21 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73   !needSync && !s
f990: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
f9a0: 69 73 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a  isabled(pBt) ){.
f9b0: 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
f9c0: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
f9d0: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  }.        rc = s
f9e0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d  qlite3OsWrite(pM
f9f0: 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71  aster, zFile, sq
fa00: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
fa10: 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b  ile)+1, offset);
fa20: 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
fa30: 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
fa40: 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20  30(zFile)+1;.   
fa50: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
fa60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
fa70: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
fa80: 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b  seFree(pMaster);
fa90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
faa0: 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
fab0: 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20   zMaster, 0);.  
fac0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
fad0: 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
fae0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
faf0: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
fb00: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fb10: 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68  ..    /* Sync th
fb20: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fb30: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f   file. If the IO
fb40: 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64  CAP_SEQUENTIAL d
fb50: 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61  evice.    ** fla
fb60: 67 20 69 73 20 73 65 74 20 74 68 69 73 20 69 73  g is set this is
fb70: 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20   not required.. 
fb80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65     */.    if( ne
fb90: 65 64 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20  edSync .     && 
fba0: 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
fbb0: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
fbc0: 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
fbd0: 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
fbe0: 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
fbf0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
fc00: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
fc10: 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
fc20: 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
fc30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
fc40: 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
fc50: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
fc60: 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
fc70: 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
fc80: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
fc90: 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
fca0: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
fcb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
fcc0: 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
fcd0: 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
fce0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
fcf0: 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
fd00: 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
fd10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
fd20: 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
fd30: 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
fd40: 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
fd50: 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
fd60: 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
fd70: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
fd80: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
fd90: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
fda0: 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
fdb0: 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
fdc0: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
fdd0: 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
fde0: 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
fdf0: 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
fe00: 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
fe10: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fe20: 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
fe30: 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
fe40: 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
fe50: 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
fe60: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fe70: 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
fe80: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
fe90: 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
fea0: 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
feb0: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
fec0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
fed0: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
fee0: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
fef0: 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
ff00: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
ff10: 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
ff20: 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
ff30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ff40: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
ff50: 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
ff60: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
ff70: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
ff80: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
ff90: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
ffa0: 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
ffb0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
ffc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ffd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
ffe0: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
fff0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
10000 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
10010 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
10020 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
10030 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
10040 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
10050 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
10060 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
10070 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
10080 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
10090 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
100a0 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
100b0 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
100c0 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
100d0 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
100e0 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20   zMaster, 1);.  
100f0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
10100 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
10110 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
10120 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
10130 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10140 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
10150 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
10160 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
10170 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
10180 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
10190 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
101a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
101b0 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
101c0 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
101d0 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
101e0 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
101f0 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
10200 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
10210 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
10220 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
10230 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
10240 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
10250 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
10260 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
10270 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
10280 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
10290 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
102a0 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
102b0 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
102c0 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
102d0 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
102e0 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
102f0 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
10300 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
10310 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
10320 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
10330 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10340 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
10350 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
10360 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10370 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10380 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10390 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
103a0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
103b0 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
103c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
103d0 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
103e0 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
103f0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
10400 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
10410 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
10420 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
10430 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
10440 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
10450 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
10460 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e  at the sqlite3.n
10470 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74  VdbeActive count
10480 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
10490 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
104a0 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
104b0 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
104c0 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
104d0 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
104e0 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
104f0 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
10500 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
10510 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
10520 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
10530 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
10540 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
10550 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
10560 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
10570 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
10580 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
10590 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
105a0 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
105b0 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
105c0 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
105d0 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
105e0 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
105f0 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
10600 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b    int nRead = 0;
10610 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
10620 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
10630 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
10640 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74  stmt_busy((sqlit
10650 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20  e3_stmt*)p) ){. 
10660 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
10670 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
10680 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
10690 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
106a0 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
106b0 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
106c0 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
106d0 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
106e0 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
106f0 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
10700 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
10710 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
10720 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
10730 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
10740 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
10750 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
10760 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
10770 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
10780 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
10790 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
107a0 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
107b0 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
107c0 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
107d0 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
107e0 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
107f0 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
10800 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
10810 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
10820 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
10830 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
10840 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
10850 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
10860 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
10870 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
10880 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
10890 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
108a0 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
108b0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
108c0 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
108d0 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
108e0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
108f0 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
10900 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
10910 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
10920 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
10930 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
10940 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
10950 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
10960 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10970 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
10980 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
10990 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
109a0 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
109b0 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
109c0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
109d0 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
109e0 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
109f0 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
10a00 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
10a10 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
10a20 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
10a30 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
10a40 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
10a50 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
10a60 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
10a70 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
10a80 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
10a90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
10aa0 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
10ab0 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
10ac0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
10ad0 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
10ae0 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
10af0 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
10b00 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
10b10 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
10b20 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
10b30 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
10b40 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
10b50 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
10b60 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
10b70 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
10b80 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
10b90 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
10ba0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
10bb0 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
10bc0 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
10bd0 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
10be0 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10bf0 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
10c00 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
10c10 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
10c20 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10c30 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
10c40 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
10c50 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
10c60 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
10c70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
10c80 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
10c90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10ca0 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
10cb0 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
10cc0 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
10cd0 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
10ce0 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
10cf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
10d00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10d10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10d20 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
10d30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
10d40 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
10d50 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
10d60 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
10d70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10d80 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
10d90 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
10da0 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
10db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
10dc0 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
10dd0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
10de0 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
10df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10e00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
10e10 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
10e20 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
10e30 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
10e40 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
10e50 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
10e60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
10e70 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
10e80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
10e90 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
10ea0 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
10eb0 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
10ec0 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
10ed0 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
10ee0 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
10ef0 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
10f00 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
10f10 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
10f20 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
10f30 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
10f40 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
10f50 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
10f60 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
10f70 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
10f80 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
10f90 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
10fa0 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
10fb0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10fd0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
10fe0 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
10ff0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
11000 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
11010 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
11020 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
11030 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
11040 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
11050 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
11060 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
11070 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
11080 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
11090 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
110a0 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
110b0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
110c0 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
110d0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
110e0 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
110f0 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
11100 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
11110 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
11120 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
11130 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
11140 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
11150 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
11160 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
11170 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
11180 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
11190 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
111a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
111b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
111c0 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
111d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
111e0 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
111f0 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
11200 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
11210 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
11220 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
11230 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
11240 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
11250 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
11260 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
11270 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
11280 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
11290 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
112a0 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
112b0 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
112c0 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
112d0 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72 69    sqlite3SetStri
112e0 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  ng(&p->zErrMsg, 
112f0 64 62 2c 20 22 46 4f 52 45 49 47 4e 20 4b 45 59  db, "FOREIGN KEY
11300 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c   constraint fail
11310 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed");.    return
11320 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
11330 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11340 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
11350 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
11360 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ine is called th
11370 65 20 77 68 65 6e 20 61 20 56 44 42 45 20 74 72  e when a VDBE tr
11380 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20 49 66  ies to halt.  If
11390 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68 61 73   the VDBE.** has
113a0 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20 61 6e   made changes an
113b0 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d  d is in autocomm
113c0 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20 63 6f  it mode, then co
113d0 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20 63 68  mmit those.** ch
113e0 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72 6f 6c  anges.  If a rol
113f0 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65 64 2c  lback is needed,
11400 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72 6f 6c   then do the rol
11410 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
11420 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65  s routine is the
11430 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d 6f 76   only way to mov
11440 65 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  e the state of a
11450 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51 4c 49   VM from.** SQLI
11460 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74 6f 20  TE_MAGIC_RUN to 
11470 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
11480 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d 6c 65  T.  It is harmle
11490 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20 74 68  ss to.** call th
114a0 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61 74 20  is on a VM that 
114b0 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49 54 45  is in the SQLITE
114c0 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74 61 74  _MAGIC_HALT stat
114d0 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  e..**.** Return 
114e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 20  an error code.  
114f0 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 63 6f  If the commit co
11500 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65 74 65  uld not complete
11510 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a 20 6c   because of.** l
11520 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2c 20  ock contention, 
11530 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
11540 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45 5f 42  SY.  If SQLITE_B
11550 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 2c  USY is returned,
11560 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 65   it.** means the
11570 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74 20 68   close did not h
11580 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64 73 20  appen and needs 
11590 74 6f 20 62 65 20 72 65 70 65 61 74 65 64 2e 0a  to be repeated..
115a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
115b0 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70 29 7b  beHalt(Vdbe *p){
115c0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
115d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115e0 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 73 74     /* Used to st
115f0 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20 72 65  ore transient re
11600 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a 20 20  turn codes */.  
11610 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
11620 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  >db;..  /* This 
11630 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61 69 6e  function contain
11640 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68 61 74  s the logic that
11650 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   determines if a
11660 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a 20 20   statement or.  
11670 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
11680 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64  ill be committed
11690 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   or rolled back 
116a0 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74  as a result of t
116b0 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74 69 6f  he.  ** executio
116c0 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74 75 61  n of this virtua
116d0 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20 2a 2a  l machine. .  **
116e0 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20  .  ** If any of 
116f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 72  the following er
11700 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20 2a 2a  rors occur:.  **
11710 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
11720 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20 20 20  _NOMEM.  **     
11730 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 2a  SQLITE_IOERR.  *
11740 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46 55 4c  *     SQLITE_FUL
11750 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  L.  **     SQLIT
11760 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20 2a 2a  E_INTERRUPT.  **
11770 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65 20 69  .  ** Then the i
11780 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20 6d 69  nternal cache mi
11790 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 6c 65  ght have been le
117a0 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
117b0 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61 74 65  stent.  ** state
117c0 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
117d0 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  llback the state
117e0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
117f0 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a 20 20  , if there is.  
11800 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65 20 63  ** one, or the c
11810 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61 63 74  omplete transact
11820 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69 73 20  ion if there is 
11830 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  no statement tra
11840 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 0a  nsaction..  */..
11850 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
11860 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11870 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
11880 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28  NOMEM;.  }.  if(
11890 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 29 20   p->aOnceFlag ) 
118a0 6d 65 6d 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46  memset(p->aOnceF
118b0 6c 61 67 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65  lag, 0, p->nOnce
118c0 46 6c 61 67 29 3b 0a 20 20 63 6c 6f 73 65 41 6c  Flag);.  closeAl
118d0 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
118e0 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
118f0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
11900 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
11910 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
11920 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
11930 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
11940 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
11950 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
11960 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
11970 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
11980 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
11990 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
119a0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
119b0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
119c0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
119d0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
119e0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
119f0 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
11a00 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
11a10 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
11a20 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
11a30 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
11a40 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
11a50 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
11a60 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
11a70 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
11a80 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
11a90 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
11aa0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
11ab0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
11ac0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
11ad0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
11ae0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
11af0 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
11b00 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
11b10 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
11b20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
11b30 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
11b40 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
11b50 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
11b60 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
11b70 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
11b80 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
11b90 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
11ba0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
11bb0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
11bc0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
11bd0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
11be0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
11bf0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
11c00 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
11c10 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
11c20 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
11c30 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
11c40 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
11c50 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
11c60 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
11c70 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
11c80 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
11c90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
11ca0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
11cb0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
11cc0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
11cd0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
11ce0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
11cf0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
11d00 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
11d10 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
11d20 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
11d30 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
11d40 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
11d50 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
11d60 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
11d70 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
11d80 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
11d90 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
11da0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
11db0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
11dc0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
11dd0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
11de0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
11df0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
11e00 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
11e10 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
11e20 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
11e30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
11e40 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
11e50 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
11e60 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
11e70 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
11e80 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
11e90 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
11ea0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
11eb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
11ec0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
11ed0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
11ee0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
11ef0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
11f00 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
11f10 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
11f20 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
11f30 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
11f40 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
11f50 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
11f60 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
11f70 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
11f80 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
11f90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
11fa0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
11fb0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
11fc0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
11fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
11fe0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
11ff0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
12000 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
12010 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
12020 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
12030 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12040 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
12050 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
12060 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
12070 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
12080 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
12090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
120a0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
120b0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
120c0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
120d0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
120e0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
120f0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
12100 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
12110 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
12120 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
12130 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
12140 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
12150 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
12160 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
12170 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
12180 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
12190 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
121a0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
121b0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
121c0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
121d0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
121e0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
121f0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
12200 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
12210 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
12220 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
12230 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
12240 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12250 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
12260 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
12270 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
12280 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
12290 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
122a0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
122b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
122c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
122d0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
122e0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
122f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12300 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
12310 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12320 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
12330 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12340 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12350 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
12360 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
12370 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
12380 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
12390 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
123a0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
123b0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
123c0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
123d0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
123e0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
123f0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
12400 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
12410 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
12420 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
12430 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
12440 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
12450 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
12460 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
12470 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
12480 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
12490 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
124a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
124b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
124c0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
124d0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
124e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
124f0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
12500 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
12510 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
12520 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
12530 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12540 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
12550 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12560 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12570 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
12580 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
12590 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
125a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
125b0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
125c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
125d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
125e0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
125f0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
12600 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
12610 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
12620 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
12630 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
12640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
12650 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
12660 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
12670 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
12680 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
12690 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
126a0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
126b0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
126c0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
126d0 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
126e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
126f0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
12700 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
12710 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
12720 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
12730 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
12740 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
12750 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
12760 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
12770 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
12780 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12790 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
127a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
127b0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
127c0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
127d0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
127e0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
127f0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
12800 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
12810 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
12820 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
12830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12840 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
12850 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
12860 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
12870 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12880 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
12890 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
128a0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
128b0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
128c0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
128d0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
128e0 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
128f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
12900 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
12910 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
12920 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
12930 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
12940 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
12950 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
12960 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
12970 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
12980 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
12990 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
129a0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
129b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
129c0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
129d0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
129e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
129f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
12a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
12a10 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
12a20 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
12a30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
12a40 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
12a50 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
12a60 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
12a70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
12a80 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
12a90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
12aa0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12ab0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
12ac0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
12ad0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
12ae0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
12af0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
12b00 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
12b10 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
12b20 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
12b30 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
12b40 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
12b50 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
12b60 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
12b70 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12b80 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
12b90 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
12ba0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
12bb0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
12bc0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
12bd0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
12be0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
12bf0 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
12c00 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
12c10 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
12c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12c30 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
12c40 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
12c50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12c60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
12c70 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
12c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
12c90 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
12ca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
12cb0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
12cc0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
12cd0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
12ce0 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
12cf0 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
12d00 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
12d10 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
12d20 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
12d30 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
12d40 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
12d50 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
12d60 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
12d70 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
12d80 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
12d90 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
12da0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
12db0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
12dc0 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
12dd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
12de0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
12df0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
12e00 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12e10 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
12e20 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
12e30 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
12e40 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
12e50 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
12e60 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ( p->db->mallocF
12e70 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e  ailed ){.    p->
12e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
12e90 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  M;.  }..  /* If 
12ea0 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20  the auto-commit 
12eb0 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 74  flag is set to t
12ec0 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20 6c 6f  rue, then any lo
12ed0 63 6b 73 20 74 68 61 74 20 77 65 72 65 20 68 65  cks that were he
12ee0 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e 6e 65  ld.  ** by conne
12ef0 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20 6e 6f  ction db have no
12f00 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 2e  w been released.
12f10 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43 6f 6e   Call sqlite3Con
12f20 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28  nectionUnlocked(
12f30 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76 6f 6b  ) .  ** to invok
12f40 65 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 75  e any required u
12f50 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
12f60 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 69  lbacks..  */.  i
12f70 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  f( db->autoCommi
12f80 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
12f90 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
12fa0 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 61  ed(db);.  }..  a
12fb0 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65  ssert( db->nVdbe
12fc0 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62 2d 3e  Active>0 || db->
12fd0 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20 7c 7c  autoCommit==0 ||
12fe0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d   db->nStatement=
12ff0 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  =0 );.  return (
13000 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  p->rc==SQLITE_BU
13010 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55 53 59  SY ? SQLITE_BUSY
13020 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 7d   : SQLITE_OK);.}
13030 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20 56 44  .../*.** Each VD
13040 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72 65 73  BE holds the res
13050 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ult of the most 
13060 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 73  recent sqlite3_s
13070 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20 69 6e  tep() call.** in
13080 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20 72 6f   p->rc.  This ro
13090 75 74 69 6e 65 20 73 65 74 73 20 74 68 61 74 20  utine sets that 
130a0 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f 20 53  result back to S
130b0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76 6f 69  QLITE_OK..*/.voi
130c0 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73  d sqlite3VdbeRes
130d0 65 74 53 74 65 70 52 65 73 75 6c 74 28 56 64 62  etStepResult(Vdb
130e0 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63 20 3d  e *p){.  p->rc =
130f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13100 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 65 72  *.** Copy the er
13110 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65 72 72  ror code and err
13120 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c 6f 6e  or message belon
13130 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44 42 45  ging to the VDBE
13140 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
13150 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
13160 20 74 6f 20 69 74 73 20 64 61 74 61 62 61 73 65   to its database
13170 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68 61 74   handle (so that
13180 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 0a 2a   they will be .*
13190 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20 63 61  * returned by ca
131a0 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  lls to sqlite3_e
131b0 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73 71 6c  rrcode() and sql
131c0 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29 2e 0a  ite3_errmsg())..
131d0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
131e0 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63 6c 65  ion does not cle
131f0 61 72 20 74 68 65 20 56 44 42 45 20 65 72 72 6f  ar the VDBE erro
13200 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73 61 67  r code or messag
13210 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70 69 65  e, just.** copie
13220 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20 64 61  s them to the da
13230 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a  tabase handle..*
13240 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
13250 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72 28 56  eTransferError(V
13260 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
13270 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  e3 *db = p->db;.
13280 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e 72 63    int rc = p->rc
13290 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72 72 4d  ;.  if( p->zErrM
132a0 73 67 20 29 7b 0a 20 20 20 20 75 38 20 6d 61 6c  sg ){.    u8 mal
132b0 6c 6f 63 46 61 69 6c 65 64 20 3d 20 64 62 2d 3e  locFailed = db->
132c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
132d0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
132e0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
132f0 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 3d 3d    if( db->pErr==
13300 30 20 29 20 64 62 2d 3e 70 45 72 72 20 3d 20 73  0 ) db->pErr = s
13310 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 64  qlite3ValueNew(d
13320 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  b);.    sqlite3V
13330 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
13340 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a 45 72 72  Err, -1, p->zErr
13350 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Msg, SQLITE_UTF8
13360 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
13370 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
13380 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  EndBenignMalloc(
13390 29 3b 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  );.    db->mallo
133a0 63 46 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63  cFailed = malloc
133b0 46 61 69 6c 65 64 3b 0a 20 20 20 20 64 62 2d 3e  Failed;.    db->
133c0 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20  errCode = rc;.  
133d0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
133e0 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b  e3Error(db, rc);
133f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
13400 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
13410 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47  TE_ENABLE_SQLLOG
13420 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c  ./*.** If an SQL
13430 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
13440 47 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74  G hook is regist
13450 65 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20  ered and the VM 
13460 68 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a  has been run, .*
13470 2a 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a  * invoke it..*/.
13480 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65  static void vdbe
13490 49 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62  InvokeSqllog(Vdb
134a0 65 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c  e *v){.  if( sql
134b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
134c0 2e 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72  .xSqllog && v->r
134d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
134e0 76 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63  v->zSql && v->pc
134f0 3e 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  >=0 ){.    char 
13500 2a 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c  *zExpanded = sql
13510 69 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71  ite3VdbeExpandSq
13520 6c 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20  l(v, v->zSql);. 
13530 20 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62     assert( v->db
13540 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29  ->init.busy==0 )
13550 3b 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e  ;.    if( zExpan
13560 64 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ded ){.      sql
13570 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13580 2e 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20  .xSqllog(.      
13590 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
135a0 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41  lConfig.pSqllogA
135b0 72 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61  rg, v->db, zExpa
135c0 6e 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b  nded, 1.      );
135d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
135e0 46 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70  Free(v->db, zExp
135f0 61 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20  anded);.    }.  
13600 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  }.}.#else.# defi
13610 6e 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  ne vdbeInvokeSql
13620 6c 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  log(x).#endif../
13630 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20  *.** Clean up a 
13640 56 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75  VDBE after execu
13650 74 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20  tion but do not 
13660 64 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20  delete the VDBE 
13670 6a 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69  just yet..** Wri
13680 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
13690 73 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72  sages into *pzEr
136a0 72 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68  rMsg.  Return th
136b0 65 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a  e result code..*
136c0 2a 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20  *.** After this 
136d0 72 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20  routine is run, 
136e0 74 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20  the VDBE should 
136f0 62 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65  be ready to be e
13700 78 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e  xecuted.** again
13710 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20  ..**.** To look 
13720 61 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61  at it another wa
13730 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
13740 72 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65  resets the state
13750 20 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75   of the.** virtu
13760 61 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20  al machine from 
13770 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f  VDBE_MAGIC_RUN o
13780 72 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  r VDBE_MAGIC_HAL
13790 54 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42  T back to.** VDB
137a0 45 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f  E_MAGIC_INIT..*/
137b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
137c0 52 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a  Reset(Vdbe *p){.
137d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
137e0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20   db = p->db;..  
137f0 2f 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64  /* If the VM did
13800 20 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70   not run to comp
13810 6c 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20  letion or if it 
13820 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20  encountered an. 
13830 20 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20   ** error, then 
13840 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76  it might not hav
13850 65 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72  e been halted pr
13860 6f 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74  operly.  So halt
13870 0a 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20  .  ** it now..  
13880 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  */.  sqlite3Vdbe
13890 48 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  Halt(p);..  /* I
138a0 66 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62  f the VDBE has b
138b0 65 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69  e run even parti
138c0 61 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73  ally, then trans
138d0 66 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f  fer the error co
138e0 64 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f  de.  ** and erro
138f0 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74  r message from t
13900 68 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65  he VDBE into the
13910 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73   main database s
13920 74 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20  tructure.  But. 
13930 20 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20   ** if the VDBE 
13940 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65  has just been se
13950 74 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73  t to run but has
13960 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78   not actually ex
13970 65 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20  ecuted any.  ** 
13980 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74  instructions yet
13990 2c 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e  , leave the main
139a0 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
139b0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68  information unch
139c0 61 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  anged..  */.  if
139d0 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  ( p->pc>=0 ){.  
139e0 20 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c    vdbeInvokeSqll
139f0 6f 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  og(p);.    sqlit
13a00 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
13a10 72 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  ror(p);.    sqli
13a20 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
13a30 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70  >zErrMsg);.    p
13a40 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
13a50 20 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c     if( p->runOnl
13a60 79 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72  yOnce ) p->expir
13a70 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  ed = 1;.  }else 
13a80 69 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e  if( p->rc && p->
13a90 65 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f  expired ){.    /
13aa0 2a 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c  * The expired fl
13ab0 61 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68  ag was set on th
13ac0 65 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68  e VDBE before th
13ad0 65 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20  e first call.   
13ae0 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73   ** to sqlite3_s
13af0 74 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69  tep(). For consi
13b00 73 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71  stency (since sq
13b10 6c 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73  lite3_step() was
13b20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c  .    ** called),
13b30 20 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73   set the databas
13b40 65 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20  e error in this 
13b50 63 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20  case as well..  
13b60 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
13b70 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
13b80 20 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d   p->rc, p->zErrM
13b90 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70  sg ? "%s" : 0, p
13ba0 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  ->zErrMsg);.    
13bb0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
13bc0 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20  , p->zErrMsg);. 
13bd0 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20     p->zErrMsg = 
13be0 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63  0;.  }..  /* Rec
13bf0 6c 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  laim all memory 
13c00 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45  used by the VDBE
13c10 0a 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28  .  */.  Cleanup(
13c20 70 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70  p);..  /* Save p
13c30 72 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61  rofiling informa
13c40 74 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56  tion from this V
13c50 44 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69  DBE run..  */.#i
13c60 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c  fdef VDBE_PROFIL
13c70 45 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a  E.  {.    FILE *
13c80 6f 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62  out = fopen("vdb
13c90 65 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20  e_profile.out", 
13ca0 22 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75  "a");.    if( ou
13cb0 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
13cc0 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28  ;.      fprintf(
13cd0 6f 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20  out, "---- ");. 
13ce0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
13cf0 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20  p->nOp; i++){.  
13d00 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
13d10 74 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f  t, "%02x", p->aO
13d20 70 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20  p[i].opcode);.  
13d30 20 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69      }.      fpri
13d40 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  ntf(out, "\n");.
13d50 20 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71        if( p->zSq
13d60 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  l ){.        cha
13d70 72 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20  r c, pc = 0;.   
13d80 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
13d90 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20  , "-- ");.      
13da0 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
13db0 70 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20  p->zSql[i])!=0; 
13dc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
13dd0 69 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66  if( pc=='\n' ) f
13de0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
13df0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75  ");.          pu
13e00 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
13e10 20 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20        pc = c;.  
13e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13e30 69 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66  if( pc!='\n' ) f
13e40 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22  printf(out, "\n"
13e50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13e60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
13e70 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  Op; i++){.      
13e80 20 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d    char zHdr[100]
13e90 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13ea0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
13eb0 66 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22  f(zHdr), zHdr, "
13ec0 25 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75  %6u %12llu %8llu
13ed0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70   ",.           p
13ee0 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20  ->aOp[i].cnt,.  
13ef0 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b           p->aOp[
13f00 69 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20  i].cycles,.     
13f10 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
13f20 63 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69  cnt>0 ? p->aOp[i
13f30 5d 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b  ].cycles/p->aOp[
13f40 69 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20  i].cnt : 0.     
13f50 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70     );.        fp
13f60 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
13f70 20 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20   zHdr);.        
13f80 73 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74  sqlite3VdbePrint
13f90 4f 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61  Op(out, i, &p->a
13fa0 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  Op[i]);.      }.
13fb0 20 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74        fclose(out
13fc0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
13fd0 64 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e  dif.  p->iCurren
13fe0 74 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e  tTime = 0;.  p->
13ff0 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
14000 49 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72  IC_INIT;.  retur
14010 6e 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72  n p->rc & db->er
14020 72 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a  rMask;.}. ./*.**
14030 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65   Clean up and de
14040 6c 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65  lete a VDBE afte
14050 72 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65  r execution.  Re
14060 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20  turn an integer 
14070 77 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20  which is.** the 
14080 72 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72  result code.  Wr
14090 69 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65  ite any error me
140a0 73 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20  ssage text into 
140b0 2a 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e  *pzErrMsg..*/.in
140c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  t sqlite3VdbeFin
140d0 61 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a  alize(Vdbe *p){.
140e0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
140f0 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d  E_OK;.  if( p->m
14100 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
14110 5f 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63  _RUN || p->magic
14120 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  ==VDBE_MAGIC_HAL
14130 54 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  T ){.    rc = sq
14140 6c 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70  lite3VdbeReset(p
14150 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
14160 72 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d  rc & p->db->errM
14170 61 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a  ask)==rc );.  }.
14180 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
14190 65 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ete(p);.  return
141a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66   rc;.}../*.** If
141b0 20 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69   parameter iOp i
141c0 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
141d0 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  , then invoke th
141e0 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
141f0 0a 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72  .** all auxiliar
14200 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
14210 63 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64  currently cached
14220 20 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65   by the VM passe
14230 64 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73  d as.** the firs
14240 74 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a  t argument..**.*
14250 2a 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20  * Or, if iOp is 
14260 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20  greater than or 
14270 65 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74  equal to zero, t
14280 68 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74  hen the destruct
14290 6f 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e  or is.** only in
142a0 76 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20  voked for those 
142b0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
142c0 6f 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20  ointers created 
142d0 62 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20  by the user .** 
142e0 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64  function invoked
142f0 20 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74   by the OP_Funct
14300 69 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e  ion opcode at in
14310 73 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66  struction iOp of
14320 20 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61   .** VM pVdbe, a
14330 6e 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a  nd only then if:
14340 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20  .**.**    * the 
14350 61 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74  associated funct
14360 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73  ion parameter is
14370 20 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74   the 32nd or lat
14380 65 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20  er (counting.** 
14390 20 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74       from left t
143a0 6f 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a  o right), or.**.
143b0 2a 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72  **    * the corr
143c0 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e  esponding bit in
143d0 20 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69   argument mask i
143e0 73 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74  s clear (where t
143f0 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20  he first.**     
14400 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65   function parame
14410 74 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20  ter corresponds 
14420 74 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a  to bit 0 etc.)..
14430 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
14440 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
14450 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 69 6e  (Vdbe *pVdbe, in
14460 74 20 69 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29  t iOp, int mask)
14470 7b 0a 20 20 41 75 78 44 61 74 61 20 2a 2a 70 70  {.  AuxData **pp
14480 20 3d 20 26 70 56 64 62 65 2d 3e 70 41 75 78 44   = &pVdbe->pAuxD
14490 61 74 61 3b 0a 20 20 77 68 69 6c 65 28 20 2a 70  ata;.  while( *p
144a0 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61 74 61  p ){.    AuxData
144b0 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a 20 20   *pAux = *pp;.  
144c0 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a 20 20    if( (iOp<0).  
144d0 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69 4f 70     || (pAux->iOp
144e0 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78 2d 3e  ==iOp && (pAux->
144f0 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d 61 73  iArg>31 || !(mas
14500 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28 70 41  k & MASKBIT32(pA
14510 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20 20 20  ux->iArg)))).   
14520 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61   ){.      testca
14530 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67 3d 3d  se( pAux->iArg==
14540 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  31 );.      if( 
14550 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20 29 7b  pAux->xDelete ){
14560 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d 3e 78  .        pAux->x
14570 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70 41 75  Delete(pAux->pAu
14580 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  x);.      }.    
14590 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e 70 4e    *pp = pAux->pN
145a0 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
145b0 65 33 44 62 46 72 65 65 28 70 56 64 62 65 2d 3e  e3DbFree(pVdbe->
145c0 64 62 2c 20 70 41 75 78 29 3b 0a 20 20 20 20 7d  db, pAux);.    }
145d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 70 3d 20  else{.      pp= 
145e0 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20 20  &pAux->pNext;.  
145f0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
14600 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79   Free all memory
14610 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
14620 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65 64   the Vdbe passed
14630 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
14640 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65 78 63 65  rgument,.** exce
14650 70 74 20 66 6f 72 20 6f 62 6a 65 63 74 20 69 74  pt for object it
14660 73 65 6c 66 2c 20 77 68 69 63 68 20 69 73 20 70  self, which is p
14670 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
14680 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
14690 65 74 77 65 65 6e 20 74 68 69 73 20 66 75 6e 63  etween this func
146a0 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69 74 65 33  tion and sqlite3
146b0 56 64 62 65 44 65 6c 65 74 65 28 29 20 69 73 20  VdbeDelete() is 
146c0 74 68 61 74 0a 2a 2a 20 56 64 62 65 44 65 6c 65  that.** VdbeDele
146d0 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b  te() also unlink
146e0 73 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20  s the Vdbe from 
146f0 74 68 65 20 6c 69 73 74 20 6f 66 20 56 4d 73 20  the list of VMs 
14700 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
14710 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
14720 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 66  connection and f
14730 72 65 65 73 20 74 68 65 20 6f 62 6a 65 63 74 20  rees the object 
14740 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20  itself..*/.void 
14750 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
14760 4f 62 6a 65 63 74 28 73 71 6c 69 74 65 33 20 2a  Object(sqlite3 *
14770 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
14780 53 75 62 50 72 6f 67 72 61 6d 20 2a 70 53 75 62  SubProgram *pSub
14790 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 6e 74 20  , *pNext;.  int 
147a0 69 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  i;.  assert( p->
147b0 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d  db==0 || p->db==
147c0 64 62 20 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  db );.  releaseM
147d0 65 6d 41 72 72 61 79 28 70 2d 3e 61 56 61 72 2c  emArray(p->aVar,
147e0 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20 72 65 6c   p->nVar);.  rel
147f0 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14800 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65  aColName, p->nRe
14810 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f  sColumn*COLNAME_
14820 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75 62 3d 70  N);.  for(pSub=p
14830 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70 53 75 62  ->pProgram; pSub
14840 3b 20 70 53 75 62 3d 70 4e 65 78 74 29 7b 0a 20  ; pSub=pNext){. 
14850 20 20 20 70 4e 65 78 74 20 3d 20 70 53 75 62 2d     pNext = pSub-
14860 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76 64 62 65  >pNext;.    vdbe
14870 46 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20  FreeOpArray(db, 
14880 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53 75 62 2d  pSub->aOp, pSub-
14890 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  >nOp);.    sqlit
148a0 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 53 75  e3DbFree(db, pSu
148b0 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
148c0 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69 3e 3d 30  p->nzVar-1; i>=0
148d0 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65 33 44 62  ; i--) sqlite3Db
148e0 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61  Free(db, p->azVa
148f0 72 5b 69 5d 29 3b 0a 20 20 76 64 62 65 46 72 65  r[i]);.  vdbeFre
14900 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70 2d 3e  eOpArray(db, p->
14910 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a 20 20  aOp, p->nOp);.  
14920 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14930 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
14940 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14950 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a 20 20  db, p->zSql);.  
14960 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14970 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23 69 66  , p->pFree);.#if
14980 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
14990 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
149a0 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  S.  for(i=0; i<p
149b0 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b 0a 20  ->nScan; i++){. 
149c0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
149d0 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b 69 5d  (db, p->aScan[i]
149e0 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73  .zName);.  }.  s
149f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
14a00 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65 6e 64   p->aScan);.#end
14a10 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  if.}../*.** Dele
14a20 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56 44 42  te an entire VDB
14a30 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  E..*/.void sqlit
14a40 65 33 56 64 62 65 44 65 6c 65 74 65 28 56 64 62  e3VdbeDelete(Vdb
14a50 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
14a60 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e 45 56   *db;..  if( NEV
14a70 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(p==0) ) retur
14a80 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b  n;.  db = p->db;
14a90 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14aa0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
14ab0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
14ac0 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62  lite3VdbeClearOb
14ad0 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20 20 69  ject(db, p);.  i
14ae0 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b 0a 20  f( p->pPrev ){. 
14af0 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65     p->pPrev->pNe
14b00 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
14b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
14b20 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d 3d 70  rt( db->pVdbe==p
14b30 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56 64 62   );.    db->pVdb
14b40 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  e = p->pNext;.  
14b50 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74  }.  if( p->pNext
14b60 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74   ){.    p->pNext
14b70 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50 72  ->pPrev = p->pPr
14b80 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67  ev;.  }.  p->mag
14b90 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f  ic = VDBE_MAGIC_
14ba0 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20 3d 20  DEAD;.  p->db = 
14bb0 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  0;.  sqlite3DbFr
14bc0 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a  ee(db, p);.}../*
14bd0 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72 20 22  .** The cursor "
14be0 70 22 20 68 61 73 20 61 20 70 65 6e 64 69 6e 67  p" has a pending
14bf0 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f 6e 20   seek operation 
14c00 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
14c10 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69 65 64   been.** carried
14c20 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68 65 20   out.  Seek the 
14c30 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49 66 20  cursor now.  If 
14c40 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
14c50 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 61   return.** the a
14c60 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
14c70 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
14c80 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   int SQLITE_NOIN
14c90 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66 65 72  LINE handleDefer
14ca0 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  redMoveto(VdbeCu
14cb0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20  rsor *p){.  int 
14cc0 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65 66 20  res, rc;.#ifdef 
14cd0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 65 78  SQLITE_TEST.  ex
14ce0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14cf0 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 23  _search_count;.#
14d00 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20  endif.  assert( 
14d10 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
14d20 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  o );.  assert( p
14d30 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20 20 72  ->isTable );.  r
14d40 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
14d50 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
14d60 2d 3e 70 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d  ->pCursor, 0, p-
14d70 3e 6d 6f 76 65 74 6f 54 61 72 67 65 74 2c 20 30  >movetoTarget, 0
14d80 2c 20 26 72 65 73 29 3b 0a 20 20 69 66 28 20 72  , &res);.  if( r
14d90 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
14da0 20 69 66 28 20 72 65 73 21 3d 30 20 29 20 72 65   if( res!=0 ) re
14db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
14dc0 55 50 54 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66  UPT_BKPT;.#ifdef
14dd0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73   SQLITE_TEST.  s
14de0 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f  qlite3_search_co
14df0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  unt++;.#endif.  
14e00 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
14e10 6f 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68  o = 0;.  p->cach
14e20 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
14e30 53 54 41 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20  STALE;.  return 
14e40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14e50 0a 2a 2a 20 53 6f 6d 65 74 68 69 6e 67 20 68 61  .** Something ha
14e60 73 20 6d 6f 76 65 64 20 63 75 72 73 6f 72 20 22  s moved cursor "
14e70 70 22 20 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e  p" out of place.
14e80 20 20 4d 61 79 62 65 20 74 68 65 20 72 6f 77 20    Maybe the row 
14e90 69 74 20 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65  it was.** pointe
14ea0 64 20 74 6f 20 77 61 73 20 64 65 6c 65 74 65 64  d to was deleted
14eb0 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
14ec0 69 74 2e 20 20 4f 72 20 6d 61 79 62 65 20 74 68  it.  Or maybe th
14ed0 65 20 62 74 72 65 65 20 77 61 73 0a 2a 2a 20 72  e btree was.** r
14ee0 65 62 61 6c 61 6e 63 65 64 2e 20 20 57 68 61 74  ebalanced.  What
14ef0 65 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20  ever the cause, 
14f00 74 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20 22  try to restore "
14f10 70 22 20 74 6f 20 74 68 65 20 70 6c 61 63 65 20  p" to the place 
14f20 69 74 0a 2a 2a 20 69 73 20 73 75 70 70 6f 73 65  it.** is suppose
14f30 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67  d to be pointing
14f40 2e 20 20 49 66 20 74 68 65 20 72 6f 77 20 77 61  .  If the row wa
14f50 73 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  s deleted out fr
14f60 6f 6d 20 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20  om under the.** 
14f70 63 75 72 73 6f 72 2c 20 73 65 74 20 74 68 65 20  cursor, set the 
14f80 63 75 72 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20  cursor to point 
14f90 74 6f 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  to a NULL row..*
14fa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
14fb0 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e  ITE_NOINLINE han
14fc0 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28 56  dleMovedCursor(V
14fd0 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
14fe0 20 69 6e 74 20 69 73 44 69 66 66 65 72 65 6e 74   int isDifferent
14ff0 52 6f 77 2c 20 72 63 3b 0a 20 20 61 73 73 65 72  Row, rc;.  asser
15000 74 28 20 70 2d 3e 70 43 75 72 73 6f 72 21 3d 30  t( p->pCursor!=0
15010 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
15020 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15030 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
15040 73 6f 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 73  sor) );.  rc = s
15050 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
15060 72 52 65 73 74 6f 72 65 28 70 2d 3e 70 43 75 72  rRestore(p->pCur
15070 73 6f 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e  sor, &isDifferen
15080 74 52 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68  tRow);.  p->cach
15090 65 53 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f  eStatus = CACHE_
150a0 53 54 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44  STALE;.  if( isD
150b0 69 66 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d  ifferentRow ) p-
150c0 3e 6e 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20  >nullRow = 1;.  
150d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
150e0 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73  .** Check to ens
150f0 75 72 65 20 74 68 61 74 20 74 68 65 20 63 75 72  ure that the cur
15100 73 6f 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52  sor is valid.  R
15110 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
15120 72 0a 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e  r.** if need be.
15130 20 20 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f    Return any I/O
15140 20 65 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20   error from the 
15150 72 65 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f  restore operatio
15160 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
15170 33 56 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f  3VdbeCursorResto
15180 72 65 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70  re(VdbeCursor *p
15190 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
151a0 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f  BtreeCursorHasMo
151b0 76 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 29 20  ved(p->pCursor) 
151c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68 61  ){.    return ha
151d0 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72 28  ndleMovedCursor(
151e0 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
151f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15200 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 74  *.** Make sure t
15210 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20 72  he cursor p is r
15220 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72 20  eady to read or 
15230 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74 6f  write the row to
15240 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61 73   which it.** was
15250 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65 64   last positioned
15260 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
15270 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f 4f  or code if an OO
15280 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20 65  M fault or I/O e
15290 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74 73  rror.** prevents
152a0 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f   us from positio
152b0 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
152c0 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20 70  to its correct p
152d0 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  osition..**.** I
152e0 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72 61  f a MoveTo opera
152f0 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67 20  tion is pending 
15300 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75 72  on the given cur
15310 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68 61  sor, then do tha
15320 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77 2e  t.** MoveTo now.
15330 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73 20    If no move is 
15340 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20 74  pending, check t
15350 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f 77  o see if the row
15360 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65 6c   has been.** del
15370 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e  eted out from un
15380 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20 61  der the cursor a
15390 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d 61  nd if it has, ma
153a0 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a 2a  rk the row as.**
153b0 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a 0a   a NULL row..**.
153c0 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  ** If the cursor
153d0 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e   is already poin
153e0 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72 72  ting to the corr
153f0 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61 74  ect row and that
15400 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74 20   row has.** not 
15410 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75 74  been deleted out
15420 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 20   from under the 
15430 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68 69  cursor, then thi
15440 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
15450 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
15460 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d 6f  ite3VdbeCursorMo
15470 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
15480 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 65  *p){.  if( p->de
15490 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a  ferredMoveto ){.
154a0 20 20 20 20 72 65 74 75 72 6e 20 68 61 6e 64 6c      return handl
154b0 65 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28  eDeferredMoveto(
154c0 70 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  p);.  }.  if( p-
154d0 3e 70 43 75 72 73 6f 72 20 26 26 20 73 71 6c 69  >pCursor && sqli
154e0 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48 61  te3BtreeCursorHa
154f0 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72 73 6f  sMoved(p->pCurso
15500 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  r) ){.    return
15510 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73   handleMovedCurs
15520 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  or(p);.  }.  ret
15530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
15540 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
15550 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 3a  owing functions:
15560 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  .**.** sqlite3Vd
15570 62 65 53 65 72 69 61 6c 54 79 70 65 28 29 0a 2a  beSerialType().*
15580 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
15590 69 61 6c 54 79 70 65 4c 65 6e 28 29 0a 2a 2a 20  ialTypeLen().** 
155a0 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
155b0 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69 74 65  lLen().** sqlite
155c0 33 56 64 62 65 53 65 72 69 61 6c 50 75 74 28 29  3VdbeSerialPut()
155d0 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
155e0 65 72 69 61 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a  erialGet().**.**
155f0 20 65 6e 63 61 70 73 75 6c 61 74 65 20 74 68 65   encapsulate the
15600 20 63 6f 64 65 20 74 68 61 74 20 73 65 72 69 61   code that seria
15610 6c 69 7a 65 73 20 76 61 6c 75 65 73 20 66 6f 72  lizes values for
15620 20 73 74 6f 72 61 67 65 20 69 6e 20 53 51 4c 69   storage in SQLi
15630 74 65 0a 2a 2a 20 64 61 74 61 20 61 6e 64 20 69  te.** data and i
15640 6e 64 65 78 20 72 65 63 6f 72 64 73 2e 20 45 61  ndex records. Ea
15650 63 68 20 73 65 72 69 61 6c 69 7a 65 64 20 76 61  ch serialized va
15660 6c 75 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  lue consists of 
15670 61 0a 2a 2a 20 27 73 65 72 69 61 6c 2d 74 79 70  a.** 'serial-typ
15680 65 27 20 61 6e 64 20 61 20 62 6c 6f 62 20 6f 66  e' and a blob of
15690 20 64 61 74 61 2e 20 54 68 65 20 73 65 72 69 61   data. The seria
156a0 6c 20 74 79 70 65 20 69 73 20 61 6e 20 38 2d 62  l type is an 8-b
156b0 79 74 65 20 75 6e 73 69 67 6e 65 64 0a 2a 2a 20  yte unsigned.** 
156c0 69 6e 74 65 67 65 72 2c 20 73 74 6f 72 65 64 20  integer, stored 
156d0 61 73 20 61 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a  as a varint..**.
156e0 2a 2a 20 49 6e 20 61 6e 20 53 51 4c 69 74 65 20  ** In an SQLite 
156f0 69 6e 64 65 78 20 72 65 63 6f 72 64 2c 20 74 68  index record, th
15700 65 20 73 65 72 69 61 6c 20 74 79 70 65 20 69 73  e serial type is
15710 20 73 74 6f 72 65 64 20 64 69 72 65 63 74 6c 79   stored directly
15720 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 62   before.** the b
15730 6c 6f 62 20 6f 66 20 64 61 74 61 20 74 68 61 74  lob of data that
15740 20 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20   it corresponds 
15750 74 6f 2e 20 49 6e 20 61 20 74 61 62 6c 65 20 72  to. In a table r
15760 65 63 6f 72 64 2c 20 61 6c 6c 20 73 65 72 69 61  ecord, all seria
15770 6c 0a 2a 2a 20 74 79 70 65 73 20 61 72 65 20 73  l.** types are s
15780 74 6f 72 65 64 20 61 74 20 74 68 65 20 73 74 61  tored at the sta
15790 72 74 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  rt of the record
157a0 2c 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 73 20  , and the blobs 
157b0 6f 66 20 64 61 74 61 20 61 74 0a 2a 2a 20 74 68  of data at.** th
157c0 65 20 65 6e 64 2e 20 48 65 6e 63 65 20 74 68 65  e end. Hence the
157d0 73 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6c 6c  se functions all
157e0 6f 77 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  ow the caller to
157f0 20 68 61 6e 64 6c 65 20 74 68 65 0a 2a 2a 20 73   handle the.** s
15800 65 72 69 61 6c 2d 74 79 70 65 20 61 6e 64 20 64  erial-type and d
15810 61 74 61 20 62 6c 6f 62 20 73 65 70 61 72 61 74  ata blob separat
15820 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ely..**.** The f
15830 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
15840 65 73 63 72 69 62 65 73 20 74 68 65 20 76 61 72  escribes the var
15850 69 6f 75 73 20 73 74 6f 72 61 67 65 20 63 6c 61  ious storage cla
15860 73 73 65 73 20 66 6f 72 20 64 61 74 61 3a 0a 2a  sses for data:.*
15870 2a 0a 2a 2a 20 20 20 73 65 72 69 61 6c 20 74 79  *.**   serial ty
15880 70 65 20 20 20 20 20 20 20 20 62 79 74 65 73 20  pe        bytes 
15890 6f 66 20 64 61 74 61 20 20 20 20 20 20 74 79 70  of data      typ
158a0 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
158b0 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
158c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d  ---------    ---
158d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
158e0 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
158f0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
15900 20 20 20 20 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20          NULL.** 
15910 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
15920 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
15930 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
15940 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 32  nteger.**      2
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
15970 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
15980 0a 2a 2a 20 20 20 20 20 20 33 20 20 20 20 20 20  .**      3      
15990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 33                 3
159a0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
159b0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
159c0 20 20 20 34 20 20 20 20 20 20 20 20 20 20 20 20     4            
159d0 20 20 20 20 20 20 20 20 20 34 20 20 20 20 20 20           4      
159e0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
159f0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 35 20 20  eger.**      5  
15a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a10 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
15a20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
15a30 2a 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20  *      6        
15a40 20 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20               8  
15a50 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
15a60 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
15a70 20 37 20 20 20 20 20 20 20 20 20 20 20 20 20 20   7              
15a80 20 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20         8        
15a90 20 20 20 20 49 45 45 45 20 66 6c 6f 61 74 0a 2a      IEEE float.*
15aa0 2a 20 20 20 20 20 20 38 20 20 20 20 20 20 20 20  *      8        
15ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
15ac0 20 20 20 20 20 20 20 20 20 20 49 6e 74 65 67 65            Intege
15ad0 72 20 63 6f 6e 73 74 61 6e 74 20 30 0a 2a 2a 20  r constant 0.** 
15ae0 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20 20       9          
15af0 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20             0    
15b00 20 20 20 20 20 20 20 20 49 6e 74 65 67 65 72 20          Integer 
15b10 63 6f 6e 73 74 61 6e 74 20 31 0a 2a 2a 20 20 20  constant 1.**   
15b20 20 20 31 30 2c 31 31 20 20 20 20 20 20 20 20 20    10,11         
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 66        reserved f
15b50 6f 72 20 65 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20  or expansion.** 
15b60 20 20 20 4e 3e 3d 31 32 20 61 6e 64 20 65 76 65     N>=12 and eve
15b70 6e 20 20 20 20 20 20 20 28 4e 2d 31 32 29 2f 32  n       (N-12)/2
15b80 20 20 20 20 20 20 20 20 42 4c 4f 42 0a 2a 2a 20          BLOB.** 
15b90 20 20 20 4e 3e 3d 31 33 20 61 6e 64 20 6f 64 64     N>=13 and odd
15ba0 20 20 20 20 20 20 20 20 28 4e 2d 31 33 29 2f 32          (N-13)/2
15bb0 20 20 20 20 20 20 20 20 74 65 78 74 0a 2a 2a 0a          text.**.
15bc0 2a 2a 20 54 68 65 20 38 20 61 6e 64 20 39 20 74  ** The 8 and 9 t
15bd0 79 70 65 73 20 77 65 72 65 20 61 64 64 65 64 20  ypes were added 
15be0 69 6e 20 33 2e 33 2e 30 2c 20 66 69 6c 65 20 66  in 3.3.0, file f
15bf0 6f 72 6d 61 74 20 34 2e 20 20 50 72 69 6f 72 20  ormat 4.  Prior 
15c00 76 65 72 73 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53  versions.** of S
15c10 51 4c 69 74 65 20 77 69 6c 6c 20 6e 6f 74 20 75  QLite will not u
15c20 6e 64 65 72 73 74 61 6e 64 20 74 68 6f 73 65 20  nderstand those 
15c30 73 65 72 69 61 6c 20 74 79 70 65 73 2e 0a 2a 2f  serial types..*/
15c40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
15c50 68 65 20 73 65 72 69 61 6c 2d 74 79 70 65 20 66  he serial-type f
15c60 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
15c70 72 65 64 20 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a  red in pMem..*/.
15c80 75 33 32 20 73 71 6c 69 74 65 33 56 64 62 65 53  u32 sqlite3VdbeS
15c90 65 72 69 61 6c 54 79 70 65 28 4d 65 6d 20 2a 70  erialType(Mem *p
15ca0 4d 65 6d 2c 20 69 6e 74 20 66 69 6c 65 5f 66 6f  Mem, int file_fo
15cb0 72 6d 61 74 29 7b 0a 20 20 69 6e 74 20 66 6c 61  rmat){.  int fla
15cc0 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
15cd0 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 69 66  ;.  u32 n;..  if
15ce0 28 20 66 6c 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c  ( flags&MEM_Null
15cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
15d00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
15d10 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20  s&MEM_Int ){.   
15d20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77   /* Figure out w
15d30 68 65 74 68 65 72 20 74 6f 20 75 73 65 20 31 2c  hether to use 1,
15d40 20 32 2c 20 34 2c 20 36 20 6f 72 20 38 20 62 79   2, 4, 6 or 8 by
15d50 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64 65 66 69  tes. */.#   defi
15d60 6e 65 20 4d 41 58 5f 36 42 59 54 45 20 28 28 28  ne MAX_6BYTE (((
15d70 28 69 36 34 29 30 78 30 30 30 30 38 30 30 30 29  (i64)0x00008000)
15d80 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20 69 36 34  <<32)-1).    i64
15d90 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a   i = pMem->u.i;.
15da0 20 20 20 20 75 36 34 20 75 3b 0a 20 20 20 20 69      u64 u;.    i
15db0 66 28 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  f( i<0 ){.      
15dc0 69 66 28 20 69 3c 28 2d 4d 41 58 5f 36 42 59 54  if( i<(-MAX_6BYT
15dd0 45 29 20 29 20 72 65 74 75 72 6e 20 36 3b 0a 20  E) ) return 6;. 
15de0 20 20 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73       /* Previous
15df0 20 74 65 73 74 20 70 72 65 76 65 6e 74 73 3a 20   test prevents: 
15e00 20 75 20 3d 20 2d 28 2d 39 32 32 33 33 37 32 30   u = -(-92233720
15e10 33 36 38 35 34 37 37 35 38 30 38 29 20 2a 2f 0a  36854775808) */.
15e20 20 20 20 20 20 20 75 20 3d 20 2d 69 3b 0a 20 20        u = -i;.  
15e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
15e40 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = i;.    }.    
15e50 69 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20  if( u<=127 ){.  
15e60 20 20 20 20 72 65 74 75 72 6e 20 28 28 69 26 31      return ((i&1
15e70 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72  )==i && file_for
15e80 6d 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32  mat>=4) ? 8+(u32
15e90 29 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20  )u : 1;.    }.  
15ea0 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29    if( u<=32767 )
15eb0 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69   return 2;.    i
15ec0 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20  f( u<=8388607 ) 
15ed0 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66  return 3;.    if
15ee0 28 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20  ( u<=2147483647 
15ef0 29 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20  ) return 4;.    
15f00 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45  if( u<=MAX_6BYTE
15f10 20 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20   ) return 5;.   
15f20 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
15f30 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
15f40 65 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  eal ){.    retur
15f50 6e 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  n 7;.  }.  asser
15f60 74 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c  t( pMem->db->mal
15f70 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61  locFailed || fla
15f80 67 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f  gs&(MEM_Str|MEM_
15f90 42 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72  Blob) );.  asser
15fa0 74 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b  t( pMem->n>=0 );
15fb0 0a 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d  .  n = (u32)pMem
15fc0 2d 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73  ->n;.  if( flags
15fd0 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20   & MEM_Zero ){. 
15fe0 20 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e     n += pMem->u.
15ff0 6e 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74  nZero;.  }.  ret
16000 75 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20  urn ((n*2) + 12 
16010 2b 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74  + ((flags&MEM_St
16020 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r)!=0));.}../*.*
16030 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
16040 67 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20  gth of the data 
16050 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
16060 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65   the supplied se
16070 72 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33  rial-type..*/.u3
16080 32 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  2 sqlite3VdbeSer
16090 69 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73  ialTypeLen(u32 s
160a0 65 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69  erial_type){.  i
160b0 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
160c0 31 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  12 ){.    return
160d0 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32   (serial_type-12
160e0 29 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  )/2;.  }else{.  
160f0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
16100 38 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c  8 aSize[] = { 0,
16110 20 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20   1, 2, 3, 4, 6, 
16120 38 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30  8, 8, 0, 0, 0, 0
16130 20 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   };.    return a
16140 53 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65  Size[serial_type
16150 5d 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ];.  }.}../*.** 
16160 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
16170 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
16180 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
16190 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
161a0 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
161b0 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
161c0 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
161d0 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
161e0 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
161f0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
16200 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
16210 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
16220 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
16230 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
16240 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
16250 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
16260 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
16270 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
16280 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
16290 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
162a0 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
162b0 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
162c0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
162d0 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
162e0 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
162f0 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
16300 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
16310 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
16320 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
16330 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
16340 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
16350 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
16360 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
16370 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
16380 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
16390 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
163a0 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
163b0 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
163c0 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
163d0 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
163e0 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
163f0 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
16400 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
16410 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
16420 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
16430 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
16440 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
16450 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
16460 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
16470 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
16480 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
16490 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
164a0 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
164b0 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
164c0 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
164d0 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
164e0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
164f0 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
16500 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
16510 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
16520 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
16530 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
16540 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
16550 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
16560 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
16570 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
16580 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
16590 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
165a0 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
165b0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
165c0 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
165d0 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
165e0 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
165f0 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
16600 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
16610 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
16620 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
16630 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
16640 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
16650 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
16660 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
16670 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
16680 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
16690 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
166a0 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
166b0 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
166c0 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
166d0 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
166e0 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
166f0 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
16700 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
16710 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
16720 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
16730 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
16740 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
16750 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
16760 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
16770 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
16780 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
16790 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
167a0 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
167b0 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
167c0 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
167d0 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
167e0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
167f0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
16800 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
16810 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
16820 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
16830 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
16840 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
16850 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
16860 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
16870 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
16880 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
16890 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
168a0 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
168b0 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
168c0 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
168d0 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
168e0 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
168f0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
16900 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
16910 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
16920 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
16930 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
16940 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
16950 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
16960 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
16970 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
16980 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
16990 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
169a0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
169b0 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
169c0 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
169d0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
169e0 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
169f0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
16a00 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
16a10 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
16a20 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
16a30 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
16a40 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
16a50 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
16a60 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
16a70 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
16a80 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
16a90 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
16aa0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
16ab0 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
16ac0 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
16ad0 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
16ae0 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
16af0 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
16b00 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
16b10 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
16b20 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
16b30 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
16b40 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
16b50 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
16b60 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
16b70 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
16b80 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
16b90 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
16ba0 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
16bb0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16bc0 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
16bd0 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
16be0 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
16bf0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
16c00 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
16c10 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
16c20 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
16c30 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
16c40 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
16c50 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
16c60 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
16c70 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
16c80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
16c90 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
16ca0 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
16cb0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  = sqlite3VdbeSer
16cc0 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61  ialTypeLen(seria
16cd0 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73  l_type);.    ass
16ce0 65 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20  ert( i>0 );.    
16cf0 64 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d  do{.      buf[--
16d00 69 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46  i] = (u8)(v&0xFF
16d10 29 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38  );.      v >>= 8
16d20 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20  ;.    }while( i 
16d30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
16d40 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72  n;.  }..  /* Str
16d50 69 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20  ing or blob */. 
16d60 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16d70 3e 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65  >=12 ){.    asse
16d80 72 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28  rt( pMem->n + ((
16d90 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
16da0 4d 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e  M_Zero)?pMem->u.
16db0 6e 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20  nZero:0).       
16dc0 20 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71        == (int)sq
16dd0 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
16de0 79 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  ypeLen(serial_ty
16df0 70 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d  pe) );.    len =
16e00 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65   pMem->n;.    me
16e10 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e  mcpy(buf, pMem->
16e20 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74  z, len);.    ret
16e30 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20  urn len;.  }..  
16e40 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74  /* NULL or const
16e50 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20  ants 0 or 1 */. 
16e60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
16e70 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20   Input "x" is a 
16e80 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69  sequence of unsi
16e90 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20  gned characters 
16ea0 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61  that represent a
16eb0 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  .** big-endian i
16ec0 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20  nteger.  Return 
16ed0 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e  the equivalent n
16ee0 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f  ative integer.*/
16ef0 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54  .#define ONE_BYT
16f00 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38  E_INT(x)    ((i8
16f10 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65  )(x)[0]).#define
16f20 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29   TWO_BYTE_INT(x)
16f30 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78      (256*(i8)((x
16f40 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64  )[0])|(x)[1]).#d
16f50 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45  efine THREE_BYTE
16f60 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a  _INT(x)  (65536*
16f70 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78  (i8)((x)[0])|((x
16f80 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29  )[1]<<8)|(x)[2])
16f90 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
16fa0 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75  TE_UINT(x)  (((u
16fb0 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28  32)(x)[0]<<24)|(
16fc0 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
16fd0 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
16fe0 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
16ff0 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32  E_INT(x) (167772
17000 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  16*(i8)((x)[0])|
17010 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
17020 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
17030 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c  ../*.** Deserial
17040 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f  ize the data blo
17050 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  b pointed to by 
17060 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79  buf as serial ty
17070 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a  pe serial_type.*
17080 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  * and store the 
17090 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20  result in pMem. 
170a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
170b0 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64  er of bytes read
170c0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
170d0 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65  ction is impleme
170e0 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61  nted as two sepa
170f0 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f  rate routines fo
17100 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a  r performance..*
17110 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20  * The few cases 
17120 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63  that require loc
17130 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  al variables are
17140 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f   broken out into
17150 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72   a separate.** r
17160 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69  outine so that i
17170 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65  n most cases the
17180 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76   overhead of mov
17190 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f  ing the stack po
171a0 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69  inter.** is avoi
171b0 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20  ded..*/ .static 
171c0 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c  u32 SQLITE_NOINL
171d0 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20  INE serialGet(. 
171e0 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
171f0 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f  char *buf,     /
17200 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65  * Buffer to dese
17210 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a  rialize from */.
17220 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
17230 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17240 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74  /* Serial type t
17250 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f  o deserialize */
17260 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20  .  Mem *pMem    
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20   /* Memory cell 
17290 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69  to write value i
172a0 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20  nto */.){.  u64 
172b0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
172c0 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79  NT(buf);.  u32 y
172d0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
172e0 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20  T(buf+4);.  x = 
172f0 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69  (x<<32) + y;.  i
17300 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
17310 36 20 29 7b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  6 ){.    pMem->u
17320 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a  .i = *(i64*)&x;.
17330 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17340 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 74  = MEM_Int;.    t
17350 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
17360 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  .i<0 );.  }else{
17370 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44  .#if !defined(ND
17380 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65  EBUG) && !define
17390 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
173a0 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20  OATING_POINT).  
173b0 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74    /* Verify that
173c0 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c   integers and fl
173d0 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
173e0 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65  ues use the same
173f0 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64  .    ** byte ord
17400 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66  er.  Or, that if
17410 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e   SQLITE_MIXED_EN
17420 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54  DIAN_64BIT_FLOAT
17430 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e   is.    ** defin
17440 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66  ed that 64-bit f
17450 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
17460 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20  lues really are 
17470 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64  mixed.    ** end
17480 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ian..    */.    
17490 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34  static const u64
174a0 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66   t1 = ((u64)0x3f
174b0 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20  f00000)<<32;.   
174c0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f   static const do
174d0 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20  uble r1 = 1.0;. 
174e0 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a     u64 t2 = t1;.
174f0 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
17500 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20  ianFloat(t2);.  
17510 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
17520 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29  (r1)==sizeof(t2)
17530 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20   && memcmp(&r1, 
17540 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29  &t2, sizeof(r1))
17550 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ==0 );.#endif.  
17560 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
17570 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66  (x)==8 && sizeof
17580 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29  (pMem->u.r)==8 )
17590 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45  ;.    swapMixedE
175a0 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20  ndianFloat(x);. 
175b0 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d     memcpy(&pMem-
175c0 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66  >u.r, &x, sizeof
175d0 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  (x));.    pMem->
175e0 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49  flags = sqlite3I
175f0 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20  sNaN(pMem->u.r) 
17600 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d  ? MEM_Null : MEM
17610 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74  _Real;.  }.  ret
17620 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c  urn 8;.}.u32 sql
17630 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
17640 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67  t(.  const unsig
17650 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20  ned char *buf,  
17660 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20     /* Buffer to 
17670 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d  deserialize from
17680 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c   */.  u32 serial
17690 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  _type,          
176a0 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79      /* Serial ty
176b0 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  pe to deserializ
176c0 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
176d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176e0 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63       /* Memory c
176f0 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c  ell to write val
17700 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20  ue into */.){.  
17710 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74  switch( serial_t
17720 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ype ){.    case 
17730 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65  10:   /* Reserve
17740 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65  d for future use
17750 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a   */.    case 11:
17760 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66     /* Reserved f
17770 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f  or future use */
17780 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20  .    case 0: {  
17790 2f 2a 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 20  /* NULL */.     
177a0 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
177b0 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 62  EM_Null;.      b
177c0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
177d0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
177e0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
177f0 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
17800 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45  ->u.i = ONE_BYTE
17810 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
17820 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
17830 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
17840 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
17850 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
17860 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
17870 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
17880 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
17890 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ger */.      pMe
178a0 6d 2d 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54  m->u.i = TWO_BYT
178b0 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
178c0 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
178d0 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
178e0 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
178f0 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
17900 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20  turn 2;.    }.  
17910 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
17920 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
17930 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d  eger */.      pM
17940 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f  em->u.i = THREE_
17950 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20  BYTE_INT(buf);. 
17960 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
17970 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
17980 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
17990 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
179a0 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d   return 3;.    }
179b0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f  .    case 4: { /
179c0 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 4-byte signed 
179d0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
179e0 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
179f0 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  R_BYTE_INT(buf);
17a00 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17a10 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17a20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17a30 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17a40 20 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20     return 4;.   
17a50 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
17a60 20 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65   /* 6-byte signe
17a70 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17a80 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
17a90 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75  OUR_BYTE_UINT(bu
17aa0 66 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  f+2) + (((i64)1)
17ab0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
17ac0 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
17ad0 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17ae0 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
17af0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17b00 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
17b10 6e 20 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 6;.    }.    c
17b20 61 73 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79  ase 6:   /* 8-by
17b30 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17b40 72 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a  r */.    case 7:
17b50 20 7b 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74   { /* IEEE float
17b60 69 6e 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20  ing point */.   
17b70 20 20 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20     /* These use 
17b80 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c  local variables,
17b90 20 73 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61   so do them in a
17ba0 20 73 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e   separate routin
17bb0 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76  e.      ** to av
17bc0 6f 69 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f  oid having to mo
17bd0 76 65 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69  ve the frame poi
17be0 6e 74 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d  nter in the comm
17bf0 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20  on case */.     
17c00 20 72 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65   return serialGe
17c10 74 28 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70  t(buf,serial_typ
17c20 65 2c 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20  e,pMem);.    }. 
17c30 20 20 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a     case 8:    /*
17c40 20 49 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20   Integer 0 */.  
17c50 20 20 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20    case 9: {  /* 
17c60 49 6e 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20  Integer 1 */.   
17c70 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73     pMem->u.i = s
17c80 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a 20 20  erial_type-8;.  
17c90 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
17ca0 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
17cb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
17cc0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
17cd0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
17ce0 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
17cf0 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
17d00 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
17d10 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
17d20 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
17d30 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
17d40 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
17d50 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
17d60 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
17d70 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
17d80 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
17d90 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
17da0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
17db0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
17dc0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
17dd0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
17de0 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
17df0 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
17e00 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
17e10 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
17e20 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
17e30 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
17e40 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
17e50 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
17e60 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
17e70 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
17e80 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
17e90 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
17ea0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
17eb0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
17ec0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
17ed0 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
17ee0 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
17ef0 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
17f00 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
17f10 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
17f20 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
17f30 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
17f40 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
17f50 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
17f60 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
17f70 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
17f80 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
17f90 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
17fa0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
17fb0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
17fc0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
17fd0 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
17fe0 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
17ff0 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
18000 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
18010 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
18020 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
18030 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
18040 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
18050 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
18060 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
18070 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
18080 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
18090 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
180a0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
180b0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
180c0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
180d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
180e0 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
180f0 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
18100 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
18110 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18120 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18130 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
18140 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
18150 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
18160 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
18170 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
18180 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
18190 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
181a0 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
181b0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
181c0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
181d0 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
181e0 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
181f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
18200 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
18210 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
18220 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
18230 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18240 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18250 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
18260 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
18270 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
18280 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
18290 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
182a0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
182b0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
182c0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
182d0 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
182e0 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
182f0 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
18300 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
18310 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
18320 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
18330 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
18340 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
18350 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
18360 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
18370 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
18380 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
18390 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
183a0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
183b0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
183c0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
183d0 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
183e0 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
183f0 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
18400 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
18410 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
18420 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
18430 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
18440 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
18450 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
18460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
18470 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
18480 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
18490 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
184a0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
184b0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
184c0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
184d0 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
184e0 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
184f0 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
18500 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
18510 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
18520 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
18530 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
18540 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
18550 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
18560 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
18570 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
18580 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
18590 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
185a0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
185b0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
185c0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
185d0 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
185e0 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
185f0 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
18600 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
18610 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
18620 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
18630 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
18640 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
18650 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
18660 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
18670 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
18680 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
18690 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
186a0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
186b0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
186c0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
186d0 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
186e0 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
186f0 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
18700 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
18710 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
18720 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
18730 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
18740 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
18750 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
18760 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
18770 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
18780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
18790 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
187a0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
187b0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
187c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
187d0 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
187e0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
187f0 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
18800 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
18810 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
18820 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
18830 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
18840 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
18850 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
18860 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
18870 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
18880 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
18890 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
188a0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
188b0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
188c0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
188d0 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
188e0 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
188f0 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
18900 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
18910 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
18920 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
18930 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
18940 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
18950 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
18960 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
18970 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
18980 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
18990 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
189a0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
189b0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
189c0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
189d0 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
189e0 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
189f0 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73  break;.  }.  ass
18a00 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
18a10 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
18a20 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
18a30 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
18a40 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
18a50 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
18a60 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
18a70 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
18a80 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
18a90 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
18aa0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
18ab0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
18ac0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
18ad0 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
18ae0 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
18af0 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
18b00 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
18b10 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
18b20 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18b30 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
18b40 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
18b50 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
18b60 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
18b70 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
18b80 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
18b90 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
18ba0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18bb0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
18bc0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
18bd0 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
18be0 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
18bf0 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
18c00 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
18c10 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
18c20 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
18c30 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
18c40 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
18c50 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
18c60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
18c70 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
18c80 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
18c90 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
18ca0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
18cb0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
18cc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
18cd0 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
18ce0 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
18cf0 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
18d00 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
18d10 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
18d20 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
18d30 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
18d40 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
18d50 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
18d60 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
18d70 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
18d80 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
18d90 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
18da0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
18db0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
18dc0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
18dd0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
18de0 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
18df0 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
18e00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
18e10 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
18e20 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
18e30 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
18e40 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
18e50 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
18e60 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
18e70 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
18e80 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
18e90 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
18ea0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
18eb0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
18ec0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
18ed0 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
18ee0 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
18ef0 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
18f00 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
18f10 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
18f20 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
18f30 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
18f40 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
18f50 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
18f60 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
18f70 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
18f80 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
18f90 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
18fa0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
18fb0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
18fc0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
18fd0 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
18fe0 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
18ff0 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
19000 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
19010 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
19020 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
19030 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
19040 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
19050 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
19060 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
19070 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
19080 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
19090 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
190a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
190b0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
190c0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
190d0 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
190e0 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
190f0 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
19100 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
19110 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
19120 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
19130 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
19140 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
19150 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
19160 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
19170 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
19180 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
19190 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
191a0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
191b0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
191c0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
191d0 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
191e0 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
191f0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
19200 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
19210 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
19220 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
19230 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
19240 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
19250 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
19260 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
19270 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
19280 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
19290 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
192a0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
192b0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
192c0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
192d0 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
192e0 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
192f0 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
19300 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
19310 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
19320 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
19330 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
19340 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
19350 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
19360 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
19370 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
19380 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
19390 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
193a0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
193b0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
193c0 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
193d0 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
193e0 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
193f0 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
19400 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
19410 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
19420 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
19430 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
19440 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19450 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
19460 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
19470 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
19480 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
19490 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
194a0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
194b0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
194c0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
194d0 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
194e0 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
194f0 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
19500 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19510 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
19520 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
19530 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
19540 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
19550 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
19560 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
19570 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
19580 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
19590 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
195a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
195b0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
195c0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
195d0 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
195e0 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
195f0 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
19600 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
19610 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19620 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
19630 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
19640 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
19650 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
19660 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
19670 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
19680 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
19690 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
196a0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
196b0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
196c0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
196d0 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
196e0 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
196f0 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
19700 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
19710 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
19720 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
19730 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
19740 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
19750 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
19760 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19770 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
19780 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
19790 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
197a0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
197b0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
197c0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
197d0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
197e0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
197f0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
19800 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
19810 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
19820 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
19830 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
19840 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
19850 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
19860 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
19870 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
19880 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
19890 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
198a0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
198b0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
198c0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
198d0 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
198e0 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
198f0 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
19900 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
19910 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19920 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
19930 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
19940 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20  dif../*.** Both 
19950 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70 4d 65 6d  *pMem1 and *pMem
19960 32 20 63 6f 6e 74 61 69 6e 20 73 74 72 69 6e 67  2 contain string
19970 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70 61 72 65   values. Compare
19980 20 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 0a   the two values.
19990 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  ** using the col
199a0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
199b0 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75 61 6c 2c  pColl. As usual,
199c0 20 72 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69   return a negati
199d0 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20  ve , zero.** or 
199e0 70 6f 73 69 74 69 76 65 20 76 61 6c 75 65 20 69  positive value i
199f0 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c 65 73 73  f *pMem1 is less
19a00 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 20   than, equal to 
19a10 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
19a20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72 65 73 70  .** *pMem2, resp
19a30 65 63 74 69 76 65 6c 79 2e 20 53 69 6d 69 6c 61  ectively. Simila
19a40 72 20 69 6e 20 73 70 69 72 69 74 20 74 6f 20 22  r in spirit to "
19a50 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29 20 2d 20  rc = (*pMem1) - 
19a60 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73  (*pMem2);"..*/.s
19a70 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f  tatic int vdbeCo
19a80 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
19a90 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
19aa0 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20  m1,.  const Mem 
19ab0 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e 73 74 20  *pMem2,.  const 
19ac0 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a  CollSeq *pColl,.
19ad0 20 20 75 38 20 2a 70 72 63 45 72 72 20 20 20 20    u8 *prcErr    
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 6f    /* If an OOM o
19b00 63 63 75 72 73 2c 20 73 65 74 20 74 6f 20 53 51  ccurs, set to SQ
19b10 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b  LITE_NOMEM */.){
19b20 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e 65 6e  .  if( pMem1->en
19b30 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
19b40 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 74 72 69  .    /* The stri
19b50 6e 67 73 20 61 72 65 20 61 6c 72 65 61 64 79 20  ngs are already 
19b60 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74 20 65  in the correct e
19b70 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c 6c 20 74  ncoding.  Call t
19b80 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f 6d 70 61  he.     ** compa
19b90 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 64  rison function d
19ba0 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20 20 20 72  irectly */.    r
19bb0 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d  eturn pColl->xCm
19bc0 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70  p(pColl->pUser,p
19bd0 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a  Mem1->n,pMem1->z
19be0 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d  ,pMem2->n,pMem2-
19bf0 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >z);.  }else{.  
19c00 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 63 6f    int rc;.    co
19c10 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c 20 2a 76  nst void *v1, *v
19c20 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31 2c 20 6e  2;.    int n1, n
19c30 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31 3b 0a 20  2;.    Mem c1;. 
19c40 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20 20 20 73     Mem c2;.    s
19c50 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69  qlite3VdbeMemIni
19c60 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d 3e 64 62  t(&c1, pMem1->db
19c70 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20  , MEM_Null);.   
19c80 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 49   sqlite3VdbeMemI
19c90 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d 31 2d 3e  nit(&c2, pMem1->
19ca0 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20  db, MEM_Null);. 
19cb0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
19cc0 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 31  mShallowCopy(&c1
19cd0 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f 45 70 68  , pMem1, MEM_Eph
19ce0 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  em);.    sqlite3
19cf0 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f  VdbeMemShallowCo
19d00 70 79 28 26 63 32 2c 20 70 4d 65 6d 32 2c 20 4d  py(&c2, pMem2, M
19d10 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20 20 76  EM_Ephem);.    v
19d20 31 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  1 = sqlite3Value
19d30 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61  Text((sqlite3_va
19d40 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f 6c 6c 2d  lue*)&c1, pColl-
19d50 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31 20 3d 20  >enc);.    n1 = 
19d60 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63 31 2e 6e  v1==0 ? 0 : c1.n
19d70 3b 0a 20 20 20 20 76 32 20 3d 20 73 71 6c 69 74  ;.    v2 = sqlit
19d80 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71 6c  e3ValueText((sql
19d90 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 32 2c  ite3_value*)&c2,
19da0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20   pColl->enc);.  
19db0 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20 3f 20 30    n2 = v2==0 ? 0
19dc0 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20 72 63 20   : c2.n;.    rc 
19dd0 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  = pColl->xCmp(pC
19de0 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e 31 2c 20  oll->pUser, n1, 
19df0 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a 20 20 20  v1, n2, v2);.   
19e00 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
19e10 65 6c 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20  elease(&c1);.   
19e20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
19e30 65 6c 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20  elease(&c2);.   
19e40 20 69 66 28 20 28 76 31 3d 3d 30 20 7c 7c 20 76   if( (v1==0 || v
19e50 32 3d 3d 30 29 20 26 26 20 70 72 63 45 72 72 20  2==0) && prcErr 
19e60 29 20 2a 70 72 63 45 72 72 20 3d 20 53 51 4c 49  ) *prcErr = SQLI
19e70 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 72 65  TE_NOMEM;.    re
19e80 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
19e90 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
19ea0 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e  o blobs.  Return
19eb0 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c   negative, zero,
19ec0 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
19ed0 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20  the first.** is 
19ee0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
19ef0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
19f00 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c  than the second,
19f10 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a   respectively..*
19f20 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73  * If one blob is
19f30 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68 65   a prefix of the
19f40 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65   other, then the
19f50 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65 20   shorter is the 
19f60 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  lessor..*/.stati
19f70 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  c SQLITE_NOINLIN
19f80 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f  E int sqlite3Blo
19f90 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d  bCompare(const M
19fa0 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d  em *pB1, const M
19fb0 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20  em *pB2){.  int 
19fc0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
19fd0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 70 42 31 2d 3e  z, pB2->z, pB1->
19fe0 6e 3e 70 42 32 2d 3e 6e 20 3f 20 70 42 32 2d 3e  n>pB2->n ? pB2->
19ff0 6e 20 3a 20 70 42 31 2d 3e 6e 29 3b 0a 20 20 69  n : pB1->n);.  i
1a000 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1a010 0a 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 6e  .  return pB1->n
1a020 20 2d 20 70 42 32 2d 3e 6e 3b 0a 7d 0a 0a 0a 2f   - pB2->n;.}.../
1a030 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68 65  *.** Compare the
1a040 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e 65   values containe
1a050 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65 6d  d by the two mem
1a060 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75 72  ory cells, retur
1a070 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76 65  ning.** negative
1a080 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74 69  , zero or positi
1a090 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20 6c  ve if pMem1 is l
1a0a0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1a0b0 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a 2a  to, or greater.*
1a0c0 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53 6f  * than pMem2. So
1a0d0 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20 4e  rting order is N
1a0e0 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f 6c  ULL's first, fol
1a0f0 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72 73  lowed by numbers
1a100 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 6e   (integers.** an
1a110 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64 20  d reals) sorted 
1a120 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f 6c  numerically, fol
1a130 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f 72  lowed by text or
1a140 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f 6c  dered by the col
1a150 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
1a160 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69 6e  ce pColl and fin
1a170 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64 65  ally blob's orde
1a180 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29 2e  red by memcmp().
1a190 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c 20  .**.** Two NULL 
1a1a0 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69  values are consi
1a1b0 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20 74  dered equal by t
1a1c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
1a1d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d 43  .int sqlite3MemC
1a1e0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1a1f0 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20 4d   *pMem1, const M
1a200 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73 74  em *pMem2, const
1a210 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 29   CollSeq *pColl)
1a220 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b 0a  {.  int f1, f2;.
1a230 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f 66    int combined_f
1a240 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70 4d  lags;..  f1 = pM
1a250 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66 32  em1->flags;.  f2
1a260 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73 3b   = pMem2->flags;
1a270 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  .  combined_flag
1a280 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73 73  s = f1|f2;.  ass
1a290 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f 66  ert( (combined_f
1a2a0 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65  lags & MEM_RowSe
1a2b0 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a 20  t)==0 );. .  /* 
1a2c0 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73 20  If one value is 
1a2d0 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73 73  NULL, it is less
1a2e0 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72 2e   than the other.
1a2f0 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73 0a   If both values.
1a300 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20 72    ** are NULL, r
1a310 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20 20  eturn 0..  */.  
1a320 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1a330 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20  gs&MEM_Null ){. 
1a340 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d 45     return (f2&ME
1a350 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d 45  M_Null) - (f1&ME
1a360 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20 20  M_Null);.  }..  
1a370 2f 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20  /* If one value 
1a380 69 73 20 61 20 6e 75 6d 62 65 72 20 61 6e 64 20  is a number and 
1a390 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
1a3a0 2c 20 74 68 65 20 6e 75 6d 62 65 72 20 69 73 20  , the number is 
1a3b0 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20 62 6f  less..  ** If bo
1a3c0 74 68 20 61 72 65 20 6e 75 6d 62 65 72 73 2c 20  th are numbers, 
1a3d0 63 6f 6d 70 61 72 65 20 61 73 20 72 65 61 6c 73  compare as reals
1a3e0 20 69 66 20 6f 6e 65 20 69 73 20 61 20 72 65 61   if one is a rea
1a3f0 6c 2c 20 6f 72 20 61 73 20 69 6e 74 65 67 65 72  l, or as integer
1a400 73 0a 20 20 2a 2a 20 69 66 20 62 6f 74 68 20 76  s.  ** if both v
1a410 61 6c 75 65 73 20 61 72 65 20 69 6e 74 65 67 65  alues are intege
1a420 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  rs..  */.  if( c
1a430 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 28 4d  ombined_flags&(M
1a440 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65 61 6c 29  EM_Int|MEM_Real)
1a450 20 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72   ){.    double r
1a460 31 2c 20 72 32 3b 0a 20 20 20 20 69 66 28 20 28  1, r2;.    if( (
1a470 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1a480 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1a490 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1a4a0 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1a4b0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1a4c0 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1a4d0 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1a4e0 72 6e 20 31 3b 0a 20 20 20 20 20 20 72 65 74 75  rn 1;.      retu
1a4f0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1a500 69 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c  if( (f1&MEM_Real
1a510 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
1a520 20 3d 20 70 4d 65 6d 31 2d 3e 75 2e 72 3b 0a 20   = pMem1->u.r;. 
1a530 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 66 31     }else if( (f1
1a540 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1a550 20 20 20 20 20 20 72 31 20 3d 20 28 64 6f 75 62        r1 = (doub
1a560 6c 65 29 70 4d 65 6d 31 2d 3e 75 2e 69 3b 0a 20  le)pMem1->u.i;. 
1a570 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a580 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
1a590 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1a5a0 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  Real)!=0 ){.    
1a5b0 20 20 72 32 20 3d 20 70 4d 65 6d 32 2d 3e 75 2e    r2 = pMem2->u.
1a5c0 72 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  r;.    }else if(
1a5d0 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1a5e0 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 28   ){.      r2 = (
1a5f0 64 6f 75 62 6c 65 29 70 4d 65 6d 32 2d 3e 75 2e  double)pMem2->u.
1a600 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
1a610 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 31 3c     }.    if( r1<
1a630 72 32 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  r2 ) return -1;.
1a640 20 20 20 20 69 66 28 20 72 31 3e 72 32 20 29 20      if( r1>r2 ) 
1a650 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65  return 1;.    re
1a660 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
1a670 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1a680 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1a690 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1a6a0 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1a6b0 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1a6c0 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1a6d0 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1a6e0 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1a6f0 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1a700 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1a710 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1a720 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1a730 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1a740 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1a750 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1a760 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1a770 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1a780 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1a790 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1a7a0 65 6d 32 2d 3e 65 6e 63 20 29 3b 0a 20 20 20 20  em2->enc );.    
1a7b0 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d 3e 65  assert( pMem1->e
1a7c0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20  nc==SQLITE_UTF8 
1a7d0 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
1a7e0 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1a7f0 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 70 4d  TE_UTF16LE || pM
1a800 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45  em1->enc==SQLITE
1a810 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a 20 20 20  _UTF16BE );..   
1a820 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f   /* The collatio
1a830 6e 20 73 65 71 75 65 6e 63 65 20 6d 75 73 74 20  n sequence must 
1a840 62 65 20 64 65 66 69 6e 65 64 20 61 74 20 74 68  be defined at th
1a850 69 73 20 70 6f 69 6e 74 2c 20 65 76 65 6e 20 69  is point, even i
1a860 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 75 73 65  f.    ** the use
1a870 72 20 64 65 6c 65 74 65 73 20 74 68 65 20 63 6f  r deletes the co
1a880 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1a890 20 61 66 74 65 72 20 74 68 65 20 76 64 62 65 20   after the vdbe 
1a8a0 70 72 6f 67 72 61 6d 20 69 73 0a 20 20 20 20 2a  program is.    *
1a8b0 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74 68 69 73  * compiled (this
1a8c0 20 77 61 73 20 6e 6f 74 20 61 6c 77 61 79 73 20   was not always 
1a8d0 74 68 65 20 63 61 73 65 29 2e 0a 20 20 20 20 2a  the case)..    *
1a8e0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  /.    assert( !p
1a8f0 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c 2d 3e 78  Coll || pColl->x
1a900 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  Cmp );..    if( 
1a910 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72  pColl ){.      r
1a920 65 74 75 72 6e 20 76 64 62 65 43 6f 6d 70 61 72  eturn vdbeCompar
1a930 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d 65 6d 31  eMemString(pMem1
1a940 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c 6c 2c 20  , pMem2, pColl, 
1a950 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  0);.    }.    /*
1a960 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74   If a NULL point
1a970 65 72 20 77 61 73 20 70 61 73 73 65 64 20 61 73  er was passed as
1a980 20 74 68 65 20 63 6f 6c 6c 61 74 65 20 66 75 6e   the collate fun
1a990 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74 68 72 6f  ction, fall thro
1a9a0 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  ugh.    ** to th
1a9b0 65 20 62 6c 6f 62 20 63 61 73 65 20 61 6e 64 20  e blob case and 
1a9c0 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a  use memcmp().  *
1a9d0 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 42 6f 74  /.  }. .  /* Bot
1a9e0 68 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65  h values must be
1a9f0 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70 61 72 65   blobs.  Compare
1aa00 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70 28 29 2e   using memcmp().
1aa10 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 71    */.  return sq
1aa20 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1aa30 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 29 3b 0a  (pMem1, pMem2);.
1aa40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  }.../*.** The fi
1aa50 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73  rst argument pas
1aa60 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63  sed to this func
1aa70 74 69 6f 6e 20 69 73 20 61 20 73 65 72 69 61 6c  tion is a serial
1aa80 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a 20 63 6f  -type that.** co
1aa90 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 61 6e 20  rresponds to an 
1aaa0 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c 20 76 61  integer - all va
1aab0 6c 75 65 73 20 62 65 74 77 65 65 6e 20 31 20 61  lues between 1 a
1aac0 6e 64 20 39 20 69 6e 63 6c 75 73 69 76 65 20 0a  nd 9 inclusive .
1aad0 2a 2a 20 65 78 63 65 70 74 20 37 2e 20 54 68 65  ** except 7. The
1aae0 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74 73 20 74   second points t
1aaf0 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
1ab00 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65 67 65 72  ining an integer
1ab10 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72 69 61 6c   value.** serial
1ab20 69 7a 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  ized according t
1ab30 6f 20 73 65 72 69 61 6c 5f 74 79 70 65 2e 20 54  o serial_type. T
1ab40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73  his function des
1ab50 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20 61 6e 64  erializes.** and
1ab60 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1ab70 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36  ue..*/.static i6
1ab80 34 20 76 64 62 65 52 65 63 6f 72 64 44 65 63 6f  4 vdbeRecordDeco
1ab90 64 65 49 6e 74 28 75 33 32 20 73 65 72 69 61 6c  deInt(u32 serial
1aba0 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20 75 38 20  _type, const u8 
1abb0 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32 20 79 3b  *aKey){.  u32 y;
1abc0 0a 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55  .  assert( CORRU
1abd0 50 54 5f 44 42 20 7c 7c 20 28 73 65 72 69 61 6c  PT_DB || (serial
1abe0 5f 74 79 70 65 3e 3d 31 20 26 26 20 73 65 72 69  _type>=1 && seri
1abf0 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26 20 73 65  al_type<=9 && se
1ac00 72 69 61 6c 5f 74 79 70 65 21 3d 37 29 20 29 3b  rial_type!=7) );
1ac10 0a 20 20 73 77 69 74 63 68 28 20 73 65 72 69 61  .  switch( seria
1ac20 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61  l_type ){.    ca
1ac30 73 65 20 30 3a 0a 20 20 20 20 63 61 73 65 20 31  se 0:.    case 1
1ac40 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1ac50 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1ac60 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 4f  ;.      return O
1ac70 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  NE_BYTE_INT(aKey
1ac80 29 3b 0a 20 20 20 20 63 61 73 65 20 32 3a 0a 20  );.    case 2:. 
1ac90 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1aca0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1acb0 20 20 20 20 20 72 65 74 75 72 6e 20 54 57 4f 5f       return TWO_
1acc0 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a  BYTE_INT(aKey);.
1acd0 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20 20      case 3:.    
1ace0 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65 79    testcase( aKey
1acf0 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20  [0]&0x80 );.    
1ad00 20 20 72 65 74 75 72 6e 20 54 48 52 45 45 5f 42    return THREE_B
1ad10 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1ad20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20 20 20     case 4: {.   
1ad30 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1ad40 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1ad50 20 20 20 79 20 3d 20 46 4f 55 52 5f 42 59 54 45     y = FOUR_BYTE
1ad60 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  _UINT(aKey);.   
1ad70 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a     return (i64)*
1ad80 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20 7d 0a  (int*)&y;.    }.
1ad90 20 20 20 20 63 61 73 65 20 35 3a 20 7b 0a 20 20      case 5: {.  
1ada0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b      testcase( aK
1adb0 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20  ey[0]&0x80 );.  
1adc0 20 20 20 20 72 65 74 75 72 6e 20 46 4f 55 52 5f      return FOUR_
1add0 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32  BYTE_UINT(aKey+2
1ade0 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33  ) + (((i64)1)<<3
1adf0 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28  2)*TWO_BYTE_INT(
1ae00 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20  aKey);.    }.   
1ae10 20 63 61 73 65 20 36 3a 20 7b 0a 20 20 20 20 20   case 6: {.     
1ae20 20 75 36 34 20 78 20 3d 20 46 4f 55 52 5f 42 59   u64 x = FOUR_BY
1ae30 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a 20  TE_UINT(aKey);. 
1ae40 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1ae50 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1ae60 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32 29       x = (x<<32)
1ae70 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   | FOUR_BYTE_UIN
1ae80 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20 20  T(aKey+4);.     
1ae90 20 72 65 74 75 72 6e 20 28 69 36 34 29 2a 28 69   return (i64)*(i
1aea0 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d 0a 20 20  64*)&x;.    }.  
1aeb0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 73 65 72  }..  return (ser
1aec0 69 61 6c 5f 74 79 70 65 20 2d 20 38 29 3b 0a 7d  ial_type - 8);.}
1aed0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
1aee0 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73 20 74  ction compares t
1aef0 68 65 20 74 77 6f 20 74 61 62 6c 65 20 72 6f 77  he two table row
1af00 73 20 6f 72 20 69 6e 64 65 78 20 72 65 63 6f 72  s or index recor
1af10 64 73 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  ds.** specified 
1af20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  by {nKey1, pKey1
1af30 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e 20 20 49  } and pPKey2.  I
1af40 74 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61  t returns a nega
1af50 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a 20 6f 72  tive, zero.** or
1af60 20 70 6f 73 69 74 69 76 65 20 69 6e 74 65 67 65   positive intege
1af70 72 20 69 66 20 6b 65 79 31 20 69 73 20 6c 65 73  r if key1 is les
1af80 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
1af90 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74 65 72 20   or .** greater 
1afa0 74 68 61 6e 20 6b 65 79 32 2e 20 20 54 68 65 20  than key2.  The 
1afb0 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 6b  {nKey1, pKey1} k
1afc0 65 79 20 6d 75 73 74 20 62 65 20 61 20 62 6c 6f  ey must be a blo
1afd0 62 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20  b.** created by 
1afe0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1aff0 64 20 6f 70 63 6f 64 65 20 6f 66 20 74 68 65 20  d opcode of the 
1b000 56 44 42 45 2e 20 20 54 68 65 20 70 50 4b 65 79  VDBE.  The pPKey
1b010 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74 20 62 65  2.** key must be
1b020 20 61 20 70 61 72 73 65 64 20 6b 65 79 20 73 75   a parsed key su
1b030 63 68 20 61 73 20 6f 62 74 61 69 6e 65 64 20 66  ch as obtained f
1b040 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  rom.** sqlite3Vd
1b050 62 65 50 61 72 73 65 52 65 63 6f 72 64 2e 0a 2a  beParseRecord..*
1b060 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  *.** If argument
1b070 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65   bSkip is non-ze
1b080 72 6f 2c 20 69 74 20 69 73 20 61 73 73 75 6d 65  ro, it is assume
1b090 64 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  d that the calle
1b0a0 72 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  r has already.**
1b0b0 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61 74   determined that
1b0c0 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1b0d0 73 20 6f 66 20 74 68 65 20 6b 65 79 73 20 61 72  s of the keys ar
1b0e0 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b  e equal..**.** K
1b0f0 65 79 31 20 61 6e 64 20 4b 65 79 32 20 64 6f 20  ey1 and Key2 do 
1b100 6e 6f 74 20 68 61 76 65 20 74 6f 20 63 6f 6e 74  not have to cont
1b110 61 69 6e 20 74 68 65 20 73 61 6d 65 20 6e 75 6d  ain the same num
1b120 62 65 72 20 6f 66 20 66 69 65 6c 64 73 2e 20 49  ber of fields. I
1b130 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65 6c 64 73  f all .** fields
1b140 20 74 68 61 74 20 61 70 70 65 61 72 20 69 6e 20   that appear in 
1b150 62 6f 74 68 20 6b 65 79 73 20 61 72 65 20 65 71  both keys are eq
1b160 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b 65 79 32  ual, then pPKey2
1b170 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 73 20  ->default_rc is 
1b180 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  .** returned..**
1b190 0a 2a 2a 20 49 66 20 64 61 74 61 62 61 73 65 20  .** If database 
1b1a0 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64 69  corruption is di
1b1b0 73 63 6f 76 65 72 65 64 2c 20 73 65 74 20 70 50  scovered, set pP
1b1c0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 74 6f  Key2->errCode to
1b1d0 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52   .** SQLITE_CORR
1b1e0 55 50 54 20 61 6e 64 20 72 65 74 75 72 6e 20 30  UPT and return 0
1b1f0 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f  . If an OOM erro
1b200 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
1b210 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d 3e 65 72  , .** pPKey2->er
1b220 72 43 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  rCode is set to 
1b230 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 61 6e 64  SQLITE_NOMEM and
1b240 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 4e  , if it is not N
1b250 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d 61 6c 6c  ULL, the.** mall
1b260 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 73  oc-failed flag s
1b270 65 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  et on database h
1b280 61 6e 64 6c 65 20 28 70 50 4b 65 79 32 2d 3e 70  andle (pPKey2->p
1b290 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e 0a 2a 2f  KeyInfo->db)..*/
1b2a0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1b2b0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1b2c0 68 53 6b 69 70 28 0a 20 20 69 6e 74 20 6e 4b 65  hSkip(.  int nKe
1b2d0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
1b2e0 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74  pKey1,   /* Left
1b2f0 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1b300 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1b310 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67  ,         /* Rig
1b320 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  ht key */.  int 
1b330 62 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 20  bSkip           
1b340 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
1b350 66 20 74 72 75 65 2c 20 73 6b 69 70 20 74 68 65  f true, skip the
1b360 20 66 69 72 73 74 20 66 69 65 6c 64 20 2a 2f 0a   first field */.
1b370 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20 20 20  ){.  u32 d1;    
1b380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b390 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b3a0 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b3b0 78 74 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20  xt data element 
1b3c0 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
1b3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b3e0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
1b3f0 20 6e 65 78 74 20 66 69 65 6c 64 20 74 6f 20 63   next field to c
1b400 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75 33 32 20  ompare */.  u32 
1b410 73 7a 48 64 72 31 3b 20 20 20 20 20 20 20 20 20  szHdr1;         
1b420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1b430 69 7a 65 20 6f 66 20 72 65 63 6f 72 64 20 68 65  ize of record he
1b440 61 64 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ader in bytes */
1b450 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
1b460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b470 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
1b480 66 69 72 73 74 20 74 79 70 65 20 69 6e 20 68 65  first type in he
1b490 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ader */.  int rc
1b4a0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b4b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
1b4c0 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a 20 20 4d  urn value */.  M
1b4d0 65 6d 20 2a 70 52 68 73 20 3d 20 70 50 4b 65 79  em *pRhs = pPKey
1b4e0 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20 20 20 2f  2->aMem;       /
1b4f0 2a 20 4e 65 78 74 20 66 69 65 6c 64 20 6f 66 20  * Next field of 
1b500 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d 70 61 72  pPKey2 to compar
1b510 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66 6f 20 2a  e */.  KeyInfo *
1b520 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79  pKeyInfo = pPKey
1b530 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 63  2->pKeyInfo;.  c
1b540 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b550 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1b560 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b570 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d 65 6d 20   *)pKey1;.  Mem 
1b580 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 62  mem1;..  /* If b
1b590 53 6b 69 70 20 69 73 20 74 72 75 65 2c 20 74 68  Skip is true, th
1b5a0 65 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61  en the caller ha
1b5b0 73 20 61 6c 72 65 61 64 79 20 64 65 74 65 72 6d  s already determ
1b5c0 69 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69  ined that the fi
1b5d0 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20 65 6c 65  rst.  ** two ele
1b5e0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6b 65 79  ments in the key
1b5f0 73 20 61 72 65 20 65 71 75 61 6c 2e 20 46 69 78  s are equal. Fix
1b600 20 74 68 65 20 76 61 72 69 6f 75 73 20 73 74 61   the various sta
1b610 63 6b 20 76 61 72 69 61 62 6c 65 73 20 73 6f 0a  ck variables so.
1b620 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 72    ** that this r
1b630 6f 75 74 69 6e 65 20 62 65 67 69 6e 73 20 63 6f  outine begins co
1b640 6d 70 61 72 69 6e 67 20 61 74 20 74 68 65 20 73  mparing at the s
1b650 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20 2a 2f 0a  econd field. */.
1b660 20 20 69 66 28 20 62 53 6b 69 70 20 29 7b 0a 20    if( bSkip ){. 
1b670 20 20 20 75 33 32 20 73 31 3b 0a 20 20 20 20 69     u32 s1;.    i
1b680 64 78 31 20 3d 20 31 20 2b 20 67 65 74 56 61 72  dx1 = 1 + getVar
1b690 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c  int32(&aKey1[1],
1b6a0 20 73 31 29 3b 0a 20 20 20 20 73 7a 48 64 72 31   s1);.    szHdr1
1b6b0 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 20 20 20   = aKey1[0];.   
1b6c0 20 64 31 20 3d 20 73 7a 48 64 72 31 20 2b 20 73   d1 = szHdr1 + s
1b6d0 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
1b6e0 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a 20 20 20  TypeLen(s1);.   
1b6f0 20 69 20 3d 20 31 3b 0a 20 20 20 20 70 52 68 73   i = 1;.    pRhs
1b700 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ++;.  }else{.   
1b710 20 69 64 78 31 20 3d 20 67 65 74 56 61 72 69 6e   idx1 = getVarin
1b720 74 33 32 28 61 4b 65 79 31 2c 20 73 7a 48 64 72  t32(aKey1, szHdr
1b730 31 29 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a 48  1);.    d1 = szH
1b740 64 72 31 3b 0a 20 20 20 20 69 66 28 20 64 31 3e  dr1;.    if( d1>
1b750 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1b760 29 7b 20 0a 20 20 20 20 20 20 70 50 4b 65 79 32  ){ .      pPKey2
1b770 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1b780 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1b790 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1b7a0 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72 75 70 74  n 0;  /* Corrupt
1b7b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ion */.    }.   
1b7c0 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 56   i = 0;.  }..  V
1b7d0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1b7e0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1b7f0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1b800 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1b810 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nts */.  assert(
1b820 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b830 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b 65 79 32  o->nField+pPKey2
1b840 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  ->pKeyInfo->nXFi
1b850 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
1b860 65 6c 64 20 0a 20 20 20 20 20 20 20 7c 7c 20 43  eld .       || C
1b870 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 61  ORRUPT_DB );.  a
1b880 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1b890 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
1b8a0 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
1b8b0 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1b8c0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e 30 20 29  Info->nField>0 )
1b8d0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 31  ;.  assert( idx1
1b8e0 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43 4f 52 52  <=szHdr1 || CORR
1b8f0 55 50 54 5f 44 42 20 29 3b 0a 20 20 64 6f 7b 0a  UPT_DB );.  do{.
1b900 20 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74      u32 serial_t
1b910 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20 52 48 53  ype;..    /* RHS
1b920 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a   is an integer *
1b930 2f 0a 20 20 20 20 69 66 28 20 70 52 68 73 2d 3e  /.    if( pRhs->
1b940 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 20  flags & MEM_Int 
1b950 29 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  ){.      serial_
1b960 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1b970 31 5d 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  1];.      testca
1b980 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  se( serial_type=
1b990 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28  =12 );.      if(
1b9a0 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32   serial_type>=12
1b9b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1b9c0 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1b9d0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1b9e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1b9f0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1ba00 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1ba10 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20  ype==7 ){.      
1ba20 20 20 64 6f 75 62 6c 65 20 72 68 73 20 3d 20 28    double rhs = (
1ba30 64 6f 75 62 6c 65 29 70 52 68 73 2d 3e 75 2e 69  double)pRhs->u.i
1ba40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1ba50 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26  3VdbeSerialGet(&
1ba60 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61  aKey1[d1], seria
1ba70 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a  l_type, &mem1);.
1ba80 20 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31          if( mem1
1ba90 2e 75 2e 72 3c 72 68 73 20 29 7b 0a 20 20 20 20  .u.r<rhs ){.    
1baa0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1bab0 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1bac0 20 6d 65 6d 31 2e 75 2e 72 3e 72 68 73 20 29 7b   mem1.u.r>rhs ){
1bad0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1bae0 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  +1;.        }.  
1baf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1bb00 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1bb10 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1bb20 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1bb30 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1bb40 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1bb50 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1bb60 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1bb70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1bb80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1bb90 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1bba0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1bbb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bbc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1bbd0 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1bbe0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1bbf0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1bc00 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1bc10 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1bc20 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1bc30 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1bc40 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  12 ){.        rc
1bc50 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1bc60 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  se if( serial_ty
1bc70 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  pe==0 ){.       
1bc80 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1bc90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 64  }else{.        d
1bca0 6f 75 62 6c 65 20 72 68 73 20 3d 20 70 52 68 73  ouble rhs = pRhs
1bcb0 2d 3e 75 2e 72 3b 0a 20 20 20 20 20 20 20 20 64  ->u.r;.        d
1bcc0 6f 75 62 6c 65 20 6c 68 73 3b 0a 20 20 20 20 20  ouble lhs;.     
1bcd0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
1bce0 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64  rialGet(&aKey1[d
1bcf0 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  1], serial_type,
1bd00 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20   &mem1);.       
1bd10 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1bd20 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==7 ){.         
1bd30 20 6c 68 73 20 3d 20 6d 65 6d 31 2e 75 2e 72 3b   lhs = mem1.u.r;
1bd40 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1bd50 20 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20            lhs = 
1bd60 28 64 6f 75 62 6c 65 29 6d 65 6d 31 2e 75 2e 69  (double)mem1.u.i
1bd70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1bd80 20 20 20 20 69 66 28 20 6c 68 73 3c 72 68 73 20      if( lhs<rhs 
1bd90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1bda0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 65  = -1;.        }e
1bdb0 6c 73 65 20 69 66 28 20 6c 68 73 3e 72 68 73 20  lse if( lhs>rhs 
1bdc0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1bdd0 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = +1;.        }.
1bde0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
1bdf0 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73     /* RHS is a s
1be00 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73  tring */.    els
1be10 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1be20 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20  s & MEM_Str ){. 
1be30 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32       getVarint32
1be40 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73  (&aKey1[idx1], s
1be50 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1be60 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72     testcase( ser
1be70 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a  ial_type==12 );.
1be80 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c        if( serial
1be90 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
1bea0 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1beb0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73     }else if( !(s
1bec0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1bed0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1bee0 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = +1;.      }el
1bef0 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31  se{.        mem1
1bf00 2e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70  .n = (serial_typ
1bf10 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20  e - 12) / 2;.   
1bf20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1bf30 64 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73  d1+mem1.n)==(uns
1bf40 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1bf50 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1bf60 20 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d   (d1+mem1.n+1)==
1bf70 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1bf80 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1bf90 64 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e  d1+mem1.n) > (un
1bfa0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a  signed)nKey1 ){.
1bfb0 20 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32            pPKey2
1bfc0 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1bfd0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1bfe0 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72  KPT;.          r
1bff0 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20  eturn 0;        
1c000 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75          /* Corru
1c010 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20  ption */.       
1c020 20 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49   }else if( pKeyI
1c030 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b  nfo->aColl[i] ){
1c040 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  .          mem1.
1c050 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1c060 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  enc;.          m
1c070 65 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66  em1.db = pKeyInf
1c080 6f 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20  o->db;.         
1c090 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45   mem1.flags = ME
1c0a0 4d 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20  M_Str;.         
1c0b0 20 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a   mem1.z = (char*
1c0c0 29 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20  )&aKey1[d1];.   
1c0d0 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65         rc = vdbe
1c0e0 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67  CompareMemString
1c0f0 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
1c100 26 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65  &mem1, pRhs, pKe
1c110 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c  yInfo->aColl[i],
1c120 20 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64   &pPKey2->errCod
1c130 65 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  e.          );. 
1c140 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c150 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70          int nCmp
1c160 20 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70   = MIN(mem1.n, p
1c170 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20  Rhs->n);.       
1c180 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26     rc = memcmp(&
1c190 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d  aKey1[d1], pRhs-
1c1a0 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20  >z, nCmp);.     
1c1b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29       if( rc==0 )
1c1c0 20 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70   rc = mem1.n - p
1c1d0 52 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20  Rhs->n; .       
1c1e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1c1f0 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1c200 61 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c  a blob */.    el
1c210 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1c220 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b  gs & MEM_Blob ){
1c230 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74  .      getVarint
1c240 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c  32(&aKey1[idx1],
1c250 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
1c260 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1c270 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1c280 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1c290 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73  al_type<12 || (s
1c2a0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
1c2b0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  1) ){.        rc
1c2c0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c   = -1;.      }el
1c2d0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  se{.        int 
1c2e0 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74  nStr = (serial_t
1c2f0 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20  ype - 12) / 2;. 
1c300 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1c310 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73   (d1+nStr)==(uns
1c320 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20  igned)nKey1 );. 
1c330 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
1c340 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75   (d1+nStr+1)==(u
1c350 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1c360 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1c370 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e  +nStr) > (unsign
1c380 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20  ed)nKey1 ){.    
1c390 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72        pPKey2->er
1c3a0 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49  rCode = (u8)SQLI
1c3b0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1c3c0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1c3d0 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  n 0;            
1c3e0 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f      /* Corruptio
1c3f0 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c  n */.        }el
1c400 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1c410 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74  t nCmp = MIN(nSt
1c420 72 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20  r, pRhs->n);.   
1c430 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63         rc = memc
1c440 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70  mp(&aKey1[d1], p
1c450 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20  Rhs->z, nCmp);. 
1c460 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
1c470 3d 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d  =0 ) rc = nStr -
1c480 20 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20   pRhs->n;.      
1c490 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c4a0 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1c4b0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   null */.    els
1c4c0 65 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f  e{.      serial_
1c4d0 74 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78  type = aKey1[idx
1c4e0 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  1];.      rc = (
1c4f0 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b  serial_type!=0);
1c500 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
1c510 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  rc!=0 ){.      i
1c520 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1c530 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1c540 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a        rc = -rc;.
1c550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
1c560 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64  sert( vdbeRecord
1c570 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65  CompareDebug(nKe
1c580 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1c590 32 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20  2, rc) );.      
1c5a0 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d  assert( mem1.szM
1c5b0 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20  alloc==0 );  /* 
1c5c0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f  See comment belo
1c5d0 77 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  w */.      retur
1c5e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
1c5f0 20 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b   i++;.    pRhs++
1c600 3b 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  ;.    d1 += sqli
1c610 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1c620 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1c630 29 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73  );.    idx1 += s
1c640 71 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28  qlite3VarintLen(
1c650 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1c660 7d 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e  }while( idx1<(un
1c670 73 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26  signed)szHdr1 &&
1c680 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c   i<pPKey2->nFiel
1c690 64 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e  d && d1<=(unsign
1c6a0 65 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f  ed)nKey1 );..  /
1c6b0 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  * No memory allo
1c6c0 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75  cation is ever u
1c6d0 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72  sed on mem1.  Pr
1c6e0 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20  ove this using. 
1c6f0 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   ** the followin
1c700 67 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20  g assert().  If 
1c710 74 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69  the assert() fai
1c720 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73  ls, it indicates
1c730 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c   a.  ** memory l
1c740 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74  eak and a need t
1c750 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64  o call sqlite3Vd
1c760 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65  beMemRelease(&me
1c770 6d 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  m1).  */.  asser
1c780 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63  t( mem1.szMalloc
1c790 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d  ==0 );..  /* rc=
1c7a0 3d 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68  =0 here means th
1c7b0 61 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f  at one or both o
1c7c0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
1c7d0 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
1c7e0 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
1c7f0 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
1c800 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
1c810 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
1c820 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
1c830 75 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  ue.  */.  assert
1c840 28 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20  ( CORRUPT_DB .  
1c850 20 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f       || vdbeReco
1c860 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e  rdCompareDebug(n
1c870 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
1c880 65 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66  ey2, pPKey2->def
1c890 61 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20  ault_rc) .      
1c8a0 20 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62   || pKeyInfo->db
1c8b0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20  ->mallocFailed. 
1c8c0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 4b   );.  return pPK
1c8d0 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b  ey2->default_rc;
1c8e0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  .}.int sqlite3Vd
1c8f0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c900 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
1c910 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
1c920 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a     /* Left key *
1c930 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1c940 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1c950 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
1c960 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20   */.){.  return 
1c970 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1c980 65 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c  eWithSkip(nKey1,
1c990 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
1c9a0 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  0);.}.../*.** Th
1c9b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
1c9c0 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73  n optimized vers
1c9d0 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64  ion of sqlite3Vd
1c9e0 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1c9f0 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74  ) .** that (a) t
1ca00 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f  he first field o
1ca10 66 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69  f pPKey2 is an i
1ca20 6e 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20  nteger, and (b) 
1ca30 74 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d  the .** size-of-
1ca40 68 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74  header varint at
1ca50 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70   the start of (p
1ca60 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73  Key1/nKey1) fits
1ca70 20 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20   in a single.** 
1ca80 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65  byte (i.e. is le
1ca90 73 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a  ss than 128)..**
1caa0 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e  .** To avoid con
1cab0 63 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66  cerns about buff
1cac0 65 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68  er overreads, th
1cad0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e  is routine is on
1cae0 6c 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63  ly used.** on sc
1caf0 68 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20  hemas where the 
1cb00 6d 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65  maximum valid he
1cb10 61 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20  ader size is 63 
1cb20 62 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a  bytes or less..*
1cb30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1cb40 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1cb50 74 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  t(.  int nKey1, 
1cb60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1cb70 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1cb80 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1cb90 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1cba0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1cbb0 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1cbc0 2a 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74  *aKey = &((const
1cbd0 20 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f   u8*)pKey1)[*(co
1cbe0 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20  nst u8*)pKey1 & 
1cbf0 30 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72  0x3F];.  int ser
1cc00 69 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e  ial_type = ((con
1cc10 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d  st u8*)pKey1)[1]
1cc20 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75  ;.  int res;.  u
1cc30 33 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20  32 y;.  u64 x;. 
1cc40 20 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d   i64 v = pPKey2-
1cc50 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
1cc60 69 36 34 20 6c 68 73 3b 0a 0a 20 20 61 73 73 65  i64 lhs;..  asse
1cc70 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65 79 31  rt( (*(u8*)pKey1
1cc80 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52 52 55  )<=0x3F || CORRU
1cc90 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69 74 63  PT_DB );.  switc
1cca0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1ccb0 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b 20  {.    case 1: { 
1ccc0 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 1-byte signed
1ccd0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1cce0 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59 54 45    lhs = ONE_BYTE
1ccf0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
1cd00 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1cd10 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1cd20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1cd30 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20   2: { /* 2-byte 
1cd40 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1cd50 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 57  /.      lhs = TW
1cd60 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1cd70 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1cd80 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20 20  ( lhs<0 );.     
1cd90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1cda0 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33    case 3: { /* 3
1cdb0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1cdc0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68  eger */.      lh
1cdd0 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45 5f 49  s = THREE_BYTE_I
1cde0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1cdf0 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1ce00 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1ce10 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
1ce20 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69  : { /* 4-byte si
1ce30 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1ce40 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1ce50 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1ce60 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69 36 34        lhs = (i64
1ce70 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20 20  )*(int*)&y;.    
1ce80 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
1ce90 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
1cea0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1ceb0 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65 20   5: { /* 6-byte 
1cec0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
1ced0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 46 4f  /.      lhs = FO
1cee0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1cef0 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1cf00 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1cf10 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1cf20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c 30 20  testcase( lhs<0 
1cf30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1cf40 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36      }.    case 6
1cf50 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20 73 69  : { /* 8-byte si
1cf60 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a  gned integer */.
1cf70 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52 5f 42        x = FOUR_B
1cf80 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1cf90 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c 33 32        x = (x<<32
1cfa0 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  ) | FOUR_BYTE_UI
1cfb0 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20 20 20  NT(aKey+4);.    
1cfc0 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a 29 26    lhs = *(i64*)&
1cfd0 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  x;.      testcas
1cfe0 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20 20  e( lhs<0 );.    
1cff0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1d000 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20 20 20     case 8: .    
1d010 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20 20 20    lhs = 0;.     
1d020 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1d030 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   9:.      lhs = 
1d040 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
1d050 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 73  .    /* This cas
1d060 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d 6f 76  e could be remov
1d070 65 64 20 77 69 74 68 6f 75 74 20 63 68 61 6e 67  ed without chang
1d080 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 20  ing the results 
1d090 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 2a  of running.    *
1d0a0 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49 6e 63  * this code. Inc
1d0b0 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73 65 73  luding it causes
1d0c0 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61 74 65   gcc to generate
1d0d0 20 61 20 66 61 73 74 65 72 20 73 77 69 74 63 68   a faster switch
1d0e0 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65   .    ** stateme
1d0f0 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20 72 61  nt (since the ra
1d100 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20 74 61  nge of switch ta
1d110 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72 74 73  rgets now starts
1d120 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20 20 20   at zero and.   
1d130 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75 6f 75   ** is contiguou
1d140 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f 74 20  s) but does not 
1d150 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c 69 63  cause any duplic
1d160 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65 20 67  ate code to be g
1d170 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a 2a 20  enerated.    ** 
1d180 28 61 73 20 67 63 63 20 69 73 20 63 6c 65 76 65  (as gcc is cleve
1d190 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6d 62  r enough to comb
1d1a0 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69 6b 65  ine the two like
1d1b0 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72 20 0a   cases). Other .
1d1c0 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 72 73      ** compilers
1d1d0 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69 6c 61   might be simila
1d1e0 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65  r.  */ .    case
1d1f0 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20 20 20   0: case 7:.    
1d200 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1d210 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1d220 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  e(nKey1, pKey1, 
1d230 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20 64 65  pPKey2);..    de
1d240 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
1d250 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52  urn sqlite3VdbeR
1d260 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65  ecordCompare(nKe
1d270 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1d280 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 76  2);.  }..  if( v
1d290 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  >lhs ){.    res 
1d2a0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1d2b0 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c 68 73 20  }else if( v<lhs 
1d2c0 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b  ){.    res = pPK
1d2d0 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65  ey2->r2;.  }else
1d2e0 20 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69   if( pPKey2->nFi
1d2f0 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  eld>1 ){.    /* 
1d300 54 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73  The first fields
1d310 20 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73   of the two keys
1d320 20 61 72 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70   are equal. Comp
1d330 61 72 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67  are the trailing
1d340 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e   .    ** fields.
1d350 20 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 76    */.    res = v
1d360 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d370 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1d380 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
1d390 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1d3a0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
1d3b0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
1d3c0 65 79 73 20 61 72 65 20 65 71 75 61 6c 20 61 6e  eys are equal an
1d3d0 64 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 74  d there are no t
1d3e0 72 61 69 6c 69 6e 67 0a 20 20 20 20 2a 2a 20 66  railing.    ** f
1d3f0 69 65 6c 64 73 2e 20 52 65 74 75 72 6e 20 70 50  ields. Return pP
1d400 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1d410 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 2a   in this case. *
1d420 2f 0a 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65  /.    res = pPKe
1d430 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a  y2->default_rc;.
1d440 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
1d450 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d460 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1d470 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
1d480 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73   );.  return res
1d490 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1d4a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f  function is an o
1d4b0 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e  ptimized version
1d4c0 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52   of sqlite3VdbeR
1d4d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a  ecordCompare() .
1d4e0 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20  ** that (a) the 
1d4f0 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70  first field of p
1d500 50 4b 65 79 32 20 69 73 20 61 20 73 74 72 69 6e  PKey2 is a strin
1d510 67 2c 20 74 68 61 74 20 28 62 29 20 74 68 65 20  g, that (b) the 
1d520 66 69 72 73 74 20 66 69 65 6c 64 0a 2a 2a 20 75  first field.** u
1d530 73 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ses the collatio
1d540 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
1d550 59 20 61 6e 64 20 28 63 29 20 74 68 61 74 20 74  Y and (c) that t
1d560 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65  he size-of-heade
1d570 72 20 76 61 72 69 6e 74 20 0a 2a 2a 20 61 74 20  r varint .** at 
1d580 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1d590 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1d5a0 69 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65  in a single byte
1d5b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d5c0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d5d0 65 53 74 72 69 6e 67 28 0a 20 20 69 6e 74 20 6e  eString(.  int n
1d5e0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1d5f0 20 2a 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74   *pKey1, /* Left
1d600 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1d610 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32  edRecord *pPKey2
1d620 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74          /* Right
1d630 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e   key */.){.  con
1d640 73 74 20 75 38 20 2a 61 4b 65 79 31 20 3d 20 28  st u8 *aKey1 = (
1d650 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 3b  const u8*)pKey1;
1d660 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f 74 79  .  int serial_ty
1d670 70 65 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a  pe;.  int res;..
1d680 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61    getVarint32(&a
1d690 4b 65 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f  Key1[1], serial_
1d6a0 74 79 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72  type);.  if( ser
1d6b0 69 61 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20  ial_type<12 ){. 
1d6c0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1d6d0 3e 72 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r1;      /* (pK
1d6e0 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
1d6f0 6e 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c  number or a null
1d700 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   */.  }else if( 
1d710 21 28 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20  !(serial_type & 
1d720 30 78 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65  0x01) ){ .    re
1d730 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20  s = pPKey2->r2; 
1d740 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e       /* (pKey1/n
1d750 4b 65 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20  Key1) is a blob 
1d760 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  */.  }else{.    
1d770 69 6e 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e  int nCmp;.    in
1d780 74 20 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20  t nStr;.    int 
1d790 73 7a 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d  szHdr = aKey1[0]
1d7a0 3b 0a 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73  ;..    nStr = (s
1d7b0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f  erial_type-12) /
1d7c0 20 32 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48   2;.    if( (szH
1d7d0 64 72 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65  dr + nStr) > nKe
1d7e0 79 31 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65  y1 ){.      pPKe
1d7f0 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75  y2->errCode = (u
1d800 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  8)SQLITE_CORRUPT
1d810 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74  _BKPT;.      ret
1d820 75 72 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72  urn 0;    /* Cor
1d830 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1d840 0a 20 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28  .    nCmp = MIN(
1d850 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
1d860 2e 6e 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20  .n, nStr );.    
1d870 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b  res = memcmp(&aK
1d880 65 79 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65  ey1[szHdr], pPKe
1d890 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e  y2->aMem[0].z, n
1d8a0 43 6d 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  Cmp);..    if( r
1d8b0 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  es==0 ){.      r
1d8c0 65 73 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65  es = nStr - pPKe
1d8d0 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20  y2->aMem[0].n;. 
1d8e0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
1d8f0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d900 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20  PKey2->nField>1 
1d910 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73  ){.          res
1d920 20 3d 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d   = vdbeRecordCom
1d930 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
1d940 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1d950 32 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  2, 1);.        }
1d960 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1d970 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1d980 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20 20 20  fault_rc;.      
1d990 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
1d9a0 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1d9b0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1d9c0 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d 65 6c  2->r2;.      }el
1d9d0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20  se{.        res 
1d9e0 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20  = pPKey2->r1;.  
1d9f0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20      }.    }else 
1da00 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20 20 20  if( res>0 ){.   
1da10 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
1da20 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >r2;.    }else{.
1da30 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
1da40 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a 20 20  y2->r1;.    }.  
1da50 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76 64 62  }..  assert( vdb
1da60 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1da70 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1da80 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29 0a 20  , pPKey2, res). 
1da90 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54        || CORRUPT
1daa0 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20 70 50  _DB.       || pP
1dab0 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1dac0 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
1dad0 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  .  );.  return r
1dae0 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  es;.}../*.** Ret
1daf0 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
1db00 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52   an sqlite3VdbeR
1db10 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 63  ecordCompare() c
1db20 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63 74 69  ompatible functi
1db30 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65 20 66  on.** suitable f
1db40 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73 65 72  or comparing ser
1db50 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64 73 20  ialized records 
1db60 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65 64 20  to the unpacked 
1db70 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a 2a 2a  record passed.**
1db80 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61 72 67   as the only arg
1db90 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f 72 64  ument..*/.Record
1dba0 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65 33 56  Compare sqlite3V
1dbb0 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65 28 55  dbeFindCompare(U
1dbc0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1dbd0 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74 52 65  ){.  /* varintRe
1dbe0 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29  cordCompareInt()
1dbf0 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63 6f 72   and varintRecor
1dc00 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1dc10 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20 20 2a   both assume.  *
1dc20 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 2d  * that the size-
1dc30 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e 74  of-header varint
1dc40 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
1dc50 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
1dc60 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 66 69  h record.  ** fi
1dc70 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20 62  ts in a single b
1dc80 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31 32 37  yte (i.e. is 127
1dc90 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72 69 6e   or less). varin
1dca0 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
1dcb0 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20 61 73  t().  ** also as
1dcc0 73 75 6d 65 73 20 74 68 61 74 20 69 74 20 69 73  sumes that it is
1dcd0 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72 65 61   safe to overrea
1dce0 64 20 61 20 62 75 66 66 65 72 20 62 79 20 61 74  d a buffer by at
1dcf0 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20 2a 2a   least the .  **
1dd00 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69 62 6c   maximum possibl
1dd10 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72 20 73  e legal header s
1dd20 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74 65 73  ize plus 8 bytes
1dd30 2e 20 42 65 63 61 75 73 65 20 74 68 65 72 65 20  . Because there 
1dd40 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e 74 65  is.  ** guarante
1dd50 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65 61 73  ed to be at leas
1dd60 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20 31 33  t 74 (but not 13
1dd70 36 29 20 62 79 74 65 73 20 6f 66 20 70 61 64 64  6) bytes of padd
1dd80 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 61  ing following ea
1dd90 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 70  ch.  ** buffer p
1dda0 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e 74 52  assed to varintR
1ddb0 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28  ecordCompareInt(
1ddc0 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69 74 20  ) this makes it 
1ddd0 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a 20 20  convenient to.  
1dde0 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73 69 7a  ** limit the siz
1ddf0 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20  e of the header 
1de00 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e 20 63  to 64 bytes in c
1de10 61 73 65 73 20 77 68 65 72 65 20 74 68 65 20 66  ases where the f
1de20 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a 2a 20  irst field.  ** 
1de30 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e 0a 20  is an integer.. 
1de40 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65 61 73   **.  ** The eas
1de50 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e 66 6f  iest way to enfo
1de60 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74 20 69  rce this limit i
1de70 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20 6f 6e  s to consider on
1de80 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74 68 0a  ly records with.
1de90 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73 20 6f    ** 13 fields o
1dea0 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65 20 66  r less. If the f
1deb0 69 72 73 74 20 66 69 65 6c 64 20 69 73 20 61 6e  irst field is an
1dec0 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20 6d 61   integer, the ma
1ded0 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20 2a 2a  ximum legal.  **
1dee0 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73 20   header size is 
1def0 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29 20 62  (12*5 + 1 + 1) b
1df00 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20  ytes.  */.  if( 
1df10 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  (p->pKeyInfo->nF
1df20 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79 49 6e  ield + p->pKeyIn
1df30 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d 31 33  fo->nXField)<=13
1df40 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67   ){.    int flag
1df50 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d 2e 66  s = p->aMem[0].f
1df60 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20 70 2d  lags;.    if( p-
1df70 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74  >pKeyInfo->aSort
1df80 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20 20 20  Order[0] ){.    
1df90 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20 20 20    p->r1 = 1;.   
1dfa0 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b 0a 20     p->r2 = -1;. 
1dfb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1dfc0 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20 20 20  p->r1 = -1;.    
1dfd0 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20 20 20    p->r2 = 1;.   
1dfe0 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67   }.    if( (flag
1dff0 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29 7b 0a  s & MEM_Int) ){.
1e000 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64 62        return vdb
1e010 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1e020 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 65 73  t;.    }.    tes
1e030 74 63 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d  tcase( flags & M
1e040 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20 20 74  EM_Real );.    t
1e050 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
1e060 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20 20 20   MEM_Null );.   
1e070 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
1e080 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b 0a 20   & MEM_Blob );. 
1e090 20 20 20 69 66 28 20 28 66 6c 61 67 73 20 26 20     if( (flags & 
1e0a0 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f 4e 75  (MEM_Real|MEM_Nu
1e0b0 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d 3d 30  ll|MEM_Blob))==0
1e0c0 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d   && p->pKeyInfo-
1e0d0 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29 7b 0a  >aColl[0]==0 ){.
1e0e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 66 6c        assert( fl
1e0f0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
1e100 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1e110 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53  beRecordCompareS
1e120 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20 20 7d  tring;.    }.  }
1e130 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
1e140 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1e150 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 43  are;.}../*.** pC
1e160 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  ur points at an 
1e170 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72 65 61  index entry crea
1e180 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 4f 50  ted using the OP
1e190 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f  _MakeRecord opco
1e1a0 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  de..** Read the 
1e1b0 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73 74 20  rowid (the last 
1e1c0 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72 65 63  field in the rec
1e1d0 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65 20 69  ord) and store i
1e1e0 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a 2a 20  t in *rowid..** 
1e1f0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1e200 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
1e210 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72 72 6f  orks, or an erro
1e220 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73 65  r code otherwise
1e230 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d 69 67  ..**.** pCur mig
1e240 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67 20 74  ht be pointing t
1e250 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65 64 20  o text obtained 
1e260 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74 20 64  from a corrupt d
1e270 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1e280 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e 74 20   So the content 
1e290 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
1e2a0 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72 69 61  d.  Do appropria
1e2b0 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74 68 65  te checks on the
1e2c0 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74   content..*/.int
1e2d0 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 52   sqlite3VdbeIdxR
1e2e0 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
1e2f0 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  , BtCursor *pCur
1e300 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b 0a 20  , i64 *rowid){. 
1e310 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20   i64 nCellKey = 
1e320 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
1e330 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20 20 20  32 szHdr;       
1e340 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1e350 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
1e360 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20 2f 2a  typeRowid;    /*
1e370 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f 66 20   Serial type of 
1e380 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 75  the rowid */.  u
1e390 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20 20 20  32 lenRowid;    
1e3a0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
1e3b0 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d 20 6d  rowid */.  Mem m
1e3c0 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  , v;..  /* Get t
1e3d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 69  he size of the i
1e3e0 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f 6e 6c  ndex entry.  Onl
1e3f0 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72 69 65  y indices entrie
1e400 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a 20 74  s of less.  ** t
1e410 68 61 6e 20 32 47 69 42 20 61 72 65 20 73 75 70  han 2GiB are sup
1e420 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e 67 20  port - anything 
1e430 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20 64 61  large must be da
1e440 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
1e450 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f 72 72  n..  ** Any corr
1e460 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74  uption is detect
1e470 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42 74 72  ed in sqlite3Btr
1e480 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29  eeParseCellPtr()
1e490 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20 20 2a  , though, so.  *
1e4a0 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61 6e 20  * this code can 
1e4b0 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20 74 68  safely assume th
1e4c0 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73 20 33  at nCellKey is 3
1e4d0 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a 20 20  2-bits  .  */.  
1e4e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
1e4f0 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c 69  treeCursorIsVali
1e500 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56 56 41  d(pCur) );.  VVA
1e510 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71 6c 69  _ONLY(rc =) sqli
1e520 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28  te3BtreeKeySize(
1e530 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65 79 29  pCur, &nCellKey)
1e540 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
1e550 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20 20 20  SQLITE_OK );    
1e560 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77 61   /* pCur is alwa
1e570 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79 53  ys valid so KeyS
1e580 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ize cannot fail 
1e590 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43  */.  assert( (nC
1e5a0 65 6c 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f  ellKey & SQLITE_
1e5b0 4d 41 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e  MAX_U32)==(u64)n
1e5c0 43 65 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a  CellKey );..  /*
1e5d0 20 52 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d   Read in the com
1e5e0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
1e5f0 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79   the index entry
1e600 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62   */.  sqlite3Vdb
1e610 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c  eMemInit(&m, db,
1e620 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   0);.  rc = sqli
1e630 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74  te3VdbeMemFromBt
1e640 72 65 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33  ree(pCur, 0, (u3
1e650 32 29 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26  2)nCellKey, 1, &
1e660 6d 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  m);.  if( rc ){.
1e670 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1e680 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64   }..  /* The ind
1e690 65 78 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65  ex entry must be
1e6a0 67 69 6e 20 77 69 74 68 20 61 20 68 65 61 64 65  gin with a heade
1e6b0 72 20 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69  r size */.  (voi
1e6c0 64 29 67 65 74 56 61 72 69 6e 74 33 32 28 28 75  d)getVarint32((u
1e6d0 38 2a 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a  8*)m.z, szHdr);.
1e6e0 20 20 74 65 73 74 63 61 73 65 28 20 73 7a 48 64    testcase( szHd
1e6f0 72 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61  r==3 );.  testca
1e700 73 65 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29  se( szHdr==m.n )
1e710 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79  ;.  if( unlikely
1e720 28 73 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74  (szHdr<3 || (int
1e730 29 73 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20  )szHdr>m.n) ){. 
1e740 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
1e750 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
1e760 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74  }..  /* The last
1e770 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e   field of the in
1e780 64 65 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e  dex should be an
1e790 20 69 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52   integer - the R
1e7a0 4f 57 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66  OWID..  ** Verif
1e7b0 79 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  y that the last 
1e7c0 65 6e 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20  entry really is 
1e7d0 61 6e 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20  an integer. */. 
1e7e0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1e7f0 33 32 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48  32((u8*)&m.z[szH
1e800 64 72 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64  dr-1], typeRowid
1e810 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e820 79 70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20  ypeRowid==1 );. 
1e830 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e840 6f 77 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73  owid==2 );.  tes
1e850 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e860 3d 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==3 );.  testcas
1e870 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20  e( typeRowid==4 
1e880 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 74  );.  testcase( t
1e890 79 70 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20  ypeRowid==5 );. 
1e8a0 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65 52   testcase( typeR
1e8b0 6f 77 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73  owid==6 );.  tes
1e8c0 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69 64  tcase( typeRowid
1e8d0 3d 3d 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73  ==8 );.  testcas
1e8e0 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20  e( typeRowid==9 
1e8f0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1e900 79 28 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c  y(typeRowid<1 ||
1e910 20 74 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20   typeRowid>9 || 
1e920 74 79 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b  typeRowid==7) ){
1e930 0a 20 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f  .    goto idx_ro
1e940 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a  wid_corruption;.
1e950 20 20 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d    }.  lenRowid =
1e960 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1e970 61 6c 54 79 70 65 4c 65 6e 28 74 79 70 65 52 6f  alTypeLen(typeRo
1e980 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61 73 65  wid);.  testcase
1e990 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73 7a 48 64  ( (u32)m.n==szHd
1e9a0 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b 0a 20 20  r+lenRowid );.  
1e9b0 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 28 75 33  if( unlikely((u3
1e9c0 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c 65 6e 52  2)m.n<szHdr+lenR
1e9d0 6f 77 69 64 29 20 29 7b 0a 20 20 20 20 67 6f 74  owid) ){.    got
1e9e0 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  o idx_rowid_corr
1e9f0 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  uption;.  }..  /
1ea00 2a 20 46 65 74 63 68 20 74 68 65 20 69 6e 74 65  * Fetch the inte
1ea10 67 65 72 20 6f 66 66 20 74 68 65 20 65 6e 64 20  ger off the end 
1ea20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 72 65 63  of the index rec
1ea30 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ord */.  sqlite3
1ea40 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 28 75  VdbeSerialGet((u
1ea50 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52  8*)&m.z[m.n-lenR
1ea60 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f 77 69 64  owid], typeRowid
1ea70 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77 69 64 20  , &v);.  *rowid 
1ea80 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71 6c 69 74  = v.u.i;.  sqlit
1ea90 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
1eaa0 28 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (&m);.  return S
1eab0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
1eac0 4a 75 6d 70 20 68 65 72 65 20 69 66 20 64 61 74  Jump here if dat
1ead0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
1eae0 20 69 73 20 64 65 74 65 63 74 65 64 20 61 66 74   is detected aft
1eaf0 65 72 20 6d 20 68 61 73 20 62 65 65 6e 0a 20 20  er m has been.  
1eb00 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e 20 20 46  ** allocated.  F
1eb10 72 65 65 20 74 68 65 20 6d 20 6f 62 6a 65 63 74  ree the m object
1eb20 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
1eb30 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a 2f 0a 69  TE_CORRUPT. */.i
1eb40 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1eb50 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61 73 65 28  ion:.  testcase(
1eb60 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d 30 20 29   m.szMalloc!=0 )
1eb70 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  ;.  sqlite3VdbeM
1eb80 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20  emRelease(&m);. 
1eb90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1eba0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 7d 0a 0a  ORRUPT_BKPT;.}..
1ebb0 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1ebc0 65 20 6b 65 79 20 6f 66 20 74 68 65 20 69 6e 64  e key of the ind
1ebd0 65 78 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  ex entry that cu
1ebe0 72 73 6f 72 20 70 43 20 69 73 20 70 6f 69 6e 74  rsor pC is point
1ebf0 69 6e 67 20 74 6f 20 61 67 61 69 6e 73 74 0a 2a  ing to against.*
1ec00 2a 20 74 68 65 20 6b 65 79 20 73 74 72 69 6e 67  * the key string
1ec10 20 69 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20   in pUnpacked.  
1ec20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 52 65 73  Write into *pRes
1ec30 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20 74 68 61   a number.** tha
1ec40 74 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 7a  t is negative, z
1ec50 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65  ero, or positive
1ec60 20 69 66 20 70 43 20 69 73 20 6c 65 73 73 20 74   if pC is less t
1ec70 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 0a 2a  han, equal to,.*
1ec80 2a 20 6f 72 20 67 72 65 61 74 65 72 20 74 68 61  * or greater tha
1ec90 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20 20 52 65  n pUnpacked.  Re
1eca0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1ecb0 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  n success..**.**
1ecc0 20 70 55 6e 70 61 63 6b 65 64 20 69 73 20 65 69   pUnpacked is ei
1ecd0 74 68 65 72 20 63 72 65 61 74 65 64 20 77 69 74  ther created wit
1ece0 68 6f 75 74 20 61 20 72 6f 77 69 64 20 6f 72 20  hout a rowid or 
1ecf0 69 73 20 74 72 75 6e 63 61 74 65 64 20 73 6f 20  is truncated so 
1ed00 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d 69 74 73  that it.** omits
1ed10 20 74 68 65 20 72 6f 77 69 64 20 61 74 20 74 68   the rowid at th
1ed20 65 20 65 6e 64 2e 20 20 54 68 65 20 72 6f 77 69  e end.  The rowi
1ed30 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  d at the end of 
1ed40 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 0a  the index entry.
1ed50 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64 20 61 73  ** is ignored as
1ed60 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65 2c 20 74   well.  Hence, t
1ed70 68 69 73 20 72 6f 75 74 69 6e 65 20 6f 6e 6c 79  his routine only
1ed80 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 70 72   compares the pr
1ed90 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66 20 74 68  efixes .** of th
1eda0 65 20 6b 65 79 73 20 70 72 69 6f 72 20 74 6f 20  e keys prior to 
1edb0 74 68 65 20 66 69 6e 61 6c 20 72 6f 77 69 64 2c  the final rowid,
1edc0 20 6e 6f 74 20 74 68 65 20 65 6e 74 69 72 65 20   not the entire 
1edd0 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  key..*/.int sqli
1ede0 74 65 33 56 64 62 65 49 64 78 4b 65 79 43 6f 6d  te3VdbeIdxKeyCom
1edf0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
1ee00 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
1ee10 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
1ee20 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
1ee30 2a 2f 0a 20 20 56 64 62 65 43 75 72 73 6f 72 20  */.  VdbeCursor 
1ee40 2a 70 43 2c 20 20 20 20 20 20 20 20 20 20 20 20  *pC,            
1ee50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72        /* The cur
1ee60 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72 65 20 61  sor to compare a
1ee70 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55 6e 70 61  gainst */.  Unpa
1ee80 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 70  ckedRecord *pUnp
1ee90 61 63 6b 65 64 2c 20 20 20 20 20 20 20 2f 2a 20  acked,       /* 
1eea0 55 6e 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e  Unpacked version
1eeb0 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74   of key */.  int
1eec0 20 2a 72 65 73 20 20 20 20 20 20 20 20 20 20 20   *res           
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eee0 20 57 72 69 74 65 20 74 68 65 20 63 6f 6d 70 61   Write the compa
1eef0 72 69 73 6f 6e 20 72 65 73 75 6c 74 20 68 65 72  rison result her
1ef00 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34 20 6e 43  e */.){.  i64 nC
1ef10 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e  ellKey = 0;.  in
1ef20 74 20 72 63 3b 0a 20 20 42 74 43 75 72 73 6f 72  t rc;.  BtCursor
1ef30 20 2a 70 43 75 72 20 3d 20 70 43 2d 3e 70 43 75   *pCur = pC->pCu
1ef40 72 73 6f 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a  rsor;.  Mem m;..
1ef50 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1ef60 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
1ef70 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 56  lid(pCur) );.  V
1ef80 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29 20 73 71  VA_ONLY(rc =) sq
1ef90 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69 7a  lite3BtreeKeySiz
1efa0 65 28 70 43 75 72 2c 20 26 6e 43 65 6c 6c 4b 65  e(pCur, &nCellKe
1efb0 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  y);.  assert( rc
1efc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 20 20  ==SQLITE_OK );  
1efd0 20 20 2f 2a 20 70 43 75 72 20 69 73 20 61 6c 77    /* pCur is alw
1efe0 61 79 73 20 76 61 6c 69 64 20 73 6f 20 4b 65 79  ays valid so Key
1eff0 53 69 7a 65 20 63 61 6e 6e 6f 74 20 66 61 69 6c  Size cannot fail
1f000 20 2a 2f 0a 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65   */.  /* nCellKe
1f010 79 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  y will always be
1f020 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 30   between 0 and 0
1f030 78 66 66 66 66 66 66 66 66 20 62 65 63 61 75 73  xffffffff becaus
1f040 65 20 6f 66 20 74 68 65 20 77 61 79 0a 20 20 2a  e of the way.  *
1f050 2a 20 74 68 61 74 20 62 74 72 65 65 50 61 72 73  * that btreePars
1f060 65 43 65 6c 6c 50 74 72 28 29 20 61 6e 64 20 73  eCellPtr() and s
1f070 71 6c 69 74 65 33 47 65 74 56 61 72 69 6e 74 33  qlite3GetVarint3
1f080 32 28 29 20 61 72 65 20 69 6d 70 6c 65 6d 65 6e  2() are implemen
1f090 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 6e 43 65  ted */.  if( nCe
1f0a0 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c  llKey<=0 || nCel
1f0b0 6c 4b 65 79 3e 30 78 37 66 66 66 66 66 66 66 20  lKey>0x7fffffff 
1f0c0 29 7b 0a 20 20 20 20 2a 72 65 73 20 3d 20 30 3b  ){.    *res = 0;
1f0d0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1f0e0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1f0f0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
1f100 62 65 4d 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62  beMemInit(&m, db
1f110 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
1f120 69 74 65 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42  ite3VdbeMemFromB
1f130 74 72 65 65 28 70 43 2d 3e 70 43 75 72 73 6f 72  tree(pC->pCursor
1f140 2c 20 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b  , 0, (u32)nCellK
1f150 65 79 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66  ey, 1, &m);.  if
1f160 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1f170 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65  rn rc;.  }.  *re
1f180 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
1f190 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e  ecordCompare(m.n
1f1a0 2c 20 6d 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64  , m.z, pUnpacked
1f1b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
1f1c0 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a  MemRelease(&m);.
1f1d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f1e0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
1f1f0 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74  s routine sets t
1f200 68 65 20 76 61 6c 75 65 20 74 6f 20 62 65 20 72  he value to be r
1f210 65 74 75 72 6e 65 64 20 62 79 20 73 75 62 73 65  eturned by subse
1f220 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a  quent calls to.*
1f230 2a 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  * sqlite3_change
1f240 73 28 29 20 6f 6e 20 74 68 65 20 64 61 74 61 62  s() on the datab
1f250 61 73 65 20 68 61 6e 64 6c 65 20 27 64 62 27 2e  ase handle 'db'.
1f260 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65   .*/.void sqlite
1f270 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73 28  3VdbeSetChanges(
1f280 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
1f290 20 6e 43 68 61 6e 67 65 29 7b 0a 20 20 61 73 73   nChange){.  ass
1f2a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1f2b0 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
1f2c0 78 29 20 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61  x) );.  db->nCha
1f2d0 6e 67 65 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20  nge = nChange;. 
1f2e0 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
1f2f0 65 20 2b 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a  e += nChange;.}.
1f300 0a 2f 2a 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  ./*.** Set a fla
1f310 67 20 69 6e 20 74 68 65 20 76 64 62 65 20 74 6f  g in the vdbe to
1f320 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
1f330 67 65 20 63 6f 75 6e 74 65 72 20 77 68 65 6e 20  ge counter when 
1f340 69 74 20 69 73 20 66 69 6e 61 6c 69 73 65 64 0a  it is finalised.
1f350 2a 2a 20 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a  ** or reset..*/.
1f360 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
1f370 43 6f 75 6e 74 43 68 61 6e 67 65 73 28 56 64 62  CountChanges(Vdb
1f380 65 20 2a 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e  e *v){.  v->chan
1f390 67 65 43 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a  geCntOn = 1;.}..
1f3a0 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79  /*.** Mark every
1f3b0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1f3c0 65 6e 74 20 61 73 73 6f 63 69 61 74 65 64 20 77  ent associated w
1f3d0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
1f3e0 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20  onnection.** as 
1f3f0 65 78 70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  expired..**.** A
1f400 6e 20 65 78 70 69 72 65 64 20 73 74 61 74 65 6d  n expired statem
1f410 65 6e 74 20 6d 65 61 6e 73 20 74 68 61 74 20 72  ent means that r
1f420 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
1f430 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
1f440 0a 2a 2a 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20  .** recommend.  
1f450 53 74 61 74 65 6d 65 6e 74 73 20 65 78 70 69 72  Statements expir
1f460 65 20 77 68 65 6e 20 74 68 69 6e 67 73 20 68 61  e when things ha
1f470 70 70 65 6e 20 74 68 61 74 20 6d 61 6b 65 20 74  ppen that make t
1f480 68 65 69 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73  heir.** programs
1f490 20 6f 62 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f   obsolete.  Remo
1f4a0 76 69 6e 67 20 75 73 65 72 2d 64 65 66 69 6e 65  ving user-define
1f4b0 64 20 66 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63  d functions or c
1f4c0 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75  ollating.** sequ
1f4d0 65 6e 63 65 73 2c 20 6f 72 20 63 68 61 6e 67 69  ences, or changi
1f4e0 6e 67 20 61 6e 20 61 75 74 68 6f 72 69 7a 61 74  ng an authorizat
1f4f0 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 72 65  ion function are
1f500 20 74 68 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a   the types of.**
1f510 20 74 68 69 6e 67 73 20 74 68 61 74 20 6d 61 6b   things that mak
1f520 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
1f530 6d 65 6e 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a  ments obsolete..
1f540 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1f550 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
1f560 74 65 6d 65 6e 74 73 28 73 71 6c 69 74 65 33 20  tements(sqlite3 
1f570 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b  *db){.  Vdbe *p;
1f580 0a 20 20 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70  .  for(p = db->p
1f590 56 64 62 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  Vdbe; p; p=p->pN
1f5a0 65 78 74 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70  ext){.    p->exp
1f5b0 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a  ired = 1;.  }.}.
1f5c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f5d0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1f5e0 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 56  iated with the V
1f5f0 64 62 65 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20  dbe..*/.sqlite3 
1f600 2a 73 71 6c 69 74 65 33 56 64 62 65 44 62 28 56  *sqlite3VdbeDb(V
1f610 64 62 65 20 2a 76 29 7b 0a 20 20 72 65 74 75 72  dbe *v){.  retur
1f620 6e 20 76 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  n v->db;.}../*.*
1f630 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1f640 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1f650 5f 76 61 6c 75 65 20 73 74 72 75 63 74 75 72 65  _value structure
1f660 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1f670 76 61 6c 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70  value bound.** p
1f680 61 72 61 6d 65 74 65 72 20 69 56 61 72 20 6f 66  arameter iVar of
1f690 20 56 4d 20 76 2e 20 45 78 63 65 70 74 2c 20 69   VM v. Except, i
1f6a0 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1f6b0 6e 20 53 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75  n SQL NULL, retu
1f6c0 72 6e 20 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64  rn .** 0 instead
1f6d0 2e 20 55 6e 6c 65 73 73 20 69 74 20 69 73 20 4e  . Unless it is N
1f6e0 55 4c 4c 2c 20 61 70 70 6c 79 20 61 66 66 69 6e  ULL, apply affin
1f6f0 69 74 79 20 61 66 66 20 28 6f 6e 65 20 6f 66 20  ity aff (one of 
1f700 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a  the SQLITE_AFF_*
1f710 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 29 20 74  .** constants) t
1f720 6f 20 74 68 65 20 76 61 6c 75 65 20 62 65 66 6f  o the value befo
1f730 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 74 2e  re returning it.
1f740 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
1f750 6e 65 64 20 76 61 6c 75 65 20 6d 75 73 74 20 62  ned value must b
1f760 65 20 66 72 65 65 64 20 62 79 20 74 68 65 20 63  e freed by the c
1f770 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71 6c 69  aller using sqli
1f780 74 65 33 56 61 6c 75 65 46 72 65 65 28 29 2e 0a  te3ValueFree()..
1f790 2a 2f 0a 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  */.sqlite3_value
1f7a0 20 2a 73 71 6c 69 74 65 33 56 64 62 65 47 65 74   *sqlite3VdbeGet
1f7b0 42 6f 75 6e 64 56 61 6c 75 65 28 56 64 62 65 20  BoundValue(Vdbe 
1f7c0 2a 76 2c 20 69 6e 74 20 69 56 61 72 2c 20 75 38  *v, int iVar, u8
1f7d0 20 61 66 66 29 7b 0a 20 20 61 73 73 65 72 74 28   aff){.  assert(
1f7e0 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
1f7f0 20 76 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70   v ){.    Mem *p
1f800 4d 65 6d 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69  Mem = &v->aVar[i
1f810 56 61 72 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20  Var-1];.    if( 
1f820 30 3d 3d 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20  0==(pMem->flags 
1f830 26 20 4d 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20  & MEM_Null) ){. 
1f840 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
1f850 75 65 20 2a 70 52 65 74 20 3d 20 73 71 6c 69 74  ue *pRet = sqlit
1f860 65 33 56 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62  e3ValueNew(v->db
1f870 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1f880 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
1f890 69 74 65 33 56 64 62 65 4d 65 6d 43 6f 70 79 28  ite3VdbeMemCopy(
1f8a0 28 4d 65 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65  (Mem *)pRet, pMe
1f8b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  m);.        sqli
1f8c0 74 65 33 56 61 6c 75 65 41 70 70 6c 79 41 66 66  te3ValueApplyAff
1f8d0 69 6e 69 74 79 28 70 52 65 74 2c 20 61 66 66 2c  inity(pRet, aff,
1f8e0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
1f8f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
1f900 75 72 6e 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a  urn pRet;.    }.
1f910 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1f920 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
1f930 72 65 20 53 51 4c 20 76 61 72 69 61 62 6c 65 20  re SQL variable 
1f940 69 56 61 72 20 73 6f 20 74 68 61 74 20 62 69 6e  iVar so that bin
1f950 64 69 6e 67 20 61 20 6e 65 77 20 76 61 6c 75 65  ding a new value
1f960 20 74 6f 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a   to it signals.*
1f970 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f  * to sqlite3_reo
1f980 70 74 69 6d 69 7a 65 28 29 20 74 68 61 74 20 72  ptimize() that r
1f990 65 2d 70 72 65 70 61 72 69 6e 67 20 74 68 65 20  e-preparing the 
1f9a0 73 74 61 74 65 6d 65 6e 74 20 6d 61 79 20 72 65  statement may re
1f9b0 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74  sult.** in a bet
1f9c0 74 65 72 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a  ter query plan..
1f9d0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
1f9e0 64 62 65 53 65 74 56 61 72 6d 61 73 6b 28 56 64  dbeSetVarmask(Vd
1f9f0 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61 72 29  be *v, int iVar)
1fa00 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56 61 72  {.  assert( iVar
1fa10 3e 30 20 29 3b 0a 20 20 69 66 28 20 69 56 61 72  >0 );.  if( iVar
1fa20 3e 33 32 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78  >32 ){.    v->ex
1fa30 70 6d 61 73 6b 20 3d 20 30 78 66 66 66 66 66 66  pmask = 0xffffff
1fa40 66 66 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ff;.  }else{.   
1fa50 20 76 2d 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28   v->expmask |= (
1fa60 28 75 33 32 29 31 20 3c 3c 20 28 69 56 61 72 2d  (u32)1 << (iVar-
1fa70 31 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e  1));.  }.}..#ifn
1fa80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fa90 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a  VIRTUALTABLE./*.
1faa0 2a 2a 20 54 72 61 6e 73 66 65 72 20 65 72 72 6f  ** Transfer erro
1fab0 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20 66  r message text f
1fac0 72 6f 6d 20 61 6e 20 73 71 6c 69 74 65 33 5f 76  rom an sqlite3_v
1fad0 74 61 62 2e 7a 45 72 72 4d 73 67 20 28 74 65 78  tab.zErrMsg (tex
1fae0 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d  t stored.** in m
1faf0 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66  emory obtained f
1fb00 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1fb10 6f 63 29 20 69 6e 74 6f 20 61 20 56 64 62 65 2e  oc) into a Vdbe.
1fb20 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73 74  zErrMsg (text st
1fb30 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  ored.** in memor
1fb40 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
1fb50 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29  sqlite3DbMalloc)
1fb60 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fb70 33 56 74 61 62 49 6d 70 6f 72 74 45 72 72 6d 73  3VtabImportErrms
1fb80 67 28 56 64 62 65 20 2a 70 2c 20 73 71 6c 69 74  g(Vdbe *p, sqlit
1fb90 65 33 5f 76 74 61 62 20 2a 70 56 74 61 62 29 7b  e3_vtab *pVtab){
1fba0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1fbb0 20 70 2d 3e 64 62 3b 0a 20 20 73 71 6c 69 74 65   p->db;.  sqlite
1fbc0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
1fbd0 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a 45  ErrMsg);.  p->zE
1fbe0 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 44  rrMsg = sqlite3D
1fbf0 62 53 74 72 44 75 70 28 64 62 2c 20 70 56 74 61  bStrDup(db, pVta
1fc00 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  b->zErrMsg);.  s
1fc10 71 6c 69 74 65 33 5f 66 72 65 65 28 70 56 74 61  qlite3_free(pVta
1fc20 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70  b->zErrMsg);.  p
1fc30 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20  Vtab->zErrMsg = 
1fc40 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  0;.}.#endif /* S
1fc50 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
1fc60 41 4c 54 41 42 4c 45 20 2a 2f 0a                 ALTABLE */.