/ Hex Artifact Content
Login

Artifact 8d4b5165fbf4fed0ed7fd0f657368965383d2d55:


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 69 6e 74 20 68 61 73 46 6b 43 6f 75 6e 74    int hasFkCount
2cf0: 65 72 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f  er = 0;.  Op *pO
2d00: 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20  p;.  VdbeOpIter 
2d10: 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28  sIter;.  memset(
2d20: 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f  &sIter, 0, sizeo
2d30: 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74  f(sIter));.  sIt
2d40: 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69  er.v = v;..  whi
2d50: 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65  le( (pOp = opIte
2d60: 72 4e 65 78 74 28 26 73 49 74 65 72 29 29 21 3d  rNext(&sIter))!=
2d70: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63  0 ){.    int opc
2d80: 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64  ode = pOp->opcod
2d90: 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64  e;.    if( opcod
2da0: 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c  e==OP_Destroy ||
2db0: 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64   opcode==OP_VUpd
2dc0: 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f  ate || opcode==O
2dd0: 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20  P_VRename .     
2de0: 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f  || ((opcode==OP_
2df0: 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d  Halt || opcode==
2e00: 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a  OP_HaltIfNull) .
2e10: 20 20 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e        && ((pOp->
2e20: 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  p1&0xff)==SQLITE
2e30: 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70  _CONSTRAINT && p
2e40: 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74  Op->p2==OE_Abort
2e50: 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
2e60: 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20  hasAbort = 1;.  
2e70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2e80: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e90: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
2ea0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
2eb0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
2ec0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
2ed0: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
2ee0: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20     hasFkCounter 
2ef0: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
2f00: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  f.  }.  sqlite3D
2f10: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
2f20: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
2f30: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
2f40: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
2f50: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
2f60: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
2f70: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
2f80: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
2f90: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
2fa0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
2fb0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
2fc0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
2fd0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
2fe0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
2ff0: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
3000: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
3010: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
3020: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
3030: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
3040: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
3050: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
3060: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
3070: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
3080: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3090: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e  ort || hasFkCoun
30a0: 74 65 72 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  ter );.}.#endif 
30b0: 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20  /* SQLITE_DEBUG 
30c0: 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41 73 73  - the sqlite3Ass
30d0: 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20 66 75  ertMayAbort() fu
30e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  nction */../*.**
30f0: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 74 68   Loop through th
3100: 65 20 70 72 6f 67 72 61 6d 20 6c 6f 6f 6b 69 6e  e program lookin
3110: 67 20 66 6f 72 20 50 32 20 76 61 6c 75 65 73 20  g for P2 values 
3120: 74 68 61 74 20 61 72 65 20 6e 65 67 61 74 69 76  that are negativ
3130: 65 0a 2a 2a 20 6f 6e 20 6a 75 6d 70 20 69 6e 73  e.** on jump ins
3140: 74 72 75 63 74 69 6f 6e 73 2e 20 20 45 61 63 68  tructions.  Each
3150: 20 73 75 63 68 20 76 61 6c 75 65 20 69 73 20 61   such value is a
3160: 20 6c 61 62 65 6c 2e 20 20 52 65 73 6f 6c 76 65   label.  Resolve
3170: 20 74 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 62 79   the.** label by
3180: 20 73 65 74 74 69 6e 67 20 74 68 65 20 50 32 20   setting the P2 
3190: 76 61 6c 75 65 20 74 6f 20 69 74 73 20 63 6f 72  value to its cor
31a0: 72 65 63 74 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  rect non-zero va
31b0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  lue..**.** This 
31c0: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
31d0: 64 20 6f 6e 63 65 20 61 66 74 65 72 20 61 6c 6c  d once after all
31e0: 20 6f 70 63 6f 64 65 73 20 68 61 76 65 20 62 65   opcodes have be
31f0: 65 6e 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2a 0a  en inserted..**.
3200: 2a 2a 20 56 61 72 69 61 62 6c 65 20 2a 70 4d 61  ** Variable *pMa
3210: 78 46 75 6e 63 41 72 67 73 20 69 73 20 73 65 74  xFuncArgs is set
3220: 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   to the maximum 
3230: 76 61 6c 75 65 20 6f 66 20 61 6e 79 20 50 32 20  value of any P2 
3240: 61 72 67 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20  argument .** to 
3250: 61 6e 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  an OP_Function, 
3260: 4f 50 5f 41 67 67 53 74 65 70 20 6f 72 20 4f 50  OP_AggStep or OP
3270: 5f 56 46 69 6c 74 65 72 20 6f 70 63 6f 64 65 2e  _VFilter opcode.
3280: 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
3290: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65   .** sqlite3Vdbe
32a0: 4d 61 6b 65 52 65 61 64 79 28 29 20 74 6f 20 73  MakeReady() to s
32b0: 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 70 41  ize the Vdbe.apA
32c0: 72 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 0a 2a  rg[] array..**.*
32d0: 2a 20 54 68 65 20 4f 70 2e 6f 70 66 6c 61 67 73  * The Op.opflags
32e0: 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 6f 6e   field is set on
32f0: 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f   all opcodes..*/
3300: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
3310: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
3320: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
3330: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
3340: 69 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 41 72 67  i;.  int nMaxArg
3350: 73 20 3d 20 2a 70 4d 61 78 46 75 6e 63 41 72 67  s = *pMaxFuncArg
3360: 73 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20 20  s;.  Op *pOp;.  
3370: 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d 20  Parse *pParse = 
3380: 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 69 6e 74  p->pParse;.  int
3390: 20 2a 61 4c 61 62 65 6c 20 3d 20 70 50 61 72 73   *aLabel = pPars
33a0: 65 2d 3e 61 4c 61 62 65 6c 3b 0a 20 20 70 2d 3e  e->aLabel;.  p->
33b0: 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20  readOnly = 1;.  
33c0: 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d 20 30  p->bIsReader = 0
33d0: 3b 0a 20 20 66 6f 72 28 70 4f 70 3d 70 2d 3e 61  ;.  for(pOp=p->a
33e0: 4f 70 2c 20 69 3d 70 2d 3e 6e 4f 70 2d 31 3b 20  Op, i=p->nOp-1; 
33f0: 69 3e 3d 30 3b 20 69 2d 2d 2c 20 70 4f 70 2b 2b  i>=0; i--, pOp++
3400: 29 7b 0a 20 20 20 20 75 38 20 6f 70 63 6f 64 65  ){.    u8 opcode
3410: 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a   = pOp->opcode;.
3420: 0a 20 20 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65  .    /* NOTE: Be
3430: 20 73 75 72 65 20 74 6f 20 75 70 64 61 74 65 20   sure to update 
3440: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 77 68  mkopcodeh.awk wh
3450: 65 6e 20 61 64 64 69 6e 67 20 6f 72 20 72 65 6d  en adding or rem
3460: 6f 76 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 73  oving.    ** cas
3470: 65 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69  es from this swi
3480: 74 63 68 21 20 2a 2f 0a 20 20 20 20 73 77 69 74  tch! */.    swit
3490: 63 68 28 20 6f 70 63 6f 64 65 20 29 7b 0a 20 20  ch( opcode ){.  
34a0: 20 20 20 20 63 61 73 65 20 4f 50 5f 46 75 6e 63      case OP_Func
34b0: 74 69 6f 6e 3a 0a 20 20 20 20 20 20 63 61 73 65  tion:.      case
34c0: 20 4f 50 5f 41 67 67 53 74 65 70 3a 20 7b 0a 20   OP_AggStep: {. 
34d0: 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e         if( pOp->
34e0: 70 35 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d  p5>nMaxArgs ) nM
34f0: 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e 70 35  axArgs = pOp->p5
3500: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
3510: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
3520: 61 73 65 20 4f 50 5f 54 72 61 6e 73 61 63 74 69  ase OP_Transacti
3530: 6f 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  on: {.        if
3540: 28 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70  ( pOp->p2!=0 ) p
3550: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
3560: 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20          /* fall 
3570: 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 7d 0a  thru */.      }.
3580: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41 75        case OP_Au
3590: 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20 20  toCommit:.      
35a0: 63 61 73 65 20 4f 50 5f 53 61 76 65 70 6f 69 6e  case OP_Savepoin
35b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  t: {.        p->
35c0: 62 49 73 52 65 61 64 65 72 20 3d 20 31 3b 0a 20  bIsReader = 1;. 
35d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
35e0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
35f0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20  LITE_OMIT_WAL.  
3600: 20 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63      case OP_Chec
3610: 6b 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20  kpoint:.#endif. 
3620: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61 63       case OP_Vac
3630: 75 75 6d 3a 0a 20 20 20 20 20 20 63 61 73 65 20  uum:.      case 
3640: 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20  OP_JournalMode: 
3650: 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 72 65 61  {.        p->rea
3660: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
3670: 20 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20     p->bIsReader 
3680: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = 1;.        bre
3690: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e  ak;.      }.#ifn
36a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
36b0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
36c0: 20 20 20 63 61 73 65 20 4f 50 5f 56 55 70 64 61     case OP_VUpda
36d0: 74 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  te: {.        if
36e0: 28 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72  ( pOp->p2>nMaxAr
36f0: 67 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20  gs ) nMaxArgs = 
3700: 70 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20  pOp->p2;.       
3710: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3720: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 46        case OP_VF
3730: 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20 20  ilter: {.       
3740: 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20 20   int n;.        
3750: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2d  assert( p->nOp -
3760: 20 69 20 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20   i >= 3 );.     
3770: 20 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d     assert( pOp[-
3780: 31 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  1].opcode==OP_In
3790: 74 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20  teger );.       
37a0: 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b   n = pOp[-1].p1;
37b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e  .        if( n>n
37c0: 4d 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72  MaxArgs ) nMaxAr
37d0: 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20  gs = n;.        
37e0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23  break;.      }.#
37f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 63 61 73 65  endif.      case
3800: 20 4f 50 5f 4e 65 78 74 3a 0a 20 20 20 20 20 20   OP_Next:.      
3810: 63 61 73 65 20 4f 50 5f 4e 65 78 74 49 66 4f 70  case OP_NextIfOp
3820: 65 6e 3a 0a 20 20 20 20 20 20 63 61 73 65 20 4f  en:.      case O
3830: 50 5f 53 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a  P_SorterNext: {.
3840: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e          pOp->p4.
3850: 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74  xAdvance = sqlit
3860: 65 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20  e3BtreeNext;.   
3870: 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65       pOp->p4type
3880: 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20   = P4_ADVANCE;. 
3890: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
38a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
38b0: 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20 20 20 20   OP_Prev:.      
38c0: 63 61 73 65 20 4f 50 5f 50 72 65 76 49 66 4f 70  case OP_PrevIfOp
38d0: 65 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 70 4f  en: {.        pO
38e0: 70 2d 3e 70 34 2e 78 41 64 76 61 6e 63 65 20 3d  p->p4.xAdvance =
38f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
3900: 76 69 6f 75 73 3b 0a 20 20 20 20 20 20 20 20 70  vious;.        p
3910: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
3920: 41 44 56 41 4e 43 45 3b 0a 20 20 20 20 20 20 20  ADVANCE;.       
3930: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
3940: 20 20 20 20 7d 0a 0a 20 20 20 20 70 4f 70 2d 3e      }..    pOp->
3950: 6f 70 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65  opflags = sqlite
3960: 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b  3OpcodeProperty[
3970: 6f 70 63 6f 64 65 5d 3b 0a 20 20 20 20 69 66 28  opcode];.    if(
3980: 20 28 70 4f 70 2d 3e 6f 70 66 6c 61 67 73 20 26   (pOp->opflags &
3990: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
39a0: 26 26 20 70 4f 70 2d 3e 70 32 3c 30 20 29 7b 0a  && pOp->p2<0 ){.
39b0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2d 31        assert( -1
39c0: 2d 70 4f 70 2d 3e 70 32 3c 70 50 61 72 73 65 2d  -pOp->p2<pParse-
39d0: 3e 6e 4c 61 62 65 6c 20 29 3b 0a 20 20 20 20 20  >nLabel );.     
39e0: 20 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65   pOp->p2 = aLabe
39f0: 6c 5b 2d 31 2d 70 4f 70 2d 3e 70 32 5d 3b 0a 20  l[-1-pOp->p2];. 
3a00: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3a10: 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20  e3DbFree(p->db, 
3a20: 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b  pParse->aLabel);
3a30: 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65  .  pParse->aLabe
3a40: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d  l = 0;.  pParse-
3a50: 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a  >nLabel = 0;.  *
3a60: 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e  pMaxFuncArgs = n
3a70: 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72  MaxArgs;.  asser
3a80: 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21  t( p->bIsReader!
3a90: 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a  =0 || DbMaskAllZ
3aa0: 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  ero(p->btreeMask
3ab0: 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ) );.}../*.** Re
3ac0: 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
3ad0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73   of the next ins
3ae0: 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  truction to be i
3af0: 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  nserted..*/.int 
3b00: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
3b10: 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b  ntAddr(Vdbe *p){
3b20: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
3b30: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
3b40: 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e  INIT );.  return
3b50: 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a   p->nOp;.}../*.*
3b60: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3b70: 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
3b80: 72 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  r to the array o
3b90: 66 20 6f 70 63 6f 64 65 73 20 61 73 73 6f 63 69  f opcodes associ
3ba0: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65  ated with.** the
3bb0: 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
3bc0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
3bd0: 6e 74 2e 20 49 74 20 69 73 20 74 68 65 20 63 61  nt. It is the ca
3be0: 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
3bf0: 6c 69 74 79 0a 2a 2a 20 74 6f 20 61 72 72 61 6e  lity.** to arran
3c00: 67 65 20 66 6f 72 20 74 68 65 20 72 65 74 75 72  ge for the retur
3c10: 6e 65 64 20 61 72 72 61 79 20 74 6f 20 62 65 20  ned array to be 
3c20: 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 64  eventually freed
3c30: 20 75 73 69 6e 67 20 74 68 65 20 0a 2a 2a 20 76   using the .** v
3c40: 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 29  dbeFreeOpArray()
3c50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
3c60: 20 42 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   Before returnin
3c70: 67 2c 20 2a 70 6e 4f 70 20 69 73 20 73 65 74 20  g, *pnOp is set 
3c80: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
3c90: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
3ca0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 72 72 61  returned.** arra
3cb0: 79 2e 20 41 6c 73 6f 2c 20 2a 70 6e 4d 61 78 41  y. Also, *pnMaxA
3cc0: 72 67 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  rg is set to the
3cd0: 20 6c 61 72 67 65 72 20 6f 66 20 69 74 73 20 63   larger of its c
3ce0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61 6e 64  urrent value and
3cf0: 20 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20   .** the number 
3d00: 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  of entries in th
3d10: 65 20 56 64 62 65 2e 61 70 41 72 67 5b 5d 20 61  e Vdbe.apArg[] a
3d20: 72 72 61 79 20 72 65 71 75 69 72 65 64 20 74 6f  rray required to
3d30: 20 65 78 65 63 75 74 65 20 74 68 65 20 0a 2a 2a   execute the .**
3d40: 20 72 65 74 75 72 6e 65 64 20 70 72 6f 67 72 61   returned progra
3d50: 6d 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  m..*/.VdbeOp *sq
3d60: 6c 69 74 65 33 56 64 62 65 54 61 6b 65 4f 70 41  lite3VdbeTakeOpA
3d70: 72 72 61 79 28 56 64 62 65 20 2a 70 2c 20 69 6e  rray(Vdbe *p, in
3d80: 74 20 2a 70 6e 4f 70 2c 20 69 6e 74 20 2a 70 6e  t *pnOp, int *pn
3d90: 4d 61 78 41 72 67 29 7b 0a 20 20 56 64 62 65 4f  MaxArg){.  VdbeO
3da0: 70 20 2a 61 4f 70 20 3d 20 70 2d 3e 61 4f 70 3b  p *aOp = p->aOp;
3db0: 0a 20 20 61 73 73 65 72 74 28 20 61 4f 70 20 26  .  assert( aOp &
3dc0: 26 20 21 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  & !p->db->malloc
3dd0: 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 2f 2a 20  Failed );..  /* 
3de0: 43 68 65 63 6b 20 74 68 61 74 20 73 71 6c 69 74  Check that sqlit
3df0: 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65 28  e3VdbeUsesBtree(
3e00: 29 20 77 61 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ) was not called
3e10: 20 6f 6e 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20   on this VM */. 
3e20: 20 61 73 73 65 72 74 28 20 44 62 4d 61 73 6b 41   assert( DbMaskA
3e30: 6c 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d  llZero(p->btreeM
3e40: 61 73 6b 29 20 29 3b 0a 0a 20 20 72 65 73 6f 6c  ask) );..  resol
3e50: 76 65 50 32 56 61 6c 75 65 73 28 70 2c 20 70 6e  veP2Values(p, pn
3e60: 4d 61 78 41 72 67 29 3b 0a 20 20 2a 70 6e 4f 70  MaxArg);.  *pnOp
3e70: 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 70 2d 3e   = p->nOp;.  p->
3e80: 61 4f 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  aOp = 0;.  retur
3e90: 6e 20 61 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n aOp;.}../*.** 
3ea0: 41 64 64 20 61 20 77 68 6f 6c 65 20 6c 69 73 74  Add a whole list
3eb0: 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 73 20 74   of operations t
3ec0: 6f 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  o the operation 
3ed0: 73 74 61 63 6b 2e 20 20 52 65 74 75 72 6e 20 74  stack.  Return t
3ee0: 68 65 0a 2a 2a 20 61 64 64 72 65 73 73 20 6f 66  he.** address of
3ef0: 20 74 68 65 20 66 69 72 73 74 20 6f 70 65 72 61   the first opera
3f00: 74 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2f 0a 69  tion added..*/.i
3f10: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
3f20: 64 4f 70 4c 69 73 74 28 56 64 62 65 20 2a 70 2c  dOpList(Vdbe *p,
3f30: 20 69 6e 74 20 6e 4f 70 2c 20 56 64 62 65 4f 70   int nOp, VdbeOp
3f40: 4c 69 73 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c  List const *aOp,
3f50: 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 29 7b 0a 20   int iLineno){. 
3f60: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 61 73 73   int addr;.  ass
3f70: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
3f80: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
3f90: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70 20 2b  ;.  if( p->nOp +
3fa0: 20 6e 4f 70 20 3e 20 70 2d 3e 70 50 61 72 73 65   nOp > p->pParse
3fb0: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 26 26 20 67 72  ->nOpAlloc && gr
3fc0: 6f 77 4f 70 41 72 72 61 79 28 70 2c 20 6e 4f 70  owOpArray(p, nOp
3fd0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
3fe0: 30 3b 0a 20 20 7d 0a 20 20 61 64 64 72 20 3d 20  0;.  }.  addr = 
3ff0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 41 4c  p->nOp;.  if( AL
4000: 57 41 59 53 28 6e 4f 70 3e 30 29 20 29 7b 0a 20  WAYS(nOp>0) ){. 
4010: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 56 64     int i;.    Vd
4020: 62 65 4f 70 4c 69 73 74 20 63 6f 6e 73 74 20 2a  beOpList const *
4030: 70 49 6e 20 3d 20 61 4f 70 3b 0a 20 20 20 20 66  pIn = aOp;.    f
4040: 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 70 3b 20 69  or(i=0; i<nOp; i
4050: 2b 2b 2c 20 70 49 6e 2b 2b 29 7b 0a 20 20 20 20  ++, pIn++){.    
4060: 20 20 69 6e 74 20 70 32 20 3d 20 70 49 6e 2d 3e    int p2 = pIn->
4070: 70 32 3b 0a 20 20 20 20 20 20 56 64 62 65 4f 70  p2;.      VdbeOp
4080: 20 2a 70 4f 75 74 20 3d 20 26 70 2d 3e 61 4f 70   *pOut = &p->aOp
4090: 5b 69 2b 61 64 64 72 5d 3b 0a 20 20 20 20 20 20  [i+addr];.      
40a0: 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 70  pOut->opcode = p
40b0: 49 6e 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20  In->opcode;.    
40c0: 20 20 70 4f 75 74 2d 3e 70 31 20 3d 20 70 49 6e    pOut->p1 = pIn
40d0: 2d 3e 70 31 3b 0a 20 20 20 20 20 20 69 66 28 20  ->p1;.      if( 
40e0: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
40f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 4f  assert( sqlite3O
4100: 70 63 6f 64 65 50 72 6f 70 65 72 74 79 5b 70 4f  pcodeProperty[pO
4110: 75 74 2d 3e 6f 70 63 6f 64 65 5d 20 26 20 4f 50  ut->opcode] & OP
4120: 46 4c 47 5f 4a 55 4d 50 20 29 3b 0a 20 20 20 20  FLG_JUMP );.    
4130: 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20 61      pOut->p2 = a
4140: 64 64 72 20 2b 20 41 44 44 52 28 70 32 29 3b 0a  ddr + ADDR(p2);.
4150: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
4160: 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20       pOut->p2 = 
4170: 70 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  p2;.      }.    
4180: 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 70 49 6e    pOut->p3 = pIn
4190: 2d 3e 70 33 3b 0a 20 20 20 20 20 20 70 4f 75 74  ->p3;.      pOut
41a0: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
41b0: 54 55 53 45 44 3b 0a 20 20 20 20 20 20 70 4f 75  TUSED;.      pOu
41c0: 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20  t->p4.p = 0;.   
41d0: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
41e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
41f0: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
4200: 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 70 4f 75  MMENTS.      pOu
4210: 74 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b  t->zComment = 0;
4220: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4230: 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52  QLITE_VDBE_COVER
4240: 41 47 45 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e  AGE.      pOut->
4250: 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65  iSrcLine = iLine
4260: 6e 6f 2b 69 3b 0a 23 65 6c 73 65 0a 20 20 20 20  no+i;.#else.    
4270: 20 20 28 76 6f 69 64 29 69 4c 69 6e 65 6e 6f 3b    (void)iLineno;
4280: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
4290: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
42a0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
42b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
42c0: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
42d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
42e0: 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b 61 64  ePrintOp(0, i+ad
42f0: 64 72 2c 20 26 70 2d 3e 61 4f 70 5b 69 2b 61 64  dr, &p->aOp[i+ad
4300: 64 72 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  dr]);.      }.#e
4310: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
4320: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
4330: 7d 0a 20 20 72 65 74 75 72 6e 20 61 64 64 72 3b  }.  return addr;
4340: 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
4350: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54  SQLITE_ENABLE_ST
4360: 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f  MT_SCANSTATUS)./
4370: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72  *.** Add an entr
4380: 79 20 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f  y to the array o
4390: 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67  f counters manag
43a0: 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74  ed by sqlite3_st
43b0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e  mt_scanstatus().
43c0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
43d0: 56 64 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a  VdbeScanStatus(.
43e0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4400: 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73    /* VM to add s
4410: 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a  canstatus() to *
4420: 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c  /.  int addrExpl
4430: 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ain,            
4440: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
4450: 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72  f OP_Explain (or
4460: 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64   0) */.  int add
4470: 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20  rLoop,          
4480: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
4490: 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e  ess of loop coun
44a0: 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64  ter */ .  int ad
44b0: 64 72 56 69 73 69 74 2c 20 20 20 20 20 20 20 20  drVisit,        
44c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
44d0: 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73  ress of rows vis
44e0: 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  ited counter */.
44f0: 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20    LogEst nEst,  
4500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4510: 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e    /* Estimated n
4520: 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20  umber of output 
4530: 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rows */.  const 
4540: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20  char *zName     
4550: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
4560: 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e  e of table or in
4570: 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65  dex being scanne
4580: 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42  d */.){.  int nB
4590: 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b  yte = (p->nScan+
45a0: 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e  1) * sizeof(Scan
45b0: 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53  Status);.  ScanS
45c0: 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61  tatus *aNew;.  a
45d0: 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75  New = (ScanStatu
45e0: 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c  s*)sqlite3DbReal
45f0: 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53  loc(p->db, p->aS
4600: 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69  can, nByte);.  i
4610: 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53  f( aNew ){.    S
4620: 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20  canStatus *pNew 
4630: 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e  = &aNew[p->nScan
4640: 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61  ++];.    pNew->a
4650: 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64  ddrExplain = add
4660: 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e  rExplain;.    pN
4670: 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61  ew->addrLoop = a
4680: 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65  ddrLoop;.    pNe
4690: 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61  w->addrVisit = a
46a0: 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e  ddrVisit;.    pN
46b0: 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b  ew->nEst = nEst;
46c0: 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65  .    pNew->zName
46d0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
46e0: 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29  up(p->db, zName)
46f0: 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d  ;.    p->aScan =
4700: 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e   aNew;.  }.}.#en
4710: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
4720: 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
4730: 74 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 66  the P1 operand f
4740: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
4750: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  struction..** Th
4760: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
4770: 65 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67  eful when a larg
4780: 65 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61  e program is loa
4790: 64 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74  ded from a.** st
47a0: 61 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67  atic array using
47b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
47c0: 70 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e  pList but we wan
47d0: 74 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66  t to make a.** f
47e0: 65 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73  ew minor changes
47f0: 20 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e   to the program.
4800: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
4810: 56 64 62 65 43 68 61 6e 67 65 50 31 28 56 64 62  VdbeChangeP1(Vdb
4820: 65 20 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20  e *p, u32 addr, 
4830: 69 6e 74 20 76 61 6c 29 7b 0a 20 20 61 73 73 65  int val){.  asse
4840: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
4850: 28 20 28 28 75 33 32 29 70 2d 3e 6e 4f 70 29 3e  ( ((u32)p->nOp)>
4860: 61 64 64 72 20 29 7b 0a 20 20 20 20 70 2d 3e 61  addr ){.    p->a
4870: 4f 70 5b 61 64 64 72 5d 2e 70 31 20 3d 20 76 61  Op[addr].p1 = va
4880: 6c 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  l;.  }.}../*.** 
4890: 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65  Change the value
48a0: 20 6f 66 20 74 68 65 20 50 32 20 6f 70 65 72 61   of the P2 opera
48b0: 6e 64 20 66 6f 72 20 61 20 73 70 65 63 69 66 69  nd for a specifi
48c0: 63 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a  c instruction..*
48d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
48e0: 73 20 75 73 65 66 75 6c 20 66 6f 72 20 73 65 74  s useful for set
48f0: 74 69 6e 67 20 61 20 6a 75 6d 70 20 64 65 73 74  ting a jump dest
4900: 69 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  ination..*/.void
4910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
4920: 67 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33  geP2(Vdbe *p, u3
4930: 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29  2 addr, int val)
4940: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  {.  assert( p!=0
4950: 20 29 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29   );.  if( ((u32)
4960: 70 2d 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a  p->nOp)>addr ){.
4970: 20 20 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d      p->aOp[addr]
4980: 2e 70 32 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d  .p2 = val;.  }.}
4990: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
49a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
49b0: 50 33 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 61  P3 operand for a
49c0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
49d0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
49e0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
49f0: 50 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20  P3(Vdbe *p, u32 
4a00: 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a  addr, int val){.
4a10: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
4a20: 3b 0a 20 20 69 66 28 20 28 28 75 33 32 29 70 2d  ;.  if( ((u32)p-
4a30: 3e 6e 4f 70 29 3e 61 64 64 72 20 29 7b 0a 20 20  >nOp)>addr ){.  
4a40: 20 20 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 2e 70    p->aOp[addr].p
4a50: 33 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a 0a  3 = val;.  }.}..
4a60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
4a70: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 50 35   value of the P5
4a80: 20 6f 70 65 72 61 6e 64 20 66 6f 72 20 74 68 65   operand for the
4a90: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 0a 2a   most recently.*
4aa0: 2a 20 61 64 64 65 64 20 6f 70 65 72 61 74 69 6f  * added operatio
4ab0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
4ac0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 56  e3VdbeChangeP5(V
4ad0: 64 62 65 20 2a 70 2c 20 75 38 20 76 61 6c 29 7b  dbe *p, u8 val){
4ae0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
4af0: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4f 70 20  );.  if( p->aOp 
4b00: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
4b10: 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 20 20 70  ->nOp>0 );.    p
4b20: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
4b30: 70 35 20 3d 20 76 61 6c 3b 0a 20 20 7d 0a 7d 0a  p5 = val;.  }.}.
4b40: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
4b50: 65 20 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20  e P2 operand of 
4b60: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
4b70: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
4b80: 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64  ts to.** the add
4b90: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
4ba0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20   instruction to 
4bb0: 62 65 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69  be coded..*/.voi
4bc0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d  d sqlite3VdbeJum
4bd0: 70 48 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69  pHere(Vdbe *p, i
4be0: 6e 74 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69  nt addr){.  sqli
4bf0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
4c00: 70 2c 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29  p, addr, p->nOp)
4c10: 3b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d 3e 69  ;.  p->pParse->i
4c20: 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e 4f 70  FixedOp = p->nOp
4c30: 20 2d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   - 1;.}.../*.** 
4c40: 49 66 20 74 68 65 20 69 6e 70 75 74 20 46 75 6e  If the input Fun
4c50: 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20 69  cDef structure i
4c60: 73 20 65 70 68 65 6d 65 72 61 6c 2c 20 74 68 65  s ephemeral, the
4c70: 6e 20 66 72 65 65 20 69 74 2e 20 20 49 66 0a 2a  n free it.  If.*
4c80: 2a 20 74 68 65 20 46 75 6e 63 44 65 66 20 69 73  * the FuncDef is
4c90: 20 6e 6f 74 20 65 70 68 65 72 6d 61 6c 2c 20 74   not ephermal, t
4ca0: 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a  hen do nothing..
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66  */.static void f
4cc0: 72 65 65 45 70 68 65 6d 65 72 61 6c 46 75 6e 63  reeEphemeralFunc
4cd0: 74 69 6f 6e 28 73 71 6c 69 74 65 33 20 2a 64 62  tion(sqlite3 *db
4ce0: 2c 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 29  , FuncDef *pDef)
4cf0: 7b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70  {.  if( ALWAYS(p
4d00: 44 65 66 29 20 26 26 20 28 70 44 65 66 2d 3e 66  Def) && (pDef->f
4d10: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
4d20: 45 5f 46 55 4e 43 5f 45 50 48 45 4d 29 21 3d 30  E_FUNC_EPHEM)!=0
4d30: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
4d40: 62 46 72 65 65 28 64 62 2c 20 70 44 65 66 29 3b  bFree(db, pDef);
4d50: 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
4d60: 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41 72  oid vdbeFreeOpAr
4d70: 72 61 79 28 73 71 6c 69 74 65 33 20 2a 2c 20 4f  ray(sqlite3 *, O
4d80: 70 20 2a 2c 20 69 6e 74 29 3b 0a 0a 2f 2a 0a 2a  p *, int);../*.*
4d90: 2a 20 44 65 6c 65 74 65 20 61 20 50 34 20 76 61  * Delete a P4 va
4da0: 6c 75 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  lue if necessary
4db0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4dc0: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
4dd0: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
4de0: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 69 66   void *p4){.  if
4df0: 28 20 70 34 20 29 7b 0a 20 20 20 20 61 73 73 65  ( p4 ){.    asse
4e00: 72 74 28 20 64 62 20 29 3b 0a 20 20 20 20 73 77  rt( db );.    sw
4e10: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
4e20: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 52 45        case P4_RE
4e30: 41 4c 3a 0a 20 20 20 20 20 20 63 61 73 65 20 50  AL:.      case P
4e40: 34 5f 49 4e 54 36 34 3a 0a 20 20 20 20 20 20 63  4_INT64:.      c
4e50: 61 73 65 20 50 34 5f 44 59 4e 41 4d 49 43 3a 0a  ase P4_DYNAMIC:.
4e60: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e        case P4_IN
4e70: 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20  TARRAY: {.      
4e80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4e90: 64 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 20  db, p4);.       
4ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4eb0: 20 20 20 20 20 20 63 61 73 65 20 50 34 5f 4b 45        case P4_KE
4ec0: 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20 20 20 20  YINFO: {.       
4ed0: 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65 73   if( db->pnBytes
4ee0: 46 72 65 65 64 3d 3d 30 20 29 20 73 71 6c 69 74  Freed==0 ) sqlit
4ef0: 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 28  e3KeyInfoUnref((
4f00: 4b 65 79 49 6e 66 6f 2a 29 70 34 29 3b 0a 20 20  KeyInfo*)p4);.  
4f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f20: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20     }.      case 
4f30: 50 34 5f 4d 50 52 49 4e 54 46 3a 20 7b 0a 20 20  P4_MPRINTF: {.  
4f40: 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e        if( db->pn
4f50: 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29 20  BytesFreed==0 ) 
4f60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 34 29  sqlite3_free(p4)
4f70: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
4f80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
4f90: 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a 20  ase P4_FUNCDEF: 
4fa0: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 45 70  {.        freeEp
4fb0: 68 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28  hemeralFunction(
4fc0: 64 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34  db, (FuncDef*)p4
4fd0: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4fe0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4ff0: 63 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20  case P4_MEM: {. 
5000: 20 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e 70         if( db->p
5010: 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20 29  nBytesFreed==0 )
5020: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5030: 74 65 33 56 61 6c 75 65 46 72 65 65 28 28 73 71  te3ValueFree((sq
5040: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 70 34 29  lite3_value*)p4)
5050: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5060: 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 20 2a  .          Mem *
5070: 70 20 3d 20 28 4d 65 6d 2a 29 70 34 3b 0a 20 20  p = (Mem*)p4;.  
5080: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
5090: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
50a0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
50b0: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
50c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
50d0: 28 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20  (db, p);.       
50e0: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
50f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5100: 63 61 73 65 20 50 34 5f 56 54 41 42 20 3a 20 7b  case P4_VTAB : {
5110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 64 62 2d  .        if( db-
5120: 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30  >pnBytesFreed==0
5130: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e   ) sqlite3VtabUn
5140: 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a 29 70  lock((VTable *)p
5150: 34 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  4);.        brea
5160: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
5170: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72  .  }.}../*.** Fr
5180: 65 65 20 74 68 65 20 73 70 61 63 65 20 61 6c 6c  ee the space all
5190: 6f 63 61 74 65 64 20 66 6f 72 20 61 4f 70 20 61  ocated for aOp a
51a0: 6e 64 20 61 6e 79 20 70 34 20 76 61 6c 75 65 73  nd any p4 values
51b0: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 74   allocated for t
51c0: 68 65 0a 2a 2a 20 6f 70 63 6f 64 65 73 20 63 6f  he.** opcodes co
51d0: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 2e 20  ntained within. 
51e0: 49 66 20 61 4f 70 20 69 73 20 6e 6f 74 20 4e 55  If aOp is not NU
51f0: 4c 4c 20 69 74 20 69 73 20 61 73 73 75 6d 65 64  LL it is assumed
5200: 20 74 6f 20 63 6f 6e 74 61 69 6e 20 0a 2a 2a 20   to contain .** 
5210: 6e 4f 70 20 65 6e 74 72 69 65 73 2e 20 0a 2a 2f  nOp entries. .*/
5220: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
5230: 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71 6c  eFreeOpArray(sql
5240: 69 74 65 33 20 2a 64 62 2c 20 4f 70 20 2a 61 4f  ite3 *db, Op *aO
5250: 70 2c 20 69 6e 74 20 6e 4f 70 29 7b 0a 20 20 69  p, int nOp){.  i
5260: 66 28 20 61 4f 70 20 29 7b 0a 20 20 20 20 4f 70  f( aOp ){.    Op
5270: 20 2a 70 4f 70 3b 0a 20 20 20 20 66 6f 72 28 70   *pOp;.    for(p
5280: 4f 70 3d 61 4f 70 3b 20 70 4f 70 3c 26 61 4f 70  Op=aOp; pOp<&aOp
5290: 5b 6e 4f 70 5d 3b 20 70 4f 70 2b 2b 29 7b 0a 20  [nOp]; pOp++){. 
52a0: 20 20 20 20 20 66 72 65 65 50 34 28 64 62 2c 20       freeP4(db, 
52b0: 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70  pOp->p4type, pOp
52c0: 2d 3e 70 34 2e 70 29 3b 0a 23 69 66 64 65 66 20  ->p4.p);.#ifdef 
52d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
52e0: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20  PLAIN_COMMENTS. 
52f0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5300: 65 65 28 64 62 2c 20 70 4f 70 2d 3e 7a 43 6f 6d  ee(db, pOp->zCom
5310: 6d 65 6e 74 29 3b 0a 23 65 6e 64 69 66 20 20 20  ment);.#endif   
5320: 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73    .    }.  }.  s
5330: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5340: 20 61 4f 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   aOp);.}../*.** 
5350: 4c 69 6e 6b 20 74 68 65 20 53 75 62 50 72 6f 67  Link the SubProg
5360: 72 61 6d 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ram object passe
5370: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
5380: 61 72 67 75 6d 65 6e 74 20 69 6e 74 6f 20 74 68  argument into th
5390: 65 20 6c 69 6e 6b 65 64 0a 2a 2a 20 6c 69 73 74  e linked.** list
53a0: 20 61 74 20 56 64 62 65 2e 70 53 75 62 50 72 6f   at Vdbe.pSubPro
53b0: 67 72 61 6d 2e 20 54 68 69 73 20 6c 69 73 74 20  gram. This list 
53c0: 69 73 20 75 73 65 64 20 74 6f 20 64 65 6c 65 74  is used to delet
53d0: 65 20 61 6c 6c 20 73 75 62 2d 70 72 6f 67 72 61  e all sub-progra
53e0: 6d 0a 2a 2a 20 6f 62 6a 65 63 74 73 20 77 68 65  m.** objects whe
53f0: 6e 20 74 68 65 20 56 4d 20 69 73 20 6e 6f 20 6c  n the VM is no l
5400: 6f 6e 67 65 72 20 72 65 71 75 69 72 65 64 2e 0a  onger required..
5410: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
5420: 64 62 65 4c 69 6e 6b 53 75 62 50 72 6f 67 72 61  dbeLinkSubProgra
5430: 6d 28 56 64 62 65 20 2a 70 56 64 62 65 2c 20 53  m(Vdbe *pVdbe, S
5440: 75 62 50 72 6f 67 72 61 6d 20 2a 70 29 7b 0a 20  ubProgram *p){. 
5450: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 56 64 62   p->pNext = pVdb
5460: 65 2d 3e 70 50 72 6f 67 72 61 6d 3b 0a 20 20 70  e->pProgram;.  p
5470: 56 64 62 65 2d 3e 70 50 72 6f 67 72 61 6d 20 3d  Vdbe->pProgram =
5480: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61   p;.}../*.** Cha
5490: 6e 67 65 20 74 68 65 20 6f 70 63 6f 64 65 20 61  nge the opcode a
54a0: 74 20 61 64 64 72 20 69 6e 74 6f 20 4f 50 5f 4e  t addr into OP_N
54b0: 6f 6f 70 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  oop.*/.void sqli
54c0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 54 6f 4e  te3VdbeChangeToN
54d0: 6f 6f 70 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  oop(Vdbe *p, int
54e0: 20 61 64 64 72 29 7b 0a 20 20 69 66 28 20 61 64   addr){.  if( ad
54f0: 64 72 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20  dr<p->nOp ){.   
5500: 20 56 64 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26   VdbeOp *pOp = &
5510: 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20  p->aOp[addr];.  
5520: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5530: 70 2d 3e 64 62 3b 0a 20 20 20 20 66 72 65 65 50  p->db;.    freeP
5540: 34 28 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70  4(db, pOp->p4typ
5550: 65 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20  e, pOp->p4.p);. 
5560: 20 20 20 6d 65 6d 73 65 74 28 70 4f 70 2c 20 30     memset(pOp, 0
5570: 2c 20 73 69 7a 65 6f 66 28 70 4f 70 5b 30 5d 29  , sizeof(pOp[0])
5580: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 6f 70 63 6f  );.    pOp->opco
5590: 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a 20 20  de = OP_Noop;.  
55a0: 20 20 69 66 28 20 61 64 64 72 3d 3d 70 2d 3e 6e    if( addr==p->n
55b0: 4f 70 2d 31 20 29 20 70 2d 3e 6e 4f 70 2d 2d 3b  Op-1 ) p->nOp--;
55c0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  .  }.}../*.** If
55d0: 20 74 68 65 20 6c 61 73 74 20 6f 70 63 6f 64 65   the last opcode
55e0: 20 69 73 20 22 6f 70 22 20 61 6e 64 20 69 74 20   is "op" and it 
55f0: 69 73 20 6e 6f 74 20 61 20 6a 75 6d 70 20 64 65  is not a jump de
5600: 73 74 69 6e 61 74 69 6f 6e 2c 0a 2a 2a 20 74 68  stination,.** th
5610: 65 6e 20 72 65 6d 6f 76 65 20 69 74 2e 20 20 52  en remove it.  R
5620: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
5630: 64 20 6f 6e 6c 79 20 69 66 20 61 6e 20 6f 70 63  d only if an opc
5640: 6f 64 65 20 77 61 73 20 72 65 6d 6f 76 65 64 2e  ode was removed.
5650: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
5660: 64 62 65 44 65 6c 65 74 65 50 72 69 6f 72 4f 70  dbeDeletePriorOp
5670: 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20 75 38  code(Vdbe *p, u8
5680: 20 6f 70 29 7b 0a 20 20 69 66 28 20 28 70 2d 3e   op){.  if( (p->
5690: 6e 4f 70 2d 31 29 3e 28 70 2d 3e 70 50 61 72 73  nOp-1)>(p->pPars
56a0: 65 2d 3e 69 46 69 78 65 64 4f 70 29 20 26 26 20  e->iFixedOp) && 
56b0: 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d  p->aOp[p->nOp-1]
56c0: 2e 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20  .opcode==op ){. 
56d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
56e0: 61 6e 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d  angeToNoop(p, p-
56f0: 3e 6e 4f 70 2d 31 29 3b 0a 20 20 20 20 72 65 74  >nOp-1);.    ret
5700: 75 72 6e 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 1;.  }else{.
5710: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5720: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
5730: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
5740: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
5750: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
5760: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
5770: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
5780: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
5790: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
57a0: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
57b0: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
57c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
57d0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
57e0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
57f0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
5800: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
5810: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
5820: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
5830: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
5840: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
5850: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
5860: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
5870: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
5880: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
5890: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
58a0: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
58b0: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
58c0: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
58d0: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
58e0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
58f0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
5900: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
5910: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
5920: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
5930: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
5940: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
5950: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
5960: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
5970: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
5980: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
5990: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
59a0: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
59b0: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
59c0: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
59d0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
59e0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
59f0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
5a00: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
5a10: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
5a20: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
5a30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5a40: 56 64 62 65 43 68 61 6e 67 65 50 34 28 56 64 62  VdbeChangeP4(Vdb
5a50: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 2c 20  e *p, int addr, 
5a60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
5a70: 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70 20 2a 70   int n){.  Op *p
5a80: 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  Op;.  sqlite3 *d
5a90: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  b;.  assert( p!=
5aa0: 30 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  0 );.  db = p->d
5ab0: 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
5ac0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5ad0: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5ae0: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 64 62 2d  p->aOp==0 || db-
5af0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
5b00: 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f 56  .    if( n!=P4_V
5b10: 54 41 42 20 29 7b 0a 20 20 20 20 20 20 66 72 65  TAB ){.      fre
5b20: 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f 69 64  eP4(db, n, (void
5b30: 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50 34 29  *)*(char**)&zP4)
5b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
5b50: 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
5b60: 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20  ( p->nOp>0 );.  
5b70: 61 73 73 65 72 74 28 20 61 64 64 72 3c 70 2d 3e  assert( addr<p->
5b80: 6e 4f 70 20 29 3b 0a 20 20 69 66 28 20 61 64 64  nOp );.  if( add
5b90: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
5ba0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
5bb0: 7d 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  }.  pOp = &p->aO
5bc0: 70 5b 61 64 64 72 5d 3b 0a 20 20 61 73 73 65 72  p[addr];.  asser
5bd0: 74 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  t( pOp->p4type==
5be0: 50 34 5f 4e 4f 54 55 53 45 44 0a 20 20 20 20 20  P4_NOTUSED.     
5bf0: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
5c00: 3d 3d 50 34 5f 49 4e 54 33 32 0a 20 20 20 20 20  ==P4_INT32.     
5c10: 20 20 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65    || pOp->p4type
5c20: 3d 3d 50 34 5f 4b 45 59 49 4e 46 4f 20 29 3b 0a  ==P4_KEYINFO );.
5c30: 20 20 66 72 65 65 50 34 28 64 62 2c 20 70 4f 70    freeP4(db, pOp
5c40: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
5c50: 34 2e 70 29 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  4.p);.  pOp->p4.
5c60: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6e 3d 3d  p = 0;.  if( n==
5c70: 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20 20  P4_INT32 ){.    
5c80: 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63 61  /* Note: this ca
5c90: 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63 61  st is safe, beca
5ca0: 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20 64  use the origin d
5cb0: 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61 6e  ata point was an
5cc0: 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61 74   int.    ** that
5cd0: 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20 28   was cast to a (
5ce0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20 2a  const char *). *
5cf0: 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69 20  /.    pOp->p4.i 
5d00: 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  = SQLITE_PTR_TO_
5d10: 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  INT(zP4);.    pO
5d20: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 49  p->p4type = P4_I
5d30: 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  NT32;.  }else if
5d40: 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20 20 20 20  ( zP4==0 ){.    
5d50: 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  pOp->p4.p = 0;. 
5d60: 20 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d     pOp->p4type =
5d70: 20 50 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 7d   P4_NOTUSED;.  }
5d80: 65 6c 73 65 20 69 66 28 20 6e 3d 3d 50 34 5f 4b  else if( n==P4_K
5d90: 45 59 49 4e 46 4f 20 29 7b 0a 20 20 20 20 70 4f  EYINFO ){.    pO
5da0: 70 2d 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a  p->p4.p = (void*
5db0: 29 7a 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  )zP4;.    pOp->p
5dc0: 34 74 79 70 65 20 3d 20 50 34 5f 4b 45 59 49 4e  4type = P4_KEYIN
5dd0: 46 4f 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  FO;.  }else if( 
5de0: 6e 3d 3d 50 34 5f 56 54 41 42 20 29 7b 0a 20 20  n==P4_VTAB ){.  
5df0: 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20 28 76    pOp->p4.p = (v
5e00: 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20 70 4f  oid*)zP4;.    pO
5e10: 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 56  p->p4type = P4_V
5e20: 54 41 42 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  TAB;.    sqlite3
5e30: 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62 6c 65  VtabLock((VTable
5e40: 20 2a 29 7a 50 34 29 3b 0a 20 20 20 20 61 73 73   *)zP4);.    ass
5e50: 65 72 74 28 20 28 28 56 54 61 62 6c 65 20 2a 29  ert( ((VTable *)
5e60: 7a 50 34 29 2d 3e 64 62 3d 3d 70 2d 3e 64 62 20  zP4)->db==p->db 
5e70: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  );.  }else if( n
5e80: 3c 30 20 29 7b 0a 20 20 20 20 70 4f 70 2d 3e 70  <0 ){.    pOp->p
5e90: 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a 50 34  4.p = (void*)zP4
5ea0: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70  ;.    pOp->p4typ
5eb0: 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68 61 72  e = (signed char
5ec0: 29 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  )n;.  }else{.   
5ed0: 20 69 66 28 20 6e 3d 3d 30 20 29 20 6e 20 3d 20   if( n==0 ) n = 
5ee0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
5ef0: 7a 50 34 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  zP4);.    pOp->p
5f00: 34 2e 7a 20 3d 20 73 71 6c 69 74 65 33 44 62 53  4.z = sqlite3DbS
5f10: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 50  trNDup(p->db, zP
5f20: 34 2c 20 6e 29 3b 0a 20 20 20 20 70 4f 70 2d 3e  4, n);.    pOp->
5f30: 70 34 74 79 70 65 20 3d 20 50 34 5f 44 59 4e 41  p4type = P4_DYNA
5f40: 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  MIC;.  }.}../*.*
5f50: 2a 20 53 65 74 20 74 68 65 20 50 34 20 6f 6e 20  * Set the P4 on 
5f60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
5f70: 79 20 61 64 64 65 64 20 6f 70 63 6f 64 65 20 74  y added opcode t
5f80: 6f 20 74 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f  o the KeyInfo fo
5f90: 72 20 74 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67  r the.** index g
5fa0: 69 76 65 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  iven..*/.void sq
5fb0: 6c 69 74 65 33 56 64 62 65 53 65 74 50 34 4b 65  lite3VdbeSetP4Ke
5fc0: 79 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61  yInfo(Parse *pPa
5fd0: 72 73 65 2c 20 49 6e 64 65 78 20 2a 70 49 64 78  rse, Index *pIdx
5fe0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
5ff0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
6000: 61 73 73 65 72 74 28 20 76 21 3d 30 20 29 3b 0a  assert( v!=0 );.
6010: 20 20 61 73 73 65 72 74 28 20 70 49 64 78 21 3d    assert( pIdx!=
6020: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
6030: 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
6040: 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  , (char*)sqlite3
6050: 4b 65 79 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70  KeyInfoOfIndex(p
6060: 50 61 72 73 65 2c 20 70 49 64 78 29 2c 0a 20 20  Parse, pIdx),.  
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b      P4_KEYINFO);
6090: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
60a0: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
60b0: 5f 43 4f 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20  _COMMENTS./*.** 
60c0: 43 68 61 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65  Change the comme
60d0: 6e 74 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72  nt on the most r
60e0: 65 63 65 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e  ecently coded in
60f0: 73 74 72 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a  struction.  Or.*
6100: 2a 20 69 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70  * insert a No-op
6110: 20 61 6e 64 20 61 64 64 20 74 68 65 20 63 6f 6d   and add the com
6120: 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6e 65 77  ment to that new
6130: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20 20 54   instruction.  T
6140: 68 69 73 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65  his.** makes the
6150: 20 63 6f 64 65 20 65 61 73 69 65 72 20 74 6f 20   code easier to 
6160: 72 65 61 64 20 64 75 72 69 6e 67 20 64 65 62 75  read during debu
6170: 67 67 69 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20  gging.  None of 
6180: 74 68 69 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20  this happens.** 
6190: 69 6e 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20  in a production 
61a0: 62 75 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  build..*/.static
61b0: 20 76 6f 69 64 20 76 64 62 65 56 43 6f 6d 6d 65   void vdbeVComme
61c0: 6e 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  nt(Vdbe *p, cons
61d0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
61e0: 20 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20   va_list ap){.  
61f0: 61 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30  assert( p->nOp>0
6200: 20 7c 7c 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b   || p->aOp==0 );
6210: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f  .  assert( p->aO
6220: 70 3d 3d 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70  p==0 || p->aOp[p
6230: 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e  ->nOp-1].zCommen
6240: 74 3d 3d 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  t==0 || p->db->m
6250: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6260: 20 69 66 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20   if( p->nOp ){. 
6270: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4f     assert( p->aO
6280: 70 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  p );.    sqlite3
6290: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d  DbFree(p->db, p-
62a0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
62b0: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d  Comment);.    p-
62c0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a  >aOp[p->nOp-1].z
62d0: 43 6f 6d 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65  Comment = sqlite
62e0: 33 56 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  3VMPrintf(p->db,
62f0: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
6300: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
6310: 33 56 64 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62  3VdbeComment(Vdb
6320: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
6330: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
6340: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6350: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 76 61   if( p ){.    va
6360: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
6370: 61 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f  at);.    vdbeVCo
6380: 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74  mment(p, zFormat
6390: 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e  , ap);.    va_en
63a0: 64 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69  d(ap);.  }.}.voi
63b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f  d sqlite3VdbeNoo
63c0: 70 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70  pComment(Vdbe *p
63d0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
63e0: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
63f0: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28  a_list ap;.  if(
6400: 20 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65   p ){.    sqlite
6410: 33 56 64 62 65 41 64 64 4f 70 30 28 70 2c 20 4f  3VdbeAddOp0(p, O
6420: 50 5f 4e 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f  P_Noop);.    va_
6430: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
6440: 74 29 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d  t);.    vdbeVCom
6450: 6d 65 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c  ment(p, zFormat,
6460: 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64   ap);.    va_end
6470: 28 61 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  (ap);.  }.}.#end
6480: 69 66 20 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f  if  /* NDEBUG */
6490: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
64a0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a  VDBE_COVERAGE./*
64b0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
64c0: 65 20 69 66 20 74 68 65 20 69 53 72 63 4c 69 6e  e if the iSrcLin
64d0: 65 20 66 69 65 6c 64 20 66 6f 72 20 74 68 65 20  e field for the 
64e0: 70 72 65 76 69 6f 75 73 6c 79 20 63 6f 64 65 64  previously coded
64f0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f   instruction..*/
6500: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
6510: 65 53 65 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56  eSetLineNumber(V
6520: 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e  dbe *v, int iLin
6530: 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  e){.  sqlite3Vdb
6540: 65 47 65 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53  eGetOp(v,-1)->iS
6550: 72 63 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a  rcLine = iLine;.
6560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
6570: 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45  TE_VDBE_COVERAGE
6580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
6590: 6e 20 74 68 65 20 6f 70 63 6f 64 65 20 66 6f 72  n the opcode for
65a0: 20 61 20 67 69 76 65 6e 20 61 64 64 72 65 73 73   a given address
65b0: 2e 20 20 49 66 20 74 68 65 20 61 64 64 72 65 73  .  If the addres
65c0: 73 20 69 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a  s is -1, then.**
65d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74   return the most
65e0: 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72 74   recently insert
65f0: 65 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ed opcode..**.**
6600: 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c   If a memory all
6610: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 68 61  ocation error ha
6620: 73 20 6f 63 63 75 72 72 65 64 20 70 72 69 6f 72  s occurred prior
6630: 20 74 6f 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   to the calling 
6640: 6f 66 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  of this.** routi
6650: 6e 65 2c 20 74 68 65 6e 20 61 20 70 6f 69 6e 74  ne, then a point
6660: 65 72 20 74 6f 20 61 20 64 75 6d 6d 79 20 56 64  er to a dummy Vd
6670: 62 65 4f 70 20 77 69 6c 6c 20 62 65 20 72 65 74  beOp will be ret
6680: 75 72 6e 65 64 2e 20 20 54 68 61 74 20 6f 70 63  urned.  That opc
6690: 6f 64 65 0a 2a 2a 20 69 73 20 72 65 61 64 61 62  ode.** is readab
66a0: 6c 65 20 62 75 74 20 6e 6f 74 20 77 72 69 74 61  le but not writa
66b0: 62 6c 65 2c 20 74 68 6f 75 67 68 20 69 74 20 69  ble, though it i
66c0: 73 20 63 61 73 74 20 74 6f 20 61 20 77 72 69 74  s cast to a writ
66d0: 61 62 6c 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54  able value..** T
66e0: 68 65 20 72 65 74 75 72 6e 20 6f 66 20 61 20 64  he return of a d
66f0: 75 6d 6d 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f  ummy opcode allo
6700: 77 73 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63  ws the call to c
6710: 6f 6e 74 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e  ontinue function
6720: 69 6e 67 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20  ing.** after an 
6730: 4f 4f 4d 20 66 61 75 6c 74 20 77 69 74 68 6f 75  OOM fault withou
6740: 74 20 68 61 76 69 6e 67 20 74 6f 20 63 68 65 63  t having to chec
6750: 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
6760: 72 65 74 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20  return from .** 
6770: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
6780: 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
6790: 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
67a0: 65 20 64 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69  e dummy.opcode i
67b0: 73 20 30 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69  s 0,.** dummy wi
67c0: 6c 6c 20 6e 65 76 65 72 20 62 65 20 77 72 69 74  ll never be writ
67d0: 74 65 6e 20 74 6f 2e 20 20 54 68 69 73 20 69 73  ten to.  This is
67e0: 20 76 65 72 69 66 69 65 64 20 62 79 20 63 6f 64   verified by cod
67f0: 65 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  e inspection and
6800: 0a 2a 2a 20 62 79 20 72 75 6e 6e 69 6e 67 20 77  .** by running w
6810: 69 74 68 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f  ith Valgrind..*/
6820: 0a 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33  .VdbeOp *sqlite3
6830: 56 64 62 65 47 65 74 4f 70 28 56 64 62 65 20 2a  VdbeGetOp(Vdbe *
6840: 70 2c 20 69 6e 74 20 61 64 64 72 29 7b 0a 20 20  p, int addr){.  
6850: 2f 2a 20 43 38 39 20 73 70 65 63 69 66 69 65 73  /* C89 specifies
6860: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 73 74 61   that the consta
6870: 6e 74 20 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20  nt "dummy" will 
6880: 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  be initialized t
6890: 6f 20 61 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73  o all.  ** zeros
68a0: 2c 20 77 68 69 63 68 20 69 73 20 63 6f 72 72 65  , which is corre
68b0: 63 74 2e 20 20 4d 53 56 43 20 67 65 6e 65 72 61  ct.  MSVC genera
68c0: 74 65 73 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e  tes a warning, n
68d0: 65 76 65 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a  evertheless. */.
68e0: 20 20 73 74 61 74 69 63 20 56 64 62 65 4f 70 20    static VdbeOp 
68f0: 64 75 6d 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72  dummy;  /* Ignor
6900: 65 20 74 68 65 20 4d 53 56 43 20 77 61 72 6e 69  e the MSVC warni
6910: 6e 67 20 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74  ng about no init
6920: 69 61 6c 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73  ializer */.  ass
6930: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
6940: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
6950: 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20 29  ;.  if( addr<0 )
6960: 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d 3e  {.    addr = p->
6970: 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61  nOp - 1;.  }.  a
6980: 73 73 65 72 74 28 20 28 61 64 64 72 3e 3d 30 20  ssert( (addr>=0 
6990: 26 26 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20  && addr<p->nOp) 
69a0: 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  || p->db->malloc
69b0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20  Failed );.  if( 
69c0: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
69d0: 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72  led ){.    retur
69e0: 6e 20 28 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d  n (VdbeOp*)&dumm
69f0: 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  y;.  }else{.    
6a00: 72 65 74 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61  return &p->aOp[a
6a10: 64 64 72 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  ddr];.  }.}..#if
6a20: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6a30: 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43  ENABLE_EXPLAIN_C
6a40: 4f 4d 4d 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52  OMMENTS)./*.** R
6a50: 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72  eturn an integer
6a60: 20 76 61 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f   value for one o
6a70: 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 73  f the parameters
6a80: 20 74 6f 20 74 68 65 20 6f 70 63 6f 64 65 20 70   to the opcode p
6a90: 4f 70 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64  Op.** determined
6aa0: 20 62 79 20 63 68 61 72 61 63 74 65 72 20 63 2e   by character c.
6ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
6ac0: 72 61 6e 73 6c 61 74 65 50 28 63 68 61 72 20 63  ranslateP(char c
6ad0: 2c 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29  , const Op *pOp)
6ae0: 7b 0a 20 20 69 66 28 20 63 3d 3d 27 31 27 20 29  {.  if( c=='1' )
6af0: 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b   return pOp->p1;
6b00: 0a 20 20 69 66 28 20 63 3d 3d 27 32 27 20 29 20  .  if( c=='2' ) 
6b10: 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a  return pOp->p2;.
6b20: 20 20 69 66 28 20 63 3d 3d 27 33 27 20 29 20 72    if( c=='3' ) r
6b30: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20  eturn pOp->p3;. 
6b40: 20 69 66 28 20 63 3d 3d 27 34 27 20 29 20 72 65   if( c=='4' ) re
6b50: 74 75 72 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a  turn pOp->p4.i;.
6b60: 20 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35    return pOp->p5
6b70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
6b80: 74 65 20 61 20 73 74 72 69 6e 67 20 66 6f 72 20  te a string for 
6b90: 74 68 65 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69  the "comment" fi
6ba0: 65 6c 64 20 6f 66 20 61 20 56 44 42 45 20 6f 70  eld of a VDBE op
6bb0: 63 6f 64 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a  code listing..**
6bc0: 0a 2a 2a 20 54 68 65 20 53 79 6e 6f 70 73 69 73  .** The Synopsis
6bd0: 3a 20 66 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65  : field in comme
6be0: 6e 74 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e  nts in the vdbe.
6bf0: 63 20 73 6f 75 72 63 65 20 66 69 6c 65 20 67 65  c source file ge
6c00: 74 73 20 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20  ts converted.** 
6c10: 74 6f 20 61 6e 20 65 78 74 72 61 20 73 74 72 69  to an extra stri
6c20: 6e 67 20 74 68 61 74 20 69 73 20 61 70 70 65 6e  ng that is appen
6c30: 64 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  ded to the sqlit
6c40: 65 33 4f 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20  e3OpcodeName(). 
6c50: 20 49 6e 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e   In the.** absen
6c60: 63 65 20 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d  ce of other comm
6c70: 65 6e 74 73 2c 20 74 68 69 73 20 73 79 6e 6f 70  ents, this synop
6c80: 73 69 73 20 62 65 63 6f 6d 65 73 20 74 68 65 20  sis becomes the 
6c90: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f  comment on the o
6ca0: 70 63 6f 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74  pcode..** Some t
6cb0: 72 61 6e 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72  ranslation occur
6cc0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22  s:.**.**       "
6cd0: 50 58 22 20 20 20 20 20 20 2d 3e 20 20 22 72 5b  PX"      ->  "r[
6ce0: 58 5d 22 0a 2a 2a 20 20 20 20 20 20 20 22 50 58  X]".**       "PX
6cf0: 40 50 59 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e  @PY"   ->  "r[X.
6d00: 2e 58 2b 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b  .X+Y-1]"  or "r[
6d10: 78 5d 22 20 69 66 20 79 20 69 73 20 30 20 6f 72  x]" if y is 0 or
6d20: 20 31 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40   1.**       "PX@
6d30: 50 59 2b 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e  PY+1" ->  "r[X..
6d40: 58 2b 59 5d 22 20 20 20 20 6f 72 20 22 72 5b 78  X+Y]"    or "r[x
6d50: 5d 22 20 69 66 20 79 20 69 73 20 30 0a 2a 2a 20  ]" if y is 0.** 
6d60: 20 20 20 20 20 20 22 50 59 2e 2e 50 59 22 20 20        "PY..PY"  
6d70: 2d 3e 20 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20  ->  "r[X..Y]"   
6d80: 20 20 20 6f 72 20 22 72 5b 78 5d 22 20 69 66 20     or "r[x]" if 
6d90: 79 3c 3d 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69  y<=x.*/.static i
6da0: 6e 74 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e  nt displayCommen
6db0: 74 28 0a 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70  t(.  const Op *p
6dc0: 4f 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  Op,     /* The o
6dd0: 70 63 6f 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d  pcode to be comm
6de0: 65 6e 74 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ented */.  const
6df0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a   char *zP4,   /*
6e00: 20 50 72 65 76 69 6f 75 73 6c 79 20 6f 62 74 61   Previously obta
6e10: 69 6e 65 64 20 76 61 6c 75 65 20 66 6f 72 20 50  ined value for P
6e20: 34 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65  4 */.  char *zTe
6e30: 6d 70 2c 20 20 20 20 20 20 20 2f 2a 20 57 72 69  mp,       /* Wri
6e40: 74 65 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a  te result here *
6e50: 2f 0a 20 20 69 6e 74 20 6e 54 65 6d 70 20 20 20  /.  int nTemp   
6e60: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
6e70: 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65  available in zTe
6e80: 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  mp[] */.){.  con
6e90: 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65  st char *zOpName
6ea0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6eb0: 7a 53 79 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74  zSynopsis;.  int
6ec0: 20 6e 4f 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20   nOpName;.  int 
6ed0: 69 69 2c 20 6a 6a 3b 0a 20 20 7a 4f 70 4e 61 6d  ii, jj;.  zOpNam
6ee0: 65 20 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64  e = sqlite3Opcod
6ef0: 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64  eName(pOp->opcod
6f00: 65 29 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20  e);.  nOpName = 
6f10: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
6f20: 7a 4f 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zOpName);.  if( 
6f30: 7a 4f 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b  zOpName[nOpName+
6f40: 31 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65  1] ){.    int se
6f50: 65 6e 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63  enCom = 0;.    c
6f60: 68 61 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f  har c;.    zSyno
6f70: 70 73 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b  psis = zOpName +
6f80: 3d 20 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20  = nOpName + 1;. 
6f90: 20 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20     for(ii=jj=0; 
6fa0: 6a 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63  jj<nTemp-1 && (c
6fb0: 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d   = zSynopsis[ii]
6fc0: 29 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  )!=0; ii++){.   
6fd0: 20 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b     if( c=='P' ){
6fe0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79  .        c = zSy
6ff0: 6e 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20  nopsis[++ii];.  
7000: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27        if( c=='4'
7010: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7020: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
7030: 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a  Temp-jj, zTemp+j
7040: 6a 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20  j, "%s", zP4);. 
7050: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7060: 20 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20   c=='X' ){.     
7070: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7080: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
7090: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
70a0: 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a  pOp->zComment);.
70b0: 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f            seenCo
70c0: 6d 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  m = 1;.        }
70d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
70e0: 69 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61  int v1 = transla
70f0: 74 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20  teP(c, pOp);.   
7100: 20 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20         int v2;. 
7110: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7120: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d  _snprintf(nTemp-
7130: 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25  jj, zTemp+jj, "%
7140: 64 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20  d", v1);.       
7150: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a     if( strncmp(z
7160: 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22  Synopsis+ii+1, "
7170: 40 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20  @P", 2)==0 ){.  
7180: 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20            ii += 
7190: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  3;.            j
71a0: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
71b0: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d              v2 =
71d0: 20 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e   translateP(zSyn
71e0: 6f 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b  opsis[ii], pOp);
71f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
7200: 20 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73   strncmp(zSynops
7210: 69 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d  is+ii+1,"+1",2)=
7220: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7230: 20 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20      ii += 2;.   
7240: 20 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b             v2++;
7250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
7260: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76             if( v
7270: 32 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  2>1 ){.         
7280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7290: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
72a0: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22  zTemp+jj, "..%d"
72b0: 2c 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20  , v1+v2-1);.    
72c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
72e0: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
72f0: 69 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29  ii+1, "..P3", 4)
7300: 3d 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d  ==0 && pOp->p3==
7310: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
7320: 20 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20   ii += 4;.      
7330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
7340: 20 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71          jj += sq
7350: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
7360: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d  emp+jj);.      }
7370: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54  else{.        zT
7380: 65 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20  emp[jj++] = c;. 
7390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
73a0: 20 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26   if( !seenCom &&
73b0: 20 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70   jj<nTemp-5 && p
73c0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a  Op->zComment ){.
73d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
73e0: 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c  printf(nTemp-jj,
73f0: 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73   zTemp+jj, "; %s
7400: 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74  ", pOp->zComment
7410: 29 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73  );.      jj += s
7420: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
7430: 54 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a  Temp+jj);.    }.
7440: 20 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70      if( jj<nTemp
7450: 20 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30   ) zTemp[jj] = 0
7460: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f  ;.  }else if( pO
7470: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
7480: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7490: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
74a0: 2c 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f  , "%s", pOp->zCo
74b0: 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d  mment);.    jj =
74c0: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
74d0: 28 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65  (zTemp);.  }else
74e0: 7b 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d  {.    zTemp[0] =
74f0: 20 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a   0;.    jj = 0;.
7500: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b    }.  return jj;
7510: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
7520: 49 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 0a 23  ITE_DEBUG */...#
7530: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
7540: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 29  TE_OMIT_EXPLAIN)
7550: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 4e 44 45   || !defined(NDE
7560: 42 55 47 29 20 5c 0a 20 20 20 20 20 7c 7c 20 64  BUG) \.     || d
7570: 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46  efined(VDBE_PROF
7580: 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  ILE) || defined(
7590: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a  SQLITE_DEBUG)./*
75a0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
75b0: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
75c0: 62 65 73 20 74 68 65 20 50 34 20 70 61 72 61 6d  bes the P4 param
75d0: 65 74 65 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f  eter for an opco
75e0: 64 65 2e 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70  de..** Use zTemp
75f0: 20 66 6f 72 20 61 6e 79 20 72 65 71 75 69 72 65   for any require
7600: 64 20 74 65 6d 70 6f 72 61 72 79 20 62 75 66 66  d temporary buff
7610: 65 72 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  er space..*/.sta
7620: 74 69 63 20 63 68 61 72 20 2a 64 69 73 70 6c 61  tic char *displa
7630: 79 50 34 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61  yP4(Op *pOp, cha
7640: 72 20 2a 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54  r *zTemp, int nT
7650: 65 6d 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50  emp){.  char *zP
7660: 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 61 73 73  4 = zTemp;.  ass
7670: 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32 30 20 29  ert( nTemp>=20 )
7680: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f 70 2d  ;.  switch( pOp-
7690: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 63  >p4type ){.    c
76a0: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
76b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a  {.      int i, j
76c0: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
76d0: 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d  *pKeyInfo = pOp-
76e0: 3e 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20  >p4.pKeyInfo;.  
76f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79      assert( pKey
7700: 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
7710: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  !=0 );.      sql
7720: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
7730: 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 6b 28 25  emp, zTemp, "k(%
7740: 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  d", pKeyInfo->nF
7750: 69 65 6c 64 29 3b 0a 20 20 20 20 20 20 69 20 3d  ield);.      i =
7760: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7770: 28 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 66  (zTemp);.      f
7780: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49 6e  or(j=0; j<pKeyIn
7790: 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b 29  fo->nField; j++)
77a0: 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
77b0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79 49  q *pColl = pKeyI
77c0: 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  nfo->aColl[j];. 
77d0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
77e0: 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c 6c  r *zColl = pColl
77f0: 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 20   ? pColl->zName 
7800: 3a 20 22 6e 69 6c 22 3b 0a 20 20 20 20 20 20 20  : "nil";.       
7810: 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33   int n = sqlite3
7820: 53 74 72 6c 65 6e 33 30 28 7a 43 6f 6c 6c 29 3b  Strlen30(zColl);
7830: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3d 3d  .        if( n==
7840: 36 20 26 26 20 6d 65 6d 63 6d 70 28 7a 43 6f 6c  6 && memcmp(zCol
7850: 6c 2c 22 42 49 4e 41 52 59 22 2c 36 29 3d 3d 30  l,"BINARY",6)==0
7860: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43   ){.          zC
7870: 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20 20 20  oll = "B";.     
7880: 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
7890: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
78a0: 28 20 69 2b 6e 3e 6e 54 65 6d 70 2d 36 20 29 7b  ( i+n>nTemp-6 ){
78b0: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
78c0: 79 28 26 7a 54 65 6d 70 5b 69 5d 2c 22 2c 2e 2e  y(&zTemp[i],",..
78d0: 2e 22 2c 34 29 3b 0a 20 20 20 20 20 20 20 20 20  .",4);.         
78e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
78f0: 7d 0a 20 20 20 20 20 20 20 20 7a 54 65 6d 70 5b  }.        zTemp[
7900: 69 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20  i++] = ',';.    
7910: 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
7920: 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d 20  ->aSortOrder[j] 
7930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 54 65  ){.          zTe
7940: 6d 70 5b 69 2b 2b 5d 20 3d 20 27 2d 27 3b 0a 20  mp[i++] = '-';. 
7950: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7960: 20 6d 65 6d 63 70 79 28 26 7a 54 65 6d 70 5b 69   memcpy(&zTemp[i
7970: 5d 2c 20 7a 43 6f 6c 6c 2c 20 6e 2b 31 29 3b 0a  ], zColl, n+1);.
7980: 20 20 20 20 20 20 20 20 69 20 2b 3d 20 6e 3b 0a          i += n;.
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54        }.      zT
79a0: 65 6d 70 5b 69 2b 2b 5d 20 3d 20 27 29 27 3b 0a  emp[i++] = ')';.
79b0: 20 20 20 20 20 20 7a 54 65 6d 70 5b 69 5d 20 3d        zTemp[i] =
79c0: 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   0;.      assert
79d0: 28 20 69 3c 6e 54 65 6d 70 20 29 3b 0a 20 20 20  ( i<nTemp );.   
79e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
79f0: 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c 4c      case P4_COLL
7a00: 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f 6c  SEQ: {.      Col
7a10: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4f  lSeq *pColl = pO
7a20: 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20 20  p->p4.pColl;.   
7a30: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7a40: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7a50: 2c 20 22 28 25 2e 32 30 73 29 22 2c 20 70 43 6f  , "(%.20s)", pCo
7a60: 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  ll->zName);.    
7a70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7a80: 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43 44     case P4_FUNCD
7a90: 45 46 3a 20 7b 0a 20 20 20 20 20 20 46 75 6e 63  EF: {.      Func
7aa0: 44 65 66 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d  Def *pDef = pOp-
7ab0: 3e 70 34 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20  >p4.pFunc;.     
7ac0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
7ad0: 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20  f(nTemp, zTemp, 
7ae0: 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e  "%s(%d)", pDef->
7af0: 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72  zName, pDef->nAr
7b00: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
7b10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7b20: 50 34 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20  P4_INT64: {.    
7b30: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7b40: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7b50: 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d 3e 70   "%lld", *pOp->p
7b60: 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20 20 62  4.pI64);.      b
7b70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
7b80: 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a 20 7b  case P4_INT32: {
7b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
7ba0: 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a  nprintf(nTemp, z
7bb0: 54 65 6d 70 2c 20 22 25 64 22 2c 20 70 4f 70 2d  Temp, "%d", pOp-
7bc0: 3e 70 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72  >p4.i);.      br
7bd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7be0: 61 73 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20  ase P4_REAL: {. 
7bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
7c00: 72 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65  rintf(nTemp, zTe
7c10: 6d 70 2c 20 22 25 2e 31 36 67 22 2c 20 2a 70 4f  mp, "%.16g", *pO
7c20: 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a 20 20  p->p4.pReal);.  
7c30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7c40: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d 45 4d  .    case P4_MEM
7c50: 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a 70  : {.      Mem *p
7c60: 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4d  Mem = pOp->p4.pM
7c70: 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  em;.      if( pM
7c80: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7c90: 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  Str ){.        z
7ca0: 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a 20 20  P4 = pMem->z;.  
7cb0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d      }else if( pM
7cc0: 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
7cd0: 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Int ){.        s
7ce0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7cf0: 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c 20 22 25  nTemp, zTemp, "%
7d00: 6c 6c 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29  lld", pMem->u.i)
7d10: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7d20: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
7d30: 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20  MEM_Real ){.    
7d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7d50: 69 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d  intf(nTemp, zTem
7d60: 70 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d 65 6d  p, "%.16g", pMem
7d70: 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.r);.      }e
7d80: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
7d90: 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
7da0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7db0: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
7dc0: 2c 20 7a 54 65 6d 70 2c 20 22 4e 55 4c 4c 22 29  , zTemp, "NULL")
7dd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
7de0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
7df0: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
7e00: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
7e10: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
7e20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
7e30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
7e40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7e50: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
7e60: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
7e70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
7e80: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
7e90: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
7ea0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
7eb0: 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2c  _snprintf(nTemp,
7ec0: 20 7a 54 65 6d 70 2c 20 22 76 74 61 62 3a 25 70   zTemp, "vtab:%p
7ed0: 22 2c 20 70 56 74 61 62 29 3b 0a 20 20 20 20 20  ", pVtab);.     
7ee0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
7ef0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
7f00: 5f 49 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20  _INTARRAY: {.   
7f10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7f20: 6e 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70  ntf(nTemp, zTemp
7f30: 2c 20 22 69 6e 74 61 72 72 61 79 22 29 3b 0a 20  , "intarray");. 
7f40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7f50: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 53 55  }.    case P4_SU
7f60: 42 50 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20  BPROGRAM: {.    
7f70: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7f80: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
7f90: 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20   "program");.   
7fa0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 41 44 56 41      case P4_ADVA
7fc0: 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a 54 65  NCE: {.      zTe
7fd0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20  mp[0] = 0;.     
7fe0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7ff0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
8000: 20 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34     zP4 = pOp->p4
8010: 2e 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50  .z;.      if( zP
8020: 34 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  4==0 ){.        
8030: 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20  zP4 = zTemp;.   
8040: 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20       zTemp[0] = 
8050: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
8060: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a  .  }.  assert( z
8070: 50 34 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  P4!=0 );.  retur
8080: 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n zP4;.}.#endif.
8090: 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74  ./*.** Declare t
80a0: 6f 20 74 68 65 20 56 64 62 65 20 74 68 61 74 20  o the Vdbe that 
80b0: 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65 63 74  the BTree object
80c0: 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d 20 69   at db->aDb[i] i
80d0: 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  s used..**.** Th
80e0: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
80f0: 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20 6b 6e  ments need to kn
8100: 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20 74 68  ow in advance th
8110: 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74 20 6f  e complete set o
8120: 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61  f.** attached da
8130: 74 61 62 61 73 65 73 20 74 68 61 74 20 77 69 6c  tabases that wil
8140: 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d 61 73  l be use.  A mas
8150: 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74 61 62  k of these datab
8160: 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69 6e 74  ases.** is maint
8170: 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74 72 65  ained in p->btre
8180: 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d 3e 6c  eMask.  The p->l
8190: 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20 69 73  ockMask value is
81a0: 20 74 68 65 20 73 75 62 73 65 74 20 6f 66 0a 2a   the subset of.*
81b0: 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 20 6f  * p->btreeMask o
81c0: 66 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  f databases that
81d0: 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
81e0: 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  lock..*/.void sq
81f0: 6c 69 74 65 33 56 64 62 65 55 73 65 73 42 74 72  lite3VdbeUsesBtr
8200: 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20  ee(Vdbe *p, int 
8210: 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 3e  i){.  assert( i>
8220: 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d 3e 6e  =0 && i<p->db->n
8230: 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73 69 7a  Db && i<(int)siz
8240: 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38 20 29  eof(yDbMask)*8 )
8250: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c 28 69  ;.  assert( i<(i
8260: 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62 74 72  nt)sizeof(p->btr
8270: 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 44  eeMask)*8 );.  D
8280: 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74 72 65  bMaskSet(p->btre
8290: 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69 66 28  eMask, i);.  if(
82a0: 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74 65 33   i!=1 && sqlite3
82b0: 42 74 72 65 65 53 68 61 72 61 62 6c 65 28 70 2d  BtreeSharable(p-
82c0: 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  >db->aDb[i].pBt)
82d0: 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b 53 65   ){.    DbMaskSe
82e0: 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 20 69  t(p->lockMask, i
82f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 21 64  );.  }.}..#if !d
8300: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
8310: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29  IT_SHARED_CACHE)
8320: 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52 45 41   && SQLITE_THREA
8330: 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a 20 49 66  DSAFE>0./*.** If
8340: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d 70 69   SQLite is compi
8350: 6c 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 73  led to support s
8360: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
8370: 20 61 6e 64 20 74 6f 20 62 65 20 74 68 72 65 61   and to be threa
8380: 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69 73 20 72  dsafe,.** this r
8390: 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e 73 20 74  outine obtains t
83a0: 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69 61  he mutex associa
83b0: 74 65 64 20 77 69 74 68 20 65 61 63 68 20 42 74  ted with each Bt
83c0: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
83d0: 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20  .** that may be 
83e0: 61 63 63 65 73 73 65 64 20 62 79 20 74 68 65 20  accessed by the 
83f0: 56 4d 20 70 61 73 73 65 64 20 61 73 20 61 6e 20  VM passed as an 
8400: 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20 64 6f 69  argument. In doi
8410: 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f 0a 2a 2a  ng so it also.**
8420: 20 73 65 74 73 20 74 68 65 20 42 74 53 68 61 72   sets the BtShar
8430: 65 64 2e 64 62 20 6d 65 6d 62 65 72 20 6f 66 20  ed.db member of 
8440: 65 61 63 68 20 6f 66 20 74 68 65 20 42 74 53 68  each of the BtSh
8450: 61 72 65 64 20 73 74 72 75 63 74 75 72 65 73 2c  ared structures,
8460: 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20 74 68 61   ensuring.** tha
8470: 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 75  t the correct bu
8480: 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62  sy-handler callb
8490: 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ack is invoked i
84a0: 66 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 0a 2a  f required..**.*
84b0: 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e  * If SQLite is n
84c0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 62 75  ot threadsafe bu
84d0: 74 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20 73  t does support s
84e0: 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f 64 65  hared-cache mode
84f0: 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c 69 74 65  , then.** sqlite
8500: 33 42 74 72 65 65 45 6e 74 65 72 28 29 20 69 73  3BtreeEnter() is
8510: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74 20   invoked to set 
8520: 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62 20  the BtShared.db 
8530: 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20 6f 66 20  variables.** of 
8540: 61 6c 6c 20 6f 66 20 42 74 53 68 61 72 65 64 20  all of BtShared 
8550: 73 74 72 75 63 74 75 72 65 73 20 61 63 63 65 73  structures acces
8560: 73 69 62 6c 65 20 76 69 61 20 74 68 65 20 64 61  sible via the da
8570: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a  tabase handle .*
8580: 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  * associated wit
8590: 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20  h the VM..**.** 
85a0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 6e 6f 74  If SQLite is not
85b0: 20 74 68 72 65 61 64 73 61 66 65 20 61 6e 64 20   threadsafe and 
85c0: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
85d0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d 6f   shared-cache mo
85e0: 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63  de, this.** func
85f0: 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
8600: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d 3e 62 74  .**.** The p->bt
8610: 72 65 65 4d 61 73 6b 20 66 69 65 6c 64 20 69 73  reeMask field is
8620: 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 61 6c   a bitmask of al
8630: 6c 20 62 74 72 65 65 73 20 74 68 61 74 20 74 68  l btrees that th
8640: 65 20 70 72 65 70 61 72 65 64 20 0a 2a 2a 20 73  e prepared .** s
8650: 74 61 74 65 6d 65 6e 74 20 70 20 77 69 6c 6c 20  tatement p will 
8660: 65 76 65 72 20 75 73 65 2e 20 20 4c 65 74 20 4e  ever use.  Let N
8670: 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   be the number o
8680: 66 20 62 69 74 73 20 69 6e 20 70 2d 3e 62 74 72  f bits in p->btr
8690: 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72 72 65 73  eeMask.** corres
86a0: 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74 72 65 65  ponding to btree
86b0: 73 20 74 68 61 74 20 75 73 65 20 73 68 61 72 65  s that use share
86c0: 64 20 63 61 63 68 65 2e 20 20 54 68 65 6e 20 74  d cache.  Then t
86d0: 68 65 20 72 75 6e 74 69 6d 65 20 6f 66 0a 2a 2a  he runtime of.**
86e0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
86f0: 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73 20 4e 20   N*N.  But as N 
8700: 69 73 20 72 61 72 65 6c 79 20 6d 6f 72 65 20 74  is rarely more t
8710: 68 61 6e 20 31 2c 20 74 68 69 73 20 73 68 6f 75  han 1, this shou
8720: 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20 61 20 70  ld not.** be a p
8730: 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
8740: 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72  sqlite3VdbeEnter
8750: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
8760: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   i;.  sqlite3 *d
8770: 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b 0a 20 20  b;.  Db *aDb;.  
8780: 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66 28 20 44  int nDb;.  if( D
8790: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
87a0: 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72 65 74 75  lockMask) ) retu
87b0: 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6d 6d  rn;  /* The comm
87c0: 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20 64 62 20  on case */.  db 
87d0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44 62 20 3d  = p->db;.  aDb =
87e0: 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e 44 62 20   db->aDb;.  nDb 
87f0: 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20 66 6f 72  = db->nDb;.  for
8800: 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20 69 2b 2b  (i=0; i<nDb; i++
8810: 29 7b 0a 20 20 20 20 69 66 28 20 69 21 3d 31 20  ){.    if( i!=1 
8820: 26 26 20 44 62 4d 61 73 6b 54 65 73 74 28 70 2d  && DbMaskTest(p-
8830: 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20 26 26 20  >lockMask,i) && 
8840: 41 4c 57 41 59 53 28 61 44 62 5b 69 5d 2e 70 42  ALWAYS(aDb[i].pB
8850: 74 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 73  t!=0) ){.      s
8860: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
8870: 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20  (aDb[i].pBt);.  
8880: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66    }.  }.}.#endif
8890: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
88a0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
88b0: 44 5f 43 41 43 48 45 29 20 26 26 20 53 51 4c 49  D_CACHE) && SQLI
88c0: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a  TE_THREADSAFE>0.
88d0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6c 6c  /*.** Unlock all
88e0: 20 6f 66 20 74 68 65 20 62 74 72 65 65 73 20 70   of the btrees p
88f0: 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63 6b 65 64  reviously locked
8900: 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   by a call to sq
8910: 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28 29  lite3VdbeEnter()
8920: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8930: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20  3VdbeLeave(Vdbe 
8940: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *p){.  int i;.  
8950: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 44  sqlite3 *db;.  D
8960: 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e 44  b *aDb;.  int nD
8970: 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b 41  b;.  if( DbMaskA
8980: 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d 61  llZero(p->lockMa
8990: 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20 2f  sk) ) return;  /
89a0: 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  * The common cas
89b0: 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e 64  e */.  db = p->d
89c0: 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e 61  b;.  aDb = db->a
89d0: 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d 3e  Db;.  nDb = db->
89e0: 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  nDb;.  for(i=0; 
89f0: 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<nDb; i++){.   
8a00: 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62 4d   if( i!=1 && DbM
8a10: 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b 4d  askTest(p->lockM
8a20: 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59 53  ask,i) && ALWAYS
8a30: 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29 20  (aDb[i].pBt!=0) 
8a40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8a50: 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b 69  BtreeLeave(aDb[i
8a60: 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20  ].pBt);.    }.  
8a70: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  }.}.#endif..#if 
8a80: 64 65 66 69 6e 65 64 28 56 44 42 45 5f 50 52 4f  defined(VDBE_PRO
8a90: 46 49 4c 45 29 20 7c 7c 20 64 65 66 69 6e 65 64  FILE) || defined
8aa0: 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f  (SQLITE_DEBUG)./
8ab0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 69 6e  *.** Print a sin
8ac0: 67 6c 65 20 6f 70 63 6f 64 65 2e 20 20 54 68 69  gle opcode.  Thi
8ad0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
8ae0: 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
8af0: 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  only..*/.void sq
8b00: 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70  lite3VdbePrintOp
8b10: 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74  (FILE *pOut, int
8b20: 20 70 63 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20   pc, Op *pOp){. 
8b30: 20 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68   char *zP4;.  ch
8b40: 61 72 20 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63  ar zPtr[50];.  c
8b50: 68 61 72 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20  har zCom[100];. 
8b60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
8b70: 61 72 20 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22  ar *zFormat1 = "
8b80: 25 34 64 20 25 2d 31 33 73 20 25 34 64 20 25 34  %4d %-13s %4d %4
8b90: 64 20 25 34 64 20 25 2d 31 33 73 20 25 2e 32 58  d %4d %-13s %.2X
8ba0: 20 25 73 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f   %s\n";.  if( pO
8bb0: 75 74 3d 3d 30 20 29 20 70 4f 75 74 20 3d 20 73  ut==0 ) pOut = s
8bc0: 74 64 6f 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64  tdout;.  zP4 = d
8bd0: 69 73 70 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50  isplayP4(pOp, zP
8be0: 74 72 2c 20 73 69 7a 65 6f 66 28 7a 50 74 72 29  tr, sizeof(zPtr)
8bf0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
8c00: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
8c10: 43 4f 4d 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c  COMMENTS.  displ
8c20: 61 79 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a  ayComment(pOp, z
8c30: 50 34 2c 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66  P4, zCom, sizeof
8c40: 28 7a 43 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20  (zCom));.#else. 
8c50: 20 7a 43 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65   zCom[0] = 0;.#e
8c60: 6e 64 69 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54  ndif.  /* NB:  T
8c70: 68 65 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65  he sqlite3Opcode
8c80: 4e 61 6d 65 28 29 20 66 75 6e 63 74 69 6f 6e 20  Name() function 
8c90: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
8ca0: 79 20 63 6f 64 65 20 63 72 65 61 74 65 64 0a 20  y code created. 
8cb0: 20 2a 2a 20 62 79 20 74 68 65 20 6d 6b 6f 70 63   ** by the mkopc
8cc0: 6f 64 65 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f  odeh.awk and mko
8cd0: 70 63 6f 64 65 63 2e 61 77 6b 20 73 63 72 69 70  pcodec.awk scrip
8ce0: 74 73 20 77 68 69 63 68 20 65 78 74 72 61 63 74  ts which extract
8cf0: 20 74 68 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d   the.  ** inform
8d00: 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76  ation from the v
8d10: 64 62 65 2e 63 20 73 6f 75 72 63 65 20 74 65 78  dbe.c source tex
8d20: 74 20 2a 2f 0a 20 20 66 70 72 69 6e 74 66 28 70  t */.  fprintf(p
8d30: 4f 75 74 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70  Out, zFormat1, p
8d40: 63 2c 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65  c, .      sqlite
8d50: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
8d60: 3e 6f 70 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70  >opcode), pOp->p
8d70: 31 2c 20 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d  1, pOp->p2, pOp-
8d80: 3e 70 33 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70  >p3, zP4, pOp->p
8d90: 35 2c 0a 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20  5,.      zCom.  
8da0: 29 3b 0a 20 20 66 66 6c 75 73 68 28 70 4f 75 74  );.  fflush(pOut
8db0: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
8dc0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 6e 20 61 72  ** Release an ar
8dd0: 72 61 79 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65  ray of N Mem ele
8de0: 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20  ments.*/.static 
8df0: 76 6f 69 64 20 72 65 6c 65 61 73 65 4d 65 6d 41  void releaseMemA
8e00: 72 72 61 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74  rray(Mem *p, int
8e10: 20 4e 29 7b 0a 20 20 69 66 28 20 70 20 26 26 20   N){.  if( p && 
8e20: 4e 20 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45  N ){.    Mem *pE
8e30: 6e 64 20 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20  nd = &p[N];.    
8e40: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
8e50: 3e 64 62 3b 0a 20 20 20 20 75 38 20 6d 61 6c 6c  >db;.    u8 mall
8e60: 6f 63 5f 66 61 69 6c 65 64 20 3d 20 64 62 2d 3e  oc_failed = db->
8e70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20  mallocFailed;.  
8e80: 20 20 69 66 28 20 64 62 2d 3e 70 6e 42 79 74 65    if( db->pnByte
8e90: 73 46 72 65 65 64 20 29 7b 0a 20 20 20 20 20 20  sFreed ){.      
8ea0: 64 6f 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  do{.        if( 
8eb0: 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  p->szMalloc ) sq
8ec0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
8ed0: 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  p->zMalloc);.   
8ee0: 20 20 20 7d 77 68 69 6c 65 28 20 28 2b 2b 70 29     }while( (++p)
8ef0: 3c 70 45 6e 64 20 29 3b 0a 20 20 20 20 20 20 72  <pEnd );.      r
8f00: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
8f10: 20 64 6f 7b 0a 20 20 20 20 20 20 61 73 73 65 72   do{.      asser
8f20: 74 28 20 28 26 70 5b 31 5d 29 3d 3d 70 45 6e 64  t( (&p[1])==pEnd
8f30: 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31   || p[0].db==p[1
8f40: 5d 2e 64 62 20 29 3b 0a 20 20 20 20 20 20 61 73  ].db );.      as
8f50: 73 65 72 74 28 20 73 71 6c 69 74 65 33 56 64 62  sert( sqlite3Vdb
8f60: 65 43 68 65 63 6b 4d 65 6d 49 6e 76 61 72 69 61  eCheckMemInvaria
8f70: 6e 74 73 28 70 29 20 29 3b 0a 0a 20 20 20 20 20  nts(p) );..     
8f80: 20 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 69   /* This block i
8f90: 73 20 72 65 61 6c 6c 79 20 61 6e 20 69 6e 6c 69  s really an inli
8fa0: 6e 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73  ned version of s
8fb0: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
8fc0: 65 61 73 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  ease().      ** 
8fd0: 74 68 61 74 20 74 61 6b 65 73 20 61 64 76 61 6e  that takes advan
8fe0: 74 61 67 65 20 6f 66 20 74 68 65 20 66 61 63 74  tage of the fact
8ff0: 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72 79   that the memory
9000: 20 63 65 6c 6c 20 76 61 6c 75 65 20 69 73 20 0a   cell value is .
9010: 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 73        ** being s
9020: 65 74 20 74 6f 20 4e 55 4c 4c 20 61 66 74 65 72  et to NULL after
9030: 20 72 65 6c 65 61 73 69 6e 67 20 61 6e 79 20 64   releasing any d
9040: 79 6e 61 6d 69 63 20 72 65 73 6f 75 72 63 65 73  ynamic resources
9050: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
9060: 20 2a 2a 20 54 68 65 20 6a 75 73 74 69 66 69 63   ** The justific
9070: 61 74 69 6f 6e 20 66 6f 72 20 64 75 70 6c 69 63  ation for duplic
9080: 61 74 69 6e 67 20 63 6f 64 65 20 69 73 20 74 68  ating code is th
9090: 61 74 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  at according to 
90a0: 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 67 72  .      ** callgr
90b0: 69 6e 64 2c 20 74 68 69 73 20 63 61 75 73 65 73  ind, this causes
90c0: 20 61 20 63 65 72 74 61 69 6e 20 74 65 73 74 20   a certain test 
90d0: 63 61 73 65 20 74 6f 20 68 69 74 20 74 68 65 20  case to hit the 
90e0: 43 50 55 20 34 2e 37 20 0a 20 20 20 20 20 20 2a  CPU 4.7 .      *
90f0: 2a 20 70 65 72 63 65 6e 74 20 6c 65 73 73 20 28  * percent less (
9100: 78 38 36 20 6c 69 6e 75 78 2c 20 67 63 63 20 76  x86 linux, gcc v
9110: 65 72 73 69 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f  ersion 4.1.2, -O
9120: 36 29 20 74 68 61 6e 20 69 66 20 0a 20 20 20 20  6) than if .    
9130: 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 52    ** sqlite3MemR
9140: 65 6c 65 61 73 65 28 29 20 77 65 72 65 20 63 61  elease() were ca
9150: 6c 6c 65 64 20 66 72 6f 6d 20 68 65 72 65 2e 20  lled from here. 
9160: 57 69 74 68 20 2d 4f 32 2c 20 74 68 69 73 20 6a  With -O2, this j
9170: 75 6d 70 73 0a 20 20 20 20 20 20 2a 2a 20 74 6f  umps.      ** to
9180: 20 36 2e 36 20 70 65 72 63 65 6e 74 2e 20 54 68   6.6 percent. Th
9190: 65 20 74 65 73 74 20 63 61 73 65 20 69 73 20 69  e test case is i
91a0: 6e 73 65 72 74 69 6e 67 20 31 30 30 30 20 72 6f  nserting 1000 ro
91b0: 77 73 20 69 6e 74 6f 20 61 20 74 61 62 6c 65 20  ws into a table 
91c0: 0a 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 6e  .      ** with n
91d0: 6f 20 69 6e 64 65 78 65 73 20 75 73 69 6e 67 20  o indexes using 
91e0: 61 20 73 69 6e 67 6c 65 20 70 72 65 70 61 72 65  a single prepare
91f0: 64 20 49 4e 53 45 52 54 20 73 74 61 74 65 6d 65  d INSERT stateme
9200: 6e 74 2c 20 62 69 6e 64 28 29 20 0a 20 20 20 20  nt, bind() .    
9210: 20 20 2a 2a 20 61 6e 64 20 72 65 73 65 74 28 29    ** and reset()
9220: 2e 20 49 6e 73 65 72 74 73 20 61 72 65 20 67 72  . Inserts are gr
9230: 6f 75 70 65 64 20 69 6e 74 6f 20 61 20 74 72 61  ouped into a tra
9240: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
9250: 2a 2f 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  */.      testcas
9260: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
9270: 4d 5f 41 67 67 20 29 3b 0a 20 20 20 20 20 20 74  M_Agg );.      t
9280: 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67  estcase( p->flag
9290: 73 20 26 20 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20  s & MEM_Dyn );. 
92a0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
92b0: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 46 72  ->flags & MEM_Fr
92c0: 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 74 65 73  ame );.      tes
92d0: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
92e0: 26 20 4d 45 4d 5f 52 6f 77 53 65 74 20 29 3b 0a  & MEM_RowSet );.
92f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 66 6c 61        if( p->fla
9300: 67 73 26 28 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f  gs&(MEM_Agg|MEM_
9310: 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45  Dyn|MEM_Frame|ME
9320: 4d 5f 52 6f 77 53 65 74 29 20 29 7b 0a 20 20 20  M_RowSet) ){.   
9330: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9340: 4d 65 6d 52 65 6c 65 61 73 65 28 70 29 3b 0a 20  MemRelease(p);. 
9350: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
9360: 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20  ->szMalloc ){.  
9370: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
9380: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c  ree(db, p->zMall
9390: 6f 63 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  oc);.        p->
93a0: 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  szMalloc = 0;.  
93b0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 2d 3e      }..      p->
93c0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65  flags = MEM_Unde
93d0: 66 69 6e 65 64 3b 0a 20 20 20 20 7d 77 68 69 6c  fined;.    }whil
93e0: 65 28 20 28 2b 2b 70 29 3c 70 45 6e 64 20 29 3b  e( (++p)<pEnd );
93f0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
9400: 61 69 6c 65 64 20 3d 20 6d 61 6c 6c 6f 63 5f 66  ailed = malloc_f
9410: 61 69 6c 65 64 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ailed;.  }.}../*
9420: 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62  .** Delete a Vdb
9430: 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e  eFrame object an
9440: 64 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20  d its contents. 
9450: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
9460: 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74  s are.** allocat
9470: 65 64 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f  ed by the OP_Pro
9480: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73  gram opcode in s
9490: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
94a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
94b0: 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65  3VdbeFrameDelete
94c0: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a  (VdbeFrame *p){.
94d0: 20 20 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a    int i;.  Mem *
94e0: 61 4d 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65  aMem = VdbeFrame
94f0: 4d 65 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75  Mem(p);.  VdbeCu
9500: 72 73 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28  rsor **apCsr = (
9510: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61  VdbeCursor **)&a
9520: 4d 65 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d  Mem[p->nChildMem
9530: 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ];.  for(i=0; i<
9540: 70 2d 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b  p->nChildCsr; i+
9550: 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  +){.    sqlite3V
9560: 64 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d  dbeFreeCursor(p-
9570: 3e 76 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20  >v, apCsr[i]);. 
9580: 20 7d 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41   }.  releaseMemA
9590: 72 72 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43  rray(aMem, p->nC
95a0: 68 69 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69  hildMem);.  sqli
95b0: 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d 3e  te3DbFree(p->v->
95c0: 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e 64  db, p);.}..#ifnd
95d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
95e0: 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69 76  XPLAIN./*.** Giv
95f0: 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 74  e a listing of t
9600: 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74 68  he program in th
9610: 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  e virtual machin
9620: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 74  e..**.** The int
9630: 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73 61  erface is the sa
9640: 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64 62  me as sqlite3Vdb
9650: 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69 6e  eExec().  But in
9660: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e 6e  stead of.** runn
9670: 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69 74  ing the code, it
9680: 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61 6c   invokes the cal
9690: 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20 65  lback once for e
96a0: 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ach instruction.
96b0: 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72 65  .** This feature
96c0: 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   is used to impl
96d0: 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22 2e  ement "EXPLAIN".
96e0: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
96f0: 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68 20  xplain==1, each 
9700: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 6c  instruction is l
9710: 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a 20  isted.  When.** 
9720: 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20 6f  p->explain==2, o
9730: 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20 69  nly OP_Explain i
9740: 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65 20  nstructions are 
9750: 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73 65  listed and these
9760: 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69 6e  .** are shown in
9770: 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f 72   a different for
9780: 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69 6e  mat.  p->explain
9790: 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20 69  ==2 is used to i
97a0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50 4c  mplement.** EXPL
97b0: 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e 0a  AIN QUERY PLAN..
97c0: 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65 78  **.** When p->ex
97d0: 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74 20  plain==1, first 
97e0: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
97f0: 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65 6e   is listed, then
9800: 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65 20   each of.** the 
9810: 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72  trigger subprogr
9820: 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20 6f  ams are listed o
9830: 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69 6e  ne by one..*/.in
9840: 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 73  t sqlite3VdbeLis
9850: 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20 20  t(.  Vdbe *p    
9860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9870: 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29 7b  * The VDBE */.){
9880: 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20 20  .  int nRow;    
9890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70 20          /* Stop 
98b0: 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20 72  when row count r
98c0: 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a 20  eaches this */. 
98d0: 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20 20   int nSub = 0;  
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9900: 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65 65  of sub-vdbes see
9910: 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53 75  n so far */.  Su
9920: 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75 62  bProgram **apSub
9930: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
9940: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73     /* Array of s
9950: 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d 65  ub-vdbes */.  Me
9960: 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20 20  m *pSub = 0;    
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c     /* Memory cel
9990: 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66 20  l hold array of 
99a0: 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73 71  subprogs */.  sq
99b0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
99c0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
99d0: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
99e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
99f0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
9a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a10: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
9a20: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
9a30: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
9a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a50: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
9a60: 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
9a70: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20 20  = &p->aMem[1];  
9a80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
9a90: 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75 6c  rst Mem of resul
9aa0: 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73 65  t set */..  asse
9ab0: 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20 29  rt( p->explain )
9ac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d  ;.  assert( p->m
9ad0: 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43  agic==VDBE_MAGIC
9ae0: 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72 74  _RUN );.  assert
9af0: 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
9b00: 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c  OK || p->rc==SQL
9b10: 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e 72  ITE_BUSY || p->r
9b20: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9b30: 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74 68  );..  /* Even th
9b40: 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64 65  ough this opcode
9b50: 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64 79   does not use dy
9b60: 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66 6f  namic strings fo
9b70: 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75 6c  r.  ** the resul
9b80: 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  t, result column
9b90: 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79 6e  s may become dyn
9ba0: 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65 72  amic if the user
9bb0: 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c 69   calls.  ** sqli
9bc0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
9bd0: 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20 74  6(), causing a t
9be0: 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55 54  ranslation to UT
9bf0: 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a 20  F-16 encoding.. 
9c00: 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d   */.  releaseMem
9c10: 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b 0a  Array(pMem, 8);.
9c20: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
9c30: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 72  = 0;..  if( p->r
9c40: 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
9c50: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68  ){.    /* This h
9c60: 61 70 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c  appens if a mall
9c70: 6f 63 28 29 20 69 6e 73 69 64 65 20 61 20 63 61  oc() inside a ca
9c80: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f  ll to sqlite3_co
9c90: 6c 75 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20  lumn_text() or. 
9ca0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f     ** sqlite3_co
9cb0: 6c 75 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61  lumn_text16() fa
9cc0: 69 6c 65 64 2e 20 20 2a 2f 0a 20 20 20 20 64 62  iled.  */.    db
9cd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
9ce0: 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   1;.    return S
9cf0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
9d00: 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20  ..  /* When the 
9d10: 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75 74  number of output
9d20: 20 72 6f 77 73 20 72 65 61 63 68 65 73 20 6e 52   rows reaches nR
9d30: 6f 77 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  ow, that means t
9d40: 68 65 0a 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20  he.  ** listing 
9d50: 68 61 73 20 66 69 6e 69 73 68 65 64 20 61 6e 64  has finished and
9d60: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
9d70: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 53 51  should return SQ
9d80: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20  LITE_DONE..  ** 
9d90: 6e 52 6f 77 20 69 73 20 74 68 65 20 73 75 6d 20  nRow is the sum 
9da0: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
9db0: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 6d 61 69   rows in the mai
9dc0: 6e 20 70 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a  n program, plus.
9dd0: 20 20 2a 2a 20 74 68 65 20 73 75 6d 20 6f 66 20    ** the sum of 
9de0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
9df0: 77 73 20 69 6e 20 61 6c 6c 20 74 72 69 67 67 65  ws in all trigge
9e00: 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20 65 6e  r subprograms en
9e10: 63 6f 75 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73  countered.  ** s
9e20: 6f 20 66 61 72 2e 20 20 54 68 65 20 6e 52 6f 77  o far.  The nRow
9e30: 20 76 61 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72   value will incr
9e40: 65 61 73 65 20 61 73 20 6e 65 77 20 74 72 69 67  ease as new trig
9e50: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 20  ger subprograms 
9e60: 61 72 65 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74  are.  ** encount
9e70: 65 72 65 64 2c 20 62 75 74 20 70 2d 3e 70 63 20  ered, but p->pc 
9e80: 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20  will eventually 
9e90: 63 61 74 63 68 20 75 70 20 74 6f 20 6e 52 6f 77  catch up to nRow
9ea0: 2e 0a 20 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20  ..  */.  nRow = 
9eb0: 70 2d 3e 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d  p->nOp;.  if( p-
9ec0: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
9ed0: 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20     /* The first 
9ee0: 38 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61  8 memory cells a
9ef0: 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  re used for the 
9f00: 72 65 73 75 6c 74 20 73 65 74 2e 20 20 53 6f 20  result set.  So 
9f10: 77 65 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63  we will.    ** c
9f20: 6f 6d 6d 61 6e 64 65 65 72 20 74 68 65 20 39 74  ommandeer the 9t
9f30: 68 20 63 65 6c 6c 20 74 6f 20 75 73 65 20 61 73  h cell to use as
9f40: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 6e 20   storage for an 
9f50: 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72  array of pointer
9f60: 73 0a 20 20 20 20 2a 2a 20 74 6f 20 74 72 69 67  s.    ** to trig
9f70: 67 65 72 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ger subprograms.
9f80: 20 20 54 68 65 20 56 44 42 45 20 69 73 20 67 75    The VDBE is gu
9f90: 61 72 61 6e 74 65 65 64 20 74 6f 20 68 61 76 65  aranteed to have
9fa0: 20 61 74 20 6c 65 61 73 74 20 39 0a 20 20 20 20   at least 9.    
9fb0: 2a 2a 20 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20  ** cells.  */.  
9fc0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65    assert( p->nMe
9fd0: 6d 3e 39 20 29 3b 0a 20 20 20 20 70 53 75 62 20  m>9 );.    pSub 
9fe0: 3d 20 26 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20  = &p->aMem[9];. 
9ff0: 20 20 20 69 66 28 20 70 53 75 62 2d 3e 66 6c 61     if( pSub->fla
a000: 67 73 26 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20  gs&MEM_Blob ){. 
a010: 20 20 20 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66       /* On the f
a020: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
a030: 69 74 65 33 5f 73 74 65 70 28 29 2c 20 70 53 75  ite3_step(), pSu
a040: 62 20 77 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55  b will hold a NU
a050: 4c 4c 2e 20 20 49 74 20 69 73 0a 20 20 20 20 20  LL.  It is.     
a060: 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   ** initialized 
a070: 74 6f 20 61 20 42 4c 4f 42 20 62 79 20 74 68 65  to a BLOB by the
a080: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 70   P4_SUBPROGRAM p
a090: 72 6f 63 65 73 73 69 6e 67 20 6c 6f 67 69 63 20  rocessing logic 
a0a0: 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e  below */.      n
a0b0: 53 75 62 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69  Sub = pSub->n/si
a0c0: 7a 65 6f 66 28 56 64 62 65 2a 29 3b 0a 20 20 20  zeof(Vdbe*);.   
a0d0: 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62 50     apSub = (SubP
a0e0: 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e  rogram **)pSub->
a0f0: 7a 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  z;.    }.    for
a100: 28 69 3d 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b  (i=0; i<nSub; i+
a110: 2b 29 7b 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b  +){.      nRow +
a120: 3d 20 61 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b  = apSub[i]->nOp;
a130: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f  .    }.  }..  do
a140: 7b 0a 20 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b  {.    i = p->pc+
a150: 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e  +;.  }while( i<n
a160: 52 6f 77 20 26 26 20 70 2d 3e 65 78 70 6c 61 69  Row && p->explai
a170: 6e 3d 3d 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69  n==2 && p->aOp[i
a180: 5d 2e 6f 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70  ].opcode!=OP_Exp
a190: 6c 61 69 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e  lain );.  if( i>
a1a0: 3d 6e 52 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e  =nRow ){.    p->
a1b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a1c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
a1d0: 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  DONE;.  }else if
a1e0: 28 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72  ( db->u1.isInter
a1f0: 72 75 70 74 65 64 20 29 7b 0a 20 20 20 20 70 2d  rupted ){.    p-
a200: 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  >rc = SQLITE_INT
a210: 45 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d  ERRUPT;.    rc =
a220: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
a230: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
a240: 69 6e 67 28 26 70 2d 3e 7a 45 72 72 4d 73 67 2c  ing(&p->zErrMsg,
a250: 20 64 62 2c 20 22 25 73 22 2c 20 73 71 6c 69 74   db, "%s", sqlit
a260: 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29 29  e3ErrStr(p->rc))
a270: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63  ;.  }else{.    c
a280: 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f 70  har *zP4;.    Op
a290: 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20 69   *pOp;.    if( i
a2a0: 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20 20  <p->nOp ){.     
a2b0: 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20 6c   /* The output l
a2c0: 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73 6d  ine number is sm
a2d0: 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74 20  all enough that 
a2e0: 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20  we are still in 
a2f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61 69  the.      ** mai
a300: 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20 20  n program. */.  
a310: 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f      pOp = &p->aO
a320: 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  p[i];.    }else{
a330: 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72 65  .      /* We are
a340: 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74 69   currently listi
a350: 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20  ng subprograms. 
a360: 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69 63   Figure out whic
a370: 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20 20  h one and.      
a380: 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20 61  ** pick up the a
a390: 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f 64  ppropriate opcod
a3a0: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  e. */.      int 
a3b0: 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70 2d  j;.      i -= p-
a3c0: 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72 28  >nOp;.      for(
a3d0: 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a 5d  j=0; i>=apSub[j]
a3e0: 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nOp; j++){.   
a3f0: 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62 5b       i -= apSub[
a400: 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 7d  j]->nOp;.      }
a410: 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61 70  .      pOp = &ap
a420: 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b 0a  Sub[j]->aOp[i];.
a430: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
a440: 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20  >explain==1 ){. 
a450: 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
a460: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
a470: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69 3b    pMem->u.i = i;
a480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4a0: 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e 74  /* Program count
a4b0: 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  er */.      pMem
a4c0: 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d 65  ++;.  .      pMe
a4d0: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53  m->flags = MEM_S
a4e0: 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d 45  tatic|MEM_Str|ME
a4f0: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70 4d  M_Term;.      pM
a500: 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29 73  em->z = (char*)s
a510: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
a520: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20 2f  (pOp->opcode); /
a530: 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20 20  * Opcode */.    
a540: 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
a550: 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d  z!=0 );.      pM
a560: 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53  em->n = sqlite3S
a570: 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29  trlen30(pMem->z)
a580: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e  ;.      pMem->en
a590: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
a5a0: 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  .      pMem++;..
a5b0: 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6e        /* When an
a5c0: 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f   OP_Program opco
a5d0: 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 20  de is encounter 
a5e0: 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64 65  (the only opcode
a5f0: 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20 20   that has.      
a600: 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47 52  ** a P4_SUBPROGR
a610: 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65 78  AM argument), ex
a620: 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66  pand the size of
a630: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73 75   the array of su
a640: 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20 20  bprograms.      
a650: 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61 4d  ** kept in p->aM
a660: 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64 20  em[9].z to hold 
a670: 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d 20  the new program 
a680: 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73 20  - assuming this 
a690: 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20 20  subprogram.     
a6a0: 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72 65   ** has not alre
a6b0: 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a 20  ady been seen.. 
a6c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
a6d0: 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d 50  ( pOp->p4type==P
a6e0: 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a  4_SUBPROGRAM ){.
a6f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74          int nByt
a700: 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69 7a  e = (nSub+1)*siz
a710: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
a720: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 3b  ;.        int j;
a730: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  .        for(j=0
a740: 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a  ; j<nSub; j++){.
a750: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 70            if( ap
a760: 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34 2e  Sub[j]==pOp->p4.
a770: 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b  pProgram ) break
a780: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a790: 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62 20      if( j==nSub 
a7a0: 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73 71  && SQLITE_OK==sq
a7b0: 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f 77  lite3VdbeMemGrow
a7c0: 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e 53  (pSub, nByte, nS
a7d0: 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  ub!=0) ){.      
a7e0: 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75 62      apSub = (Sub
a7f0: 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62 2d  Program **)pSub-
a800: 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61 70  >z;.          ap
a810: 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70 4f  Sub[nSub++] = pO
a820: 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b 0a  p->p4.pProgram;.
a830: 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d 3e            pSub->
a840: 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c 6f  flags |= MEM_Blo
a850: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 75  b;.          pSu
a860: 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a 65  b->n = nSub*size
a870: 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b  of(SubProgram*);
a880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a890: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 4d   }.    }..    pM
a8a0: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
a8b0: 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75  Int;.    pMem->u
a8c0: 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20 20  .i = pOp->p1;   
a8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a8e0: 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f 0a         /* P1 */.
a8f0: 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20      pMem++;..   
a900: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
a910: 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d  EM_Int;.    pMem
a920: 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32 3b  ->u.i = pOp->p2;
a930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32 20            /* P2 
a950: 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a  */.    pMem++;..
a960: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
a970: 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70  = MEM_Int;.    p
a980: 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e  Mem->u.i = pOp->
a990: 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p3;             
a9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a9b0: 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b  P3 */.    pMem++
a9c0: 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ;..    if( sqlit
a9d0: 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e  e3VdbeMemClearAn
a9e0: 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 33 32  dResize(pMem, 32
a9f0: 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a 20 20  ) ){ /* P4 */.  
aa00: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64      assert( p->d
aa10: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
aa20: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
aa30: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
aa40: 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c    }.    pMem->fl
aa50: 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d 45  ags = MEM_Str|ME
aa60: 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50 34 20  M_Term;.    zP4 
aa70: 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f 70 2c  = displayP4(pOp,
aa80: 20 70 4d 65 6d 2d 3e 7a 2c 20 33 32 29 3b 0a 20   pMem->z, 32);. 
aa90: 20 20 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d     if( zP4!=pMem
aaa0: 2d 3e 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ->z ){.      sql
aab0: 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74  ite3VdbeMemSetSt
aac0: 72 28 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c  r(pMem, zP4, -1,
aad0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
aae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
aaf0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
ab00: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
ab10: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
ab20: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
ab30: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
ab40: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
ab50: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d  ;.    }.    pMem
ab60: 2b 2b 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e  ++;..    if( p->
ab70: 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20  explain==1 ){.  
ab80: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 56      if( sqlite3V
ab90: 64 62 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65  dbeMemClearAndRe
aba0: 73 69 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b  size(pMem, 4) ){
abb0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
abc0: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
abd0: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
abe0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
abf0: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
ac00: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ac10: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
ac20: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
ac30: 20 3d 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 2;.      sqli
ac40: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20  te3_snprintf(3, 
ac50: 70 4d 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c  pMem->z, "%.2x",
ac60: 20 70 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20   pOp->p5);   /* 
ac70: 50 35 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  P5 */.      pMem
ac80: 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55  ->enc = SQLITE_U
ac90: 54 46 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b  TF8;.      pMem+
aca0: 2b 3b 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c  +;.  .#ifdef SQL
acb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41  ITE_ENABLE_EXPLA
acc0: 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20  IN_COMMENTS.    
acd0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
ace0: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
acf0: 7a 65 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b  ze(pMem, 500) ){
ad00: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ad10: 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   p->db->mallocFa
ad20: 69 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20  iled );.        
ad30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
ad40: 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
ad50: 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
ad60: 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72   MEM_Str|MEM_Ter
ad70: 6d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e  m;.      pMem->n
ad80: 20 3d 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e   = displayCommen
ad90: 74 28 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d  t(pOp, zP4, pMem
ada0: 2d 3e 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20  ->z, 500);.     
adb0: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
adc0: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a  ITE_UTF8;.#else.
add0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
ade0: 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20  s = MEM_Null;   
adf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae00: 20 20 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a      /* Comment *
ae10: 2f 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a  /.#endif.    }..
ae20: 20 20 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d      p->nResColum
ae30: 6e 20 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78  n = 8 - 4*(p->ex
ae40: 70 6c 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d  plain-1);.    p-
ae50: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70  >pResultSet = &p
ae60: 2d 3e 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70  ->aMem[1];.    p
ae70: 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  ->rc = SQLITE_OK
ae80: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
ae90: 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74  E_ROW;.  }.  ret
aea0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
aeb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
aec0: 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64  EXPLAIN */..#ifd
aed0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
aee0: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
aef0: 53 51 4c 20 74 68 61 74 20 77 61 73 20 75 73 65  SQL that was use
af00: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  d to generate a 
af10: 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  VDBE program..*/
af20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
af30: 65 50 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a  ePrintSql(Vdbe *
af40: 70 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  p){.  const char
af50: 20 2a 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70   *z = 0;.  if( p
af60: 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20  ->zSql ){.    z 
af70: 3d 20 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c  = p->zSql;.  }el
af80: 73 65 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31  se if( p->nOp>=1
af90: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64   ){.    const Vd
afa0: 62 65 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e  beOp *pOp = &p->
afb0: 61 4f 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  aOp[0];.    if( 
afc0: 70 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f  pOp->opcode==OP_
afd0: 49 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e  Init && pOp->p4.
afe0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z!=0 ){.      z 
aff0: 3d 20 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20  = pOp->p4.z;.   
b000: 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
b010: 33 49 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a  3Isspace(*z) ) z
b020: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
b030: 69 66 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22  if( z ) printf("
b040: 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29  SQL: [%s]\n", z)
b050: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
b060: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
b070: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
b080: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
b090: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a  ABLE_IOTRACE)./*
b0a0: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54  .** Print an IOT
b0b0: 52 41 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f  RACE message sho
b0c0: 77 69 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74  wing SQL content
b0d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b0e0: 33 56 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28  3VdbeIOTraceSql(
b0f0: 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
b100: 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  nOp = p->nOp;.  
b110: 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69  VdbeOp *pOp;.  i
b120: 66 28 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63  f( sqlite3IoTrac
b130: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
b140: 20 69 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74   if( nOp<1 ) ret
b150: 75 72 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d  urn;.  pOp = &p-
b160: 3e 61 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70  >aOp[0];.  if( p
b170: 4f 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49  Op->opcode==OP_I
b180: 6e 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a  nit && pOp->p4.z
b190: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  !=0 ){.    int i
b1a0: 2c 20 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b  , j;.    char z[
b1b0: 31 30 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74  1000];.    sqlit
b1c0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
b1d0: 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20  of(z), z, "%s", 
b1e0: 70 4f 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20  pOp->p4.z);.    
b1f0: 66 6f 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33  for(i=0; sqlite3
b200: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  Isspace(z[i]); i
b210: 2b 2b 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d  ++){}.    for(j=
b220: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
b230: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
b240: 49 73 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b  Isspace(z[i]) ){
b250: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69  .        if( z[i
b260: 2d 31 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20  -1]!=' ' ){.    
b270: 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27        z[j++] = '
b280: 20 27 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   ';.        }.  
b290: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b2a0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d     z[j++] = z[i]
b2b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b2c0: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
b2d0: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
b2e0: 28 22 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b  ("SQL %s\n", z);
b2f0: 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
b300: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52   !SQLITE_OMIT_TR
b310: 41 43 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  ACE && SQLITE_EN
b320: 41 42 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a  ABLE_IOTRACE */.
b330: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
b340: 73 70 61 63 65 20 66 72 6f 6d 20 61 20 66 69 78  space from a fix
b350: 65 64 20 73 69 7a 65 20 62 75 66 66 65 72 20 61  ed size buffer a
b360: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
b370: 74 65 72 20 74 6f 0a 2a 2a 20 74 68 61 74 20 73  ter to.** that s
b380: 70 61 63 65 2e 20 20 49 66 20 69 6e 73 75 66 66  pace.  If insuff
b390: 69 63 69 65 6e 74 20 73 70 61 63 65 20 69 73 20  icient space is 
b3a0: 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 74 75 72  available, retur
b3b0: 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68  n NULL..**.** Th
b3c0: 65 20 70 42 75 66 20 70 61 72 61 6d 65 74 65 72  e pBuf parameter
b3d0: 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20   is the initial 
b3e0: 76 61 6c 75 65 20 6f 66 20 61 20 70 6f 69 6e 74  value of a point
b3f0: 65 72 20 77 68 69 63 68 20 77 69 6c 6c 0a 2a 2a  er which will.**
b400: 20 72 65 63 65 69 76 65 20 74 68 65 20 6e 65 77   receive the new
b410: 20 6d 65 6d 6f 72 79 2e 20 20 70 42 75 66 20 69   memory.  pBuf i
b420: 73 20 6e 6f 72 6d 61 6c 6c 79 20 4e 55 4c 4c 2e  s normally NULL.
b430: 20 20 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74    If pBuf is not
b440: 0a 2a 2a 20 4e 55 4c 4c 2c 20 69 74 20 6d 65 61  .** NULL, it mea
b450: 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 73  ns that memory s
b460: 70 61 63 65 20 68 61 73 20 61 6c 72 65 61 64 79  pace has already
b470: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
b480: 61 6e 64 20 74 68 61 74 0a 2a 2a 20 74 68 69 73  and that.** this
b490: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
b4a0: 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 20 61 6e 79  not allocate any
b4b0: 20 6e 65 77 20 6d 65 6d 6f 72 79 2e 20 20 57 68   new memory.  Wh
b4c0: 65 6e 20 70 42 75 66 20 69 73 20 6e 6f 74 0a 2a  en pBuf is not.*
b4d0: 2a 20 4e 55 4c 4c 20 73 69 6d 70 6c 79 20 72 65  * NULL simply re
b4e0: 74 75 72 6e 20 70 42 75 66 2e 20 20 4f 6e 6c 79  turn pBuf.  Only
b4f0: 20 61 6c 6c 6f 63 61 74 65 20 6e 65 77 20 6d 65   allocate new me
b500: 6d 6f 72 79 20 73 70 61 63 65 20 77 68 65 6e 20  mory space when 
b510: 70 42 75 66 0a 2a 2a 20 69 73 20 4e 55 4c 4c 2e  pBuf.** is NULL.
b520: 0a 2a 2a 0a 2a 2a 20 6e 42 79 74 65 20 69 73 20  .**.** nByte is 
b530: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
b540: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6e 65 65  tes of space nee
b550: 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 46 72  ded..**.** *ppFr
b560: 6f 6d 20 70 6f 69 6e 74 73 20 74 6f 20 61 76 61  om points to ava
b570: 69 6c 61 62 6c 65 20 73 70 61 63 65 20 61 6e 64  ilable space and
b580: 20 70 45 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20   pEnd points to 
b590: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
b5a0: 2a 20 61 76 61 69 6c 61 62 6c 65 20 73 70 61 63  * available spac
b5b0: 65 2e 20 20 57 68 65 6e 20 73 70 61 63 65 20 69  e.  When space i
b5c0: 73 20 61 6c 6c 6f 63 61 74 65 64 2c 20 2a 70 70  s allocated, *pp
b5d0: 46 72 6f 6d 20 69 73 20 61 64 76 61 6e 63 65 64  From is advanced
b5e0: 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 65 6e 64   past.** the end
b5f0: 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65   of the allocate
b600: 64 20 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 2a  d space..**.** *
b610: 70 6e 42 79 74 65 20 69 73 20 61 20 63 6f 75 6e  pnByte is a coun
b620: 74 65 72 20 6f 66 20 74 68 65 20 6e 75 6d 62 65  ter of the numbe
b630: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
b640: 61 63 65 20 74 68 61 74 20 68 61 76 65 20 66 61  ace that have fa
b650: 69 6c 65 64 0a 2a 2a 20 74 6f 20 61 6c 6c 6f 63  iled.** to alloc
b660: 61 74 65 2e 20 20 49 66 20 74 68 65 72 65 20 69  ate.  If there i
b670: 73 20 69 6e 73 75 66 66 69 63 69 65 6e 74 20 73  s insufficient s
b680: 70 61 63 65 20 69 6e 20 2a 70 70 46 72 6f 6d 20  pace in *ppFrom 
b690: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 2a  to satisfy the.*
b6a0: 2a 20 72 65 71 75 65 73 74 2c 20 74 68 65 6e 20  * request, then 
b6b0: 69 6e 63 72 65 6d 65 6e 74 20 2a 70 6e 42 79 74  increment *pnByt
b6c0: 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e 74 20  e by the amount 
b6d0: 6f 66 20 74 68 65 20 72 65 71 75 65 73 74 2e 0a  of the request..
b6e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a  */.static void *
b6f0: 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 76 6f  allocSpace(.  vo
b700: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
b710: 20 20 20 2f 2a 20 57 68 65 72 65 20 72 65 74 75     /* Where retu
b720: 72 6e 20 70 6f 69 6e 74 65 72 20 77 69 6c 6c 20  rn pointer will 
b730: 62 65 20 73 74 6f 72 65 64 20 2a 2f 0a 20 20 69  be stored */.  i
b740: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
b750: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b760: 20 62 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61   bytes to alloca
b770: 74 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 70 70 46  te */.  u8 **ppF
b780: 72 6f 6d 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  rom,         /* 
b790: 49 4e 2f 4f 55 54 3a 20 41 6c 6c 6f 63 61 74 65  IN/OUT: Allocate
b7a0: 20 66 72 6f 6d 20 2a 70 70 46 72 6f 6d 20 2a 2f   from *ppFrom */
b7b0: 0a 20 20 75 38 20 2a 70 45 6e 64 2c 20 20 20 20  .  u8 *pEnd,    
b7c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
b7d0: 65 72 20 74 6f 20 31 20 62 79 74 65 20 70 61 73  er to 1 byte pas
b7e0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 2a 70 70  t the end of *pp
b7f0: 46 72 6f 6d 20 62 75 66 66 65 72 20 2a 2f 0a 20  From buffer */. 
b800: 20 69 6e 74 20 2a 70 6e 42 79 74 65 20 20 20 20   int *pnByte    
b810: 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6c 6c 6f        /* If allo
b820: 63 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  cation cannot be
b830: 20 6d 61 64 65 2c 20 69 6e 63 72 65 6d 65 6e 74   made, increment
b840: 20 2a 70 6e 42 79 74 65 20 2a 2f 0a 29 7b 0a 20   *pnByte */.){. 
b850: 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
b860: 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 2a 70  YTE_ALIGNMENT(*p
b870: 70 46 72 6f 6d 29 20 29 3b 0a 20 20 69 66 28 20  pFrom) );.  if( 
b880: 70 42 75 66 20 29 20 72 65 74 75 72 6e 20 70 42  pBuf ) return pB
b890: 75 66 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f  uf;.  nByte = RO
b8a0: 55 4e 44 38 28 6e 42 79 74 65 29 3b 0a 20 20 69  UND8(nByte);.  i
b8b0: 66 28 20 26 28 2a 70 70 46 72 6f 6d 29 5b 6e 42  f( &(*ppFrom)[nB
b8c0: 79 74 65 5d 20 3c 3d 20 70 45 6e 64 20 29 7b 0a  yte] <= pEnd ){.
b8d0: 20 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64      pBuf = (void
b8e0: 2a 29 2a 70 70 46 72 6f 6d 3b 0a 20 20 20 20 2a  *)*ppFrom;.    *
b8f0: 70 70 46 72 6f 6d 20 2b 3d 20 6e 42 79 74 65 3b  ppFrom += nByte;
b900: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
b910: 6e 42 79 74 65 20 2b 3d 20 6e 42 79 74 65 3b 0a  nByte += nByte;.
b920: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 42 75    }.  return pBu
b930: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69  f;.}../*.** Rewi
b940: 6e 64 20 74 68 65 20 56 44 42 45 20 62 61 63 6b  nd the VDBE back
b950: 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
b960: 67 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  g in preparation
b970: 20 66 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20   for.** running 
b980: 69 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  it..*/.void sqli
b990: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 56 64  te3VdbeRewind(Vd
b9a0: 62 65 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69  be *p){.#if defi
b9b0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
b9c0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42  ) || defined(VDB
b9d0: 45 5f 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74  E_PROFILE).  int
b9e0: 20 69 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73   i;.#endif.  ass
b9f0: 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61  ert( p!=0 );.  a
ba00: 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d  ssert( p->magic=
ba10: 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54  =VDBE_MAGIC_INIT
ba20: 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20   );..  /* There 
ba30: 73 68 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61  should be at lea
ba40: 73 74 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20  st one opcode.. 
ba50: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d   */.  assert( p-
ba60: 3e 6e 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20  >nOp>0 );..  /* 
ba70: 53 65 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f  Set the magic to
ba80: 20 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20   VDBE_MAGIC_RUN 
ba90: 73 6f 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68  sooner rather th
baa0: 61 6e 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70  an later. */.  p
bab0: 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
bac0: 41 47 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65  AGIC_RUN;..#ifde
bad0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
bae0: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 70 2d 3e 6e   for(i=1; i<p->n
baf0: 4d 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Mem; i++){.    a
bb00: 73 73 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69  ssert( p->aMem[i
bb10: 5d 2e 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20  ].db==p->db );. 
bb20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70   }.#endif.  p->p
bb30: 63 20 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20  c = -1;.  p->rc 
bb40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  = SQLITE_OK;.  p
bb50: 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20  ->errorAction = 
bb60: 4f 45 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6d  OE_Abort;.  p->m
bb70: 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
bb80: 43 5f 52 55 4e 3b 0a 20 20 70 2d 3e 6e 43 68 61  C_RUN;.  p->nCha
bb90: 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63 61  nge = 0;.  p->ca
bba0: 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70 2d  cheCtr = 1;.  p-
bbb0: 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f 72  >minWriteFileFor
bbc0: 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d 3e  mat = 255;.  p->
bbd0: 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  iStatement = 0;.
bbe0: 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69    p->nFkConstrai
bbf0: 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 56  nt = 0;.#ifdef V
bc00: 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66 6f  DBE_PROFILE.  fo
bc10: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b  r(i=0; i<p->nOp;
bc20: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61 4f   i++){.    p->aO
bc30: 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20 20  p[i].cnt = 0;.  
bc40: 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c    p->aOp[i].cycl
bc50: 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  es = 0;.  }.#end
bc60: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70  if.}../*.** Prep
bc70: 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d 61  are a virtual ma
bc80: 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75 74  chine for execut
bc90: 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72 73  ion for the firs
bca0: 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a 20  t time after.** 
bcb0: 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69 72  creating the vir
bcc0: 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20 54  tual machine.  T
bcd0: 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68 69  his involves thi
bce0: 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20 61  ngs such.** as a
bcf0: 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73 74  llocating regist
bd00: 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ers and initiali
bd10: 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61 6d  zing the program
bd20: 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66 74   counter..** Aft
bd30: 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73 20  er the VDBE has 
bd40: 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20 63  be prepped, it c
bd50: 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20 62  an be executed b
bd60: 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a 2a  y one or more.**
bd70: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
bd80: 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a 2a  3VdbeExec().  .*
bd90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
bda0: 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64  on may be called
bdb0: 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f 6e   exactly once on
bdc0: 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d 61   each virtual ma
bdd0: 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72 20  chine..** After 
bde0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
bdf0: 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68 61  called the VM ha
be00: 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65 64  s been "packaged
be10: 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a 2a  " and is ready.*
be20: 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65 72  * to run.  After
be30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
be40: 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65 72   called, further
be50: 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73 71   calls to .** sq
be60: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 29  lite3VdbeAddOp()
be70: 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 70   functions are p
be80: 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69 73  rohibited.  This
be90: 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e 6e   routine disconn
bea0: 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62 65  ects.** the Vdbe
beb0: 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65 20   from the Parse 
bec0: 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c 70  object that help
bed0: 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20 73  ed generate it s
bee0: 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74 68  o that the.** th
bef0: 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20 61  e Vdbe becomes a
bf00: 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65 6e  n independent en
bf10: 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61 72  tity and the Par
bf20: 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65  se object can be
bf30: 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a  .** destroyed..*
bf40: 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71 6c  *.** Use the sql
bf50: 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 29  ite3VdbeRewind()
bf60: 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72 65   procedure to re
bf70: 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c 20  store a virtual 
bf80: 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a 20  machine back.** 
bf90: 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20 73  to its initial s
bfa0: 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68 61  tate after it ha
bfb0: 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a 76  s been run..*/.v
bfc0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 4d  oid sqlite3VdbeM
bfd0: 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62 65  akeReady(.  Vdbe
bfe0: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
bff0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
c000: 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72 73  e VDBE */.  Pars
c010: 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20 20  e *pParse       
c020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
c030: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c040: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
c050: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
c060: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
c070: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
c080: 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20 20  */.  int nVar;  
c090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c0b0: 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20   parameters */. 
c0c0: 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20 20   int nMem;      
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d 20  /* Number of VM 
c0f0: 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72 73  memory registers
c100: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73 6f   */.  int nCurso
c110: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c130: 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69 72  f cursors requir
c140: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ed */.  int nArg
c150: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c160: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c170: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   of arguments in
c180: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f 0a   subprograms */.
c190: 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20 20    int nOnce;    
c1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f 50   /* Number of OP
c1c0: 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69 6f  _Once instructio
c1d0: 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ns */.  int n;  
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
c200: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 2a  ounter */.  u8 *
c210: 7a 43 73 72 3b 20 20 20 20 20 20 20 20 20 20 20  zCsr;           
c220: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
c230: 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66  mory available f
c240: 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 2a 2f  or allocation */
c250: 0a 20 20 75 38 20 2a 7a 45 6e 64 3b 20 20 20 20  .  u8 *zEnd;    
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
c280: 70 61 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 6d  past allocated m
c290: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
c2a0: 42 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  Byte;           
c2b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77            /* How
c2c0: 20 6d 75 63 68 20 65 78 74 72 61 20 6d 65 6d 6f   much extra memo
c2d0: 72 79 20 69 73 20 6e 65 65 64 65 64 20 2a 2f 0a  ry is needed */.
c2e0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
c2f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
c300: 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72  nOp>0 );.  asser
c310: 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b 0a  t( pParse!=0 );.
c320: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
c330: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
c340: 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NIT );.  assert(
c350: 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61 72   pParse==p->pPar
c360: 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d 3e  se );.  db = p->
c370: 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  db;.  assert( db
c380: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d 3d  ->mallocFailed==
c390: 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70 50  0 );.  nVar = pP
c3a0: 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e 4d  arse->nVar;.  nM
c3b0: 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  em = pParse->nMe
c3c0: 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20 70  m;.  nCursor = p
c3d0: 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 6e  Parse->nTab;.  n
c3e0: 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Arg = pParse->nM
c3f0: 61 78 41 72 67 3b 0a 20 20 6e 4f 6e 63 65 20 3d  axArg;.  nOnce =
c400: 20 70 50 61 72 73 65 2d 3e 6e 4f 6e 63 65 3b 0a   pParse->nOnce;.
c410: 20 20 69 66 28 20 6e 4f 6e 63 65 3d 3d 30 20 29    if( nOnce==0 )
c420: 20 6e 4f 6e 63 65 20 3d 20 31 3b 20 2f 2a 20 45   nOnce = 1; /* E
c430: 6e 73 75 72 65 20 61 74 20 6c 65 61 73 74 20 6f  nsure at least o
c440: 6e 65 20 62 79 74 65 20 69 6e 20 70 2d 3e 61 4f  ne byte in p->aO
c450: 6e 63 65 46 6c 61 67 5b 5d 20 2a 2f 0a 20 20 0a  nceFlag[] */.  .
c460: 20 20 2f 2a 20 46 6f 72 20 65 61 63 68 20 63 75    /* For each cu
c470: 72 73 6f 72 20 72 65 71 75 69 72 65 64 2c 20 61  rsor required, a
c480: 6c 73 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d  lso allocate a m
c490: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 4d 65 6d 6f  emory cell. Memo
c4a0: 72 79 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 28 6e  ry.  ** cells (n
c4b0: 4d 65 6d 2b 31 2d 6e 43 75 72 73 6f 72 29 2e 2e  Mem+1-nCursor)..
c4c0: 6e 4d 65 6d 2c 20 69 6e 63 6c 75 73 69 76 65 2c  nMem, inclusive,
c4d0: 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 20 75   will never be u
c4e0: 73 65 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20  sed by.  ** the 
c4f0: 76 64 62 65 20 70 72 6f 67 72 61 6d 2e 20 49 6e  vdbe program. In
c500: 73 74 65 61 64 20 74 68 65 79 20 61 72 65 20 75  stead they are u
c510: 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  sed to allocate 
c520: 73 70 61 63 65 20 66 6f 72 0a 20 20 2a 2a 20 56  space for.  ** V
c530: 64 62 65 43 75 72 73 6f 72 2f 42 74 43 75 72 73  dbeCursor/BtCurs
c540: 6f 72 20 73 74 72 75 63 74 75 72 65 73 2e 20 54  or structures. T
c550: 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72  he blob of memor
c560: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
c570: 68 20 0a 20 20 2a 2a 20 63 75 72 73 6f 72 20 30  h .  ** cursor 0
c580: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
c590: 6d 6f 72 79 20 63 65 6c 6c 20 6e 4d 65 6d 2e 20  mory cell nMem. 
c5a0: 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 28 6e 4d 65  Memory cell (nMe
c5b0: 6d 2d 31 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73  m-1).  ** stores
c5c0: 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
c5d0: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
c5e0: 69 74 68 20 63 75 72 73 6f 72 20 31 2c 20 65 74  ith cursor 1, et
c5f0: 63 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 65 65  c..  **.  ** See
c600: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
c610: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
c620: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
c630: 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
c640: 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
c650: 20 72 65 67 69 73 74 65 72 73 2c 20 53 51 4c 20   registers, SQL 
c660: 76 61 72 69 61 62 6c 65 73 2c 20 56 44 42 45 20  variables, VDBE 
c670: 63 75 72 73 6f 72 73 20 61 6e 64 20 0a 20 20 2a  cursors and .  *
c680: 2a 20 61 6e 20 61 72 72 61 79 20 74 6f 20 6d 61  * an array to ma
c690: 72 73 68 61 6c 20 53 51 4c 20 66 75 6e 63 74 69  rshal SQL functi
c6a0: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 2e  on arguments in.
c6b0: 0a 20 20 2a 2f 0a 20 20 7a 43 73 72 20 3d 20 28  .  */.  zCsr = (
c6c0: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  u8*)&p->aOp[p->n
c6d0: 4f 70 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Op];            
c6e0: 2f 2a 20 4d 65 6d 6f 72 79 20 61 76 61 6c 69 61  /* Memory avalia
c6f0: 62 6c 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69  ble for allocati
c700: 6f 6e 20 2a 2f 0a 20 20 7a 45 6e 64 20 3d 20 28  on */.  zEnd = (
c710: 75 38 2a 29 26 70 2d 3e 61 4f 70 5b 70 50 61 72  u8*)&p->aOp[pPar
c720: 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 5d 3b 20 20  se->nOpAlloc];  
c730: 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 70 61  /* First byte pa
c740: 73 74 20 65 6e 64 20 6f 66 20 7a 43 73 72 5b 5d  st end of zCsr[]
c750: 20 2a 2f 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32   */..  resolveP2
c760: 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29  Values(p, &nArg)
c770: 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a  ;.  p->usesStmtJ
c780: 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50  ournal = (u8)(pP
c790: 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69  arse->isMultiWri
c7a0: 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61  te && pParse->ma
c7b0: 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70  yAbort);.  if( p
c7c0: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26  Parse->explain &
c7d0: 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20  & nMem<10 ){.   
c7e0: 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a   nMem = 10;.  }.
c7f0: 20 20 6d 65 6d 73 65 74 28 7a 43 73 72 2c 20 30    memset(zCsr, 0
c800: 2c 20 7a 45 6e 64 2d 7a 43 73 72 29 3b 0a 20 20  , zEnd-zCsr);.  
c810: 7a 43 73 72 20 2b 3d 20 28 7a 43 73 72 20 2d 20  zCsr += (zCsr - 
c820: 28 75 38 2a 29 30 29 26 37 3b 0a 20 20 61 73 73  (u8*)0)&7;.  ass
c830: 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f  ert( EIGHT_BYTE_
c840: 41 4c 49 47 4e 4d 45 4e 54 28 7a 43 73 72 29 20  ALIGNMENT(zCsr) 
c850: 29 3b 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20  );.  p->expired 
c860: 3d 20 30 3b 0a 0a 20 20 70 2d 3e 65 78 70 69 72  = 0;..  p->expir
c870: 65 64 20 3d 20 30 3b 0a 20 20 0a 20 20 2f 2a 20  ed = 0;.  .  /* 
c880: 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67 69 73  Memory for regis
c890: 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65 72 73  ters, parameters
c8a0: 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c 20 69  , cursor, etc, i
c8b0: 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e 20 74  s allocated in t
c8c0: 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e 20  wo.  ** passes. 
c8d0: 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70 61   On the first pa
c8e0: 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72 65  ss, we try to re
c8f0: 75 73 65 20 75 6e 75 73 65 64 20 73 70 61 63 65  use unused space
c900: 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e   at the .  ** en
c910: 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  d of the opcode 
c920: 61 72 72 61 79 2e 20 20 49 66 20 77 65 20 61 72  array.  If we ar
c930: 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69  e unable to sati
c940: 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20  sfy all memory. 
c950: 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73   ** requirements
c960: 20 62 79 20 72 65 75 73 69 6e 67 20 74 68 65 20   by reusing the 
c970: 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74 61 69  opcode array tai
c980: 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f  l, then the seco
c990: 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c  nd.  ** pass wil
c9a0: 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65  l fill in the re
c9b0: 73 74 20 75 73 69 6e 67 20 61 20 66 72 65 73 68  st using a fresh
c9c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20   allocation.  . 
c9d0: 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77   **.  ** This tw
c9e0: 6f 2d 70 61 73 73 20 61 70 70 72 6f 61 63 68 20  o-pass approach 
c9f0: 74 68 61 74 20 72 65 75 73 65 73 20 61 73 20 6d  that reuses as m
ca00: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f  uch memory as po
ca10: 73 73 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a  ssible from.  **
ca20: 20 74 68 65 20 6c 65 66 74 6f 76 65 72 20 73 70   the leftover sp
ca30: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
ca40: 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72  f the opcode arr
ca50: 61 79 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61  ay can significa
ca60: 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65  ntly.  ** reduce
ca70: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d   the amount of m
ca80: 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20  emory held by a 
ca90: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
caa0: 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a  nt..  */.  do {.
cab0: 20 20 20 20 6e 42 79 74 65 20 3d 20 30 3b 0a 20      nByte = 0;. 
cac0: 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61 6c 6c     p->aMem = all
cad0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 4d 65 6d 2c  ocSpace(p->aMem,
cae0: 20 6e 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d   nMem*sizeof(Mem
caf0: 29 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20  ), &zCsr, zEnd, 
cb00: 26 6e 42 79 74 65 29 3b 0a 20 20 20 20 70 2d 3e  &nByte);.    p->
cb10: 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aVar = allocSpac
cb20: 65 28 70 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a  e(p->aVar, nVar*
cb30: 73 69 7a 65 6f 66 28 4d 65 6d 29 2c 20 26 7a 43  sizeof(Mem), &zC
cb40: 73 72 2c 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65  sr, zEnd, &nByte
cb50: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20  );.    p->apArg 
cb60: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
cb70: 61 70 41 72 67 2c 20 6e 41 72 67 2a 73 69 7a 65  apArg, nArg*size
cb80: 6f 66 28 4d 65 6d 2a 29 2c 20 26 7a 43 73 72 2c  of(Mem*), &zCsr,
cb90: 20 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a   zEnd, &nByte);.
cba0: 20 20 20 20 70 2d 3e 61 7a 56 61 72 20 3d 20 61      p->azVar = a
cbb0: 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e 61 7a 56  llocSpace(p->azV
cbc0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
cbd0: 63 68 61 72 2a 29 2c 20 26 7a 43 73 72 2c 20 7a  char*), &zCsr, z
cbe0: 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20 20  End, &nByte);.  
cbf0: 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c 6c    p->apCsr = all
cc00: 6f 63 53 70 61 63 65 28 70 2d 3e 61 70 43 73 72  ocSpace(p->apCsr
cc10: 2c 20 6e 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66  , nCursor*sizeof
cc20: 28 56 64 62 65 43 75 72 73 6f 72 2a 29 2c 0a 20  (VdbeCursor*),. 
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 20 20 20 20 20 26 7a 43 73 72 2c 20           &zCsr, 
cc50: 7a 45 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 20  zEnd, &nByte);. 
cc60: 20 20 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 20     p->aOnceFlag 
cc70: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 70 2d 3e  = allocSpace(p->
cc80: 61 4f 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65  aOnceFlag, nOnce
cc90: 2c 20 26 7a 43 73 72 2c 20 7a 45 6e 64 2c 20 26  , &zCsr, zEnd, &
cca0: 6e 42 79 74 65 29 3b 0a 23 69 66 64 65 66 20 53  nByte);.#ifdef S
ccb0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
ccc0: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 20  T_SCANSTATUS.   
ccd0: 20 70 2d 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c   p->anExec = all
cce0: 6f 63 53 70 61 63 65 28 70 2d 3e 61 6e 45 78 65  ocSpace(p->anExe
ccf0: 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66  c, p->nOp*sizeof
cd00: 28 69 36 34 29 2c 20 26 7a 43 73 72 2c 20 7a 45  (i64), &zCsr, zE
cd10: 6e 64 2c 20 26 6e 42 79 74 65 29 3b 0a 23 65 6e  nd, &nByte);.#en
cd20: 64 69 66 0a 20 20 20 20 69 66 28 20 6e 42 79 74  dif.    if( nByt
cd30: 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 46  e ){.      p->pF
cd40: 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d  ree = sqlite3DbM
cd50: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 6e 42  allocZero(db, nB
cd60: 79 74 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  yte);.    }.    
cd70: 7a 43 73 72 20 3d 20 70 2d 3e 70 46 72 65 65 3b  zCsr = p->pFree;
cd80: 0a 20 20 20 20 7a 45 6e 64 20 3d 20 26 7a 43 73  .    zEnd = &zCs
cd90: 72 5b 6e 42 79 74 65 5d 3b 0a 20 20 7d 77 68 69  r[nByte];.  }whi
cda0: 6c 65 28 20 6e 42 79 74 65 20 26 26 20 21 64 62  le( nByte && !db
cdb0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
cdc0: 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20  ;..  p->nCursor 
cdd0: 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e  = nCursor;.  p->
cde0: 6e 4f 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63  nOnceFlag = nOnc
cdf0: 65 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72  e;.  if( p->aVar
ce00: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20   ){.    p->nVar 
ce10: 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20  = (ynVar)nVar;. 
ce20: 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56     for(n=0; n<nV
ce30: 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; n++){.      
ce40: 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73  p->aVar[n].flags
ce50: 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20   = MEM_Null;.   
ce60: 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62     p->aVar[n].db
ce70: 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d   = db;.    }.  }
ce80: 0a 20 20 69 66 28 20 70 2d 3e 61 7a 56 61 72 20  .  if( p->azVar 
ce90: 26 26 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72  && pParse->nzVar
cea0: 3e 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 7a 56  >0 ){.    p->nzV
ceb0: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 7a 56  ar = pParse->nzV
cec0: 61 72 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  ar;.    memcpy(p
ced0: 2d 3e 61 7a 56 61 72 2c 20 70 50 61 72 73 65 2d  ->azVar, pParse-
cee0: 3e 61 7a 56 61 72 2c 20 70 2d 3e 6e 7a 56 61 72  >azVar, p->nzVar
cef0: 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 7a 56 61 72  *sizeof(p->azVar
cf00: 5b 30 5d 29 29 3b 0a 20 20 20 20 6d 65 6d 73 65  [0]));.    memse
cf10: 74 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 2c  t(pParse->azVar,
cf20: 20 30 2c 20 70 50 61 72 73 65 2d 3e 6e 7a 56 61   0, pParse->nzVa
cf30: 72 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  r*sizeof(pParse-
cf40: 3e 61 7a 56 61 72 5b 30 5d 29 29 3b 0a 20 20 7d  >azVar[0]));.  }
cf50: 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29  .  if( p->aMem )
cf60: 7b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 2d 2d 3b  {.    p->aMem--;
cf70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf80: 20 20 20 20 20 20 2f 2a 20 61 4d 65 6d 5b 5d 20        /* aMem[] 
cf90: 67 6f 65 73 20 66 72 6f 6d 20 31 2e 2e 6e 4d 65  goes from 1..nMe
cfa0: 6d 20 2a 2f 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d  m */.    p->nMem
cfb0: 20 3d 20 6e 4d 65 6d 3b 20 20 20 20 20 20 20 20   = nMem;        
cfc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 20           /*     
cfd0: 20 20 6e 6f 74 20 66 72 6f 6d 20 30 2e 2e 6e 4d    not from 0..nM
cfe0: 65 6d 2d 31 20 2a 2f 0a 20 20 20 20 66 6f 72 28  em-1 */.    for(
cff0: 6e 3d 31 3b 20 6e 3c 3d 6e 4d 65 6d 3b 20 6e 2b  n=1; n<=nMem; n+
d000: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65  +){.      p->aMe
d010: 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  m[n].flags = MEM
d020: 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20  _Undefined;.    
d030: 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20    p->aMem[n].db 
d040: 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = db;.    }.  }.
d050: 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70    p->explain = p
d060: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a  Parse->explain;.
d070: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77    sqlite3VdbeRew
d080: 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ind(p);.}../*.**
d090: 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75   Close a VDBE cu
d0a0: 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65  rsor and release
d0b0: 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63   all the resourc
d0c0: 65 73 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a  es that cursor .
d0d0: 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f  ** happens to ho
d0e0: 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ld..*/.void sqli
d0f0: 74 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f  te3VdbeFreeCurso
d100: 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43  r(Vdbe *p, VdbeC
d110: 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69  ursor *pCx){.  i
d120: 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20  f( pCx==0 ){.   
d130: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
d140: 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65 72  qlite3VdbeSorter
d150: 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43 78  Close(p->db, pCx
d160: 29 3b 0a 20 20 69 66 28 20 70 43 78 2d 3e 70 42  );.  if( pCx->pB
d170: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
d180: 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78 2d 3e  BtreeClose(pCx->
d190: 70 42 74 29 3b 0a 20 20 20 20 2f 2a 20 54 68 65  pBt);.    /* The
d1a0: 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69   pCx->pCursor wi
d1b0: 6c 6c 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f  ll be close auto
d1c0: 6d 61 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74  matically, if it
d1d0: 20 65 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20   exists, by.    
d1e0: 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76  ** the call abov
d1f0: 65 2e 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  e. */.  }else if
d200: 28 20 70 43 78 2d 3e 70 43 75 72 73 6f 72 20 29  ( pCx->pCursor )
d210: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  {.    sqlite3Btr
d220: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 43  eeCloseCursor(pC
d230: 78 2d 3e 70 43 75 72 73 6f 72 29 3b 0a 20 20 7d  x->pCursor);.  }
d240: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d250: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
d260: 45 0a 20 20 65 6c 73 65 20 69 66 28 20 70 43 78  E.  else if( pCx
d270: 2d 3e 70 56 74 61 62 43 75 72 73 6f 72 20 29 7b  ->pVtabCursor ){
d280: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61  .    sqlite3_vta
d290: 62 5f 63 75 72 73 6f 72 20 2a 70 56 74 61 62 43  b_cursor *pVtabC
d2a0: 75 72 73 6f 72 20 3d 20 70 43 78 2d 3e 70 56 74  ursor = pCx->pVt
d2b0: 61 62 43 75 72 73 6f 72 3b 0a 20 20 20 20 63 6f  abCursor;.    co
d2c0: 6e 73 74 20 73 71 6c 69 74 65 33 5f 6d 6f 64 75  nst sqlite3_modu
d2d0: 6c 65 20 2a 70 4d 6f 64 75 6c 65 20 3d 20 70 56  le *pModule = pV
d2e0: 74 61 62 43 75 72 73 6f 72 2d 3e 70 56 74 61 62  tabCursor->pVtab
d2f0: 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 61  ->pModule;.    a
d300: 73 73 65 72 74 28 20 70 56 74 61 62 43 75 72 73  ssert( pVtabCurs
d310: 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e  or->pVtab->nRef>
d320: 30 20 29 3b 0a 20 20 20 20 70 56 74 61 62 43 75  0 );.    pVtabCu
d330: 72 73 6f 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  rsor->pVtab->nRe
d340: 66 2d 2d 3b 0a 20 20 20 20 70 4d 6f 64 75 6c 65  f--;.    pModule
d350: 2d 3e 78 43 6c 6f 73 65 28 70 56 74 61 62 43 75  ->xClose(pVtabCu
d360: 72 73 6f 72 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rsor);.  }.#endi
d370: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  f.}../*.** Copy 
d380: 74 68 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65  the values store
d390: 64 20 69 6e 20 74 68 65 20 56 64 62 65 46 72 61  d in the VdbeFra
d3a0: 6d 65 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  me structure to 
d3b0: 69 74 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a  its Vdbe. This.*
d3c0: 2a 20 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65  * is used, for e
d3d0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74  xample, when a t
d3e0: 72 69 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72  rigger sub-progr
d3f0: 61 6d 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20  am is halted to 
d400: 72 65 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72  restore.** contr
d410: 6f 6c 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70  ol to the main p
d420: 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73  rogram..*/.int s
d430: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 52  qlite3VdbeFrameR
d440: 65 73 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65  estore(VdbeFrame
d450: 20 2a 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62   *pFrame){.  Vdb
d460: 65 20 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76  e *v = pFrame->v
d470: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
d480: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
d490: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
d4a0: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
d4b0: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
d4c0: 3e 61 4f 6e 63 65 46 6c 61 67 20 3d 20 70 46 72  >aOnceFlag = pFr
d4d0: 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c 61 67 3b 0a  ame->aOnceFlag;.
d4e0: 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c 61 67 20 3d    v->nOnceFlag =
d4f0: 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e 63 65 46 6c   pFrame->nOnceFl
d500: 61 67 3b 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  ag;.  v->aOp = p
d510: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
d520: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
d530: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
d540: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
d550: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
d560: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
d570: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
d580: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
d590: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
d5a0: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
d5b0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
d5c0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
d5d0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
d5e0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d  e->nChange;.  v-
d5f0: 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  >db->nChange = p
d600: 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
d610: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72 61 6d  ;.  return pFram
d620: 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->pc;.}../*.** 
d630: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
d640: 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  s..**.** Also re
d650: 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61 6d 69  lease any dynami
d660: 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79  c memory held by
d670: 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65 20 56   the VM in the V
d680: 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72 79 20  dbe.aMem memory 
d690: 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79 2e 20  .** cell array. 
d6a0: 54 68 69 73 20 69 73 20 6e 65 63 65 73 73 61 72  This is necessar
d6b0: 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72 79 20  y as the memory 
d6c0: 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79 20 63  cell array may c
d6d0: 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e 74 65  ontain.** pointe
d6e0: 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d 65 20  rs to VdbeFrame 
d6f0: 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68 20 6d  objects, which m
d700: 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e 74 61  ay in turn conta
d710: 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  in pointers to.*
d720: 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  * open cursors..
d730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
d740: 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 56  loseAllCursors(V
d750: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
d760: 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20 20 20  ->pFrame ){.    
d770: 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61 6d  VdbeFrame *pFram
d780: 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72 61 6d  e;.    for(pFram
d790: 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70 46 72  e=p->pFrame; pFr
d7a0: 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20 70 46  ame->pParent; pF
d7b0: 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70 50 61  rame=pFrame->pPa
d7c0: 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  rent);.    sqlit
d7d0: 65 33 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f  e3VdbeFrameResto
d7e0: 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20 20 20  re(pFrame);.    
d7f0: 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b 0a 20  p->pFrame = 0;. 
d800: 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d 20 30     p->nFrame = 0
d810: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
d820: 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29 3b 0a  p->nFrame==0 );.
d830: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
d840: 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
d850: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d860: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20  nCursor; i++){. 
d870: 20 20 20 20 20 56 64 62 65 43 75 72 73 6f 72 20       VdbeCursor 
d880: 2a 70 43 20 3d 20 70 2d 3e 61 70 43 73 72 5b 69  *pC = p->apCsr[i
d890: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 20  ];.      if( pC 
d8a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
d8b0: 65 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72  e3VdbeFreeCursor
d8c0: 28 70 2c 20 70 43 29 3b 0a 20 20 20 20 20 20 20  (p, pC);.       
d8d0: 20 70 2d 3e 61 70 43 73 72 5b 69 5d 20 3d 20 30   p->apCsr[i] = 0
d8e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d8f0: 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65    }.  if( p->aMe
d900: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
d910: 4d 65 6d 41 72 72 61 79 28 26 70 2d 3e 61 4d 65  MemArray(&p->aMe
d920: 6d 5b 31 5d 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a  m[1], p->nMem);.
d930: 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 2d 3e    }.  while( p->
d940: 70 44 65 6c 46 72 61 6d 65 20 29 7b 0a 20 20 20  pDelFrame ){.   
d950: 20 56 64 62 65 46 72 61 6d 65 20 2a 70 44 65 6c   VdbeFrame *pDel
d960: 20 3d 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 3b   = p->pDelFrame;
d970: 0a 20 20 20 20 70 2d 3e 70 44 65 6c 46 72 61 6d  .    p->pDelFram
d980: 65 20 3d 20 70 44 65 6c 2d 3e 70 50 61 72 65 6e  e = pDel->pParen
d990: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  t;.    sqlite3Vd
d9a0: 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 70 44  beFrameDelete(pD
d9b0: 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  el);.  }..  /* D
d9c0: 65 6c 65 74 65 20 61 6e 79 20 61 75 78 64 61 74  elete any auxdat
d9d0: 61 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6d 61  a allocations ma
d9e0: 64 65 20 62 79 20 74 68 65 20 56 4d 20 2a 2f 0a  de by the VM */.
d9f0: 20 20 69 66 28 20 70 2d 3e 70 41 75 78 44 61 74    if( p->pAuxDat
da00: 61 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 44  a ) sqlite3VdbeD
da10: 65 6c 65 74 65 41 75 78 44 61 74 61 28 70 2c 20  eleteAuxData(p, 
da20: 2d 31 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  -1, 0);.  assert
da30: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30  ( p->pAuxData==0
da40: 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   );.}../*.** Cle
da50: 61 6e 20 75 70 20 74 68 65 20 56 4d 20 61 66 74  an up the VM aft
da60: 65 72 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e  er a single run.
da70: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
da80: 43 6c 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29  Cleanup(Vdbe *p)
da90: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
daa0: 3d 20 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66  = p->db;..#ifdef
dab0: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
dac0: 2f 2a 20 45 78 65 63 75 74 65 20 61 73 73 65 72  /* Execute asser
dad0: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74  t() statements t
dae0: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
daf0: 65 20 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61  e Vdbe.apCsr[] a
db00: 6e 64 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d  nd .  ** Vdbe.aM
db10: 65 6d 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65  em[] arrays have
db20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c   already been cl
db30: 65 61 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20  eaned up.  */.  
db40: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e  int i;.  if( p->
db50: 61 70 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b  apCsr ) for(i=0;
db60: 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69   i<p->nCursor; i
db70: 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61  ++) assert( p->a
db80: 70 43 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20  pCsr[i]==0 );.  
db90: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
dba0: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 70     for(i=1; i<=p
dbb0: 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73  ->nMem; i++) ass
dbc0: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
dbd0: 66 6c 61 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66  flags==MEM_Undef
dbe0: 69 6e 65 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  ined );.  }.#end
dbf0: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 44 62 46  if..  sqlite3DbF
dc00: 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d  ree(db, p->zErrM
dc10: 73 67 29 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73  sg);.  p->zErrMs
dc20: 67 20 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73  g = 0;.  p->pRes
dc30: 75 6c 74 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  ultSet = 0;.}../
dc40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e 75 6d  *.** Set the num
dc50: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
dc60: 6c 75 6d 6e 73 20 74 68 61 74 20 77 69 6c 6c 20  lumns that will 
dc70: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
dc80: 68 69 73 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65  his SQL.** state
dc90: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  ment. This is no
dca0: 77 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  w set at compile
dcb0: 20 74 69 6d 65 2c 20 72 61 74 68 65 72 20 74 68   time, rather th
dcc0: 61 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65  an during.** exe
dcd0: 63 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 64  cution of the vd
dce0: 62 65 20 70 72 6f 67 72 61 6d 20 73 6f 20 74 68  be program so th
dcf0: 61 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  at sqlite3_colum
dd00: 6e 5f 63 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a  n_count() can.**
dd10: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e   be called on an
dd20: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
dd30: 65 66 6f 72 65 20 73 71 6c 69 74 65 33 5f 73 74  efore sqlite3_st
dd40: 65 70 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ep()..*/.void sq
dd50: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
dd60: 6f 6c 73 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ols(Vdbe *p, int
dd70: 20 6e 52 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20   nResColumn){.  
dd80: 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20  Mem *pColName;. 
dd90: 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65   int n;.  sqlite
dda0: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
ddb0: 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
ddc0: 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
ddd0: 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
dde0: 4e 41 4d 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74  NAME_N);.  sqlit
ddf0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
de00: 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d  aColName);.  n =
de10: 20 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e   nResColumn*COLN
de20: 41 4d 45 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73  AME_N;.  p->nRes
de30: 43 6f 6c 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52  Column = (u16)nR
de40: 65 73 43 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61  esColumn;.  p->a
de50: 43 6f 6c 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61  ColName = pColNa
de60: 6d 65 20 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74  me = (Mem*)sqlit
de70: 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64  e3DbMallocZero(d
de80: 62 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e  b, sizeof(Mem)*n
de90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f   );.  if( p->aCo
dea0: 6c 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72  lName==0 ) retur
deb0: 6e 3b 0a 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20  n;.  while( n-- 
dec0: 3e 20 30 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e  > 0 ){.    pColN
ded0: 61 6d 65 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  ame->flags = MEM
dee0: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e  _Null;.    pColN
def0: 61 6d 65 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  ame->db = p->db;
df00: 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b  .    pColName++;
df10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
df20: 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  t the name of th
df30: 65 20 69 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20  e idx'th column 
df40: 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62  to be returned b
df50: 79 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  y the SQL statem
df60: 65 6e 74 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75  ent..** zName mu
df70: 73 74 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  st be a pointer 
df80: 74 6f 20 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61  to a nul termina
df90: 74 65 64 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  ted string..**.*
dfa0: 2a 20 54 68 69 73 20 63 61 6c 6c 20 6d 75 73 74  * This call must
dfb0: 20 62 65 20 6d 61 64 65 20 61 66 74 65 72 20 61   be made after a
dfc0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
dfd0: 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29  VdbeSetNumCols()
dfe0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61  ..**.** The fina
dff0: 6c 20 70 61 72 61 6d 65 74 65 72 2c 20 78 44 65  l parameter, xDe
e000: 6c 2c 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f  l, must be one o
e010: 66 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43  f SQLITE_DYNAMIC
e020: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 0a  , SQLITE_STATIC.
e030: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 54 52 41  ** or SQLITE_TRA
e040: 4e 53 49 45 4e 54 2e 20 49 66 20 69 74 20 69 73  NSIENT. If it is
e050: 20 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c   SQLITE_DYNAMIC,
e060: 20 74 68 65 6e 20 74 68 65 20 62 75 66 66 65 72   then the buffer
e070: 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62   pointed.** to b
e080: 79 20 7a 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20  y zName will be 
e090: 66 72 65 65 64 20 62 79 20 73 71 6c 69 74 65 33  freed by sqlite3
e0a0: 44 62 46 72 65 65 28 29 20 77 68 65 6e 20 74 68  DbFree() when th
e0b0: 65 20 76 64 62 65 20 69 73 20 64 65 73 74 72 6f  e vdbe is destro
e0c0: 79 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  yed..*/.int sqli
e0d0: 74 65 33 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d  te3VdbeSetColNam
e0e0: 65 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  e(.  Vdbe *p,   
e0f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e100: 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 62 65        /* Vdbe be
e110: 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 20 2a  ing configured *
e120: 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
e150: 20 63 6f 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70   column zName ap
e160: 70 6c 69 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e  plies to */.  in
e170: 74 20 76 61 72 2c 20 20 20 20 20 20 20 20 20 20  t var,          
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e190: 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c  * One of the COL
e1a0: 4e 41 4d 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73  NAME_* constants
e1b0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e1c0: 20 2a 7a 4e 61 6d 65 2c 20 20 20 20 20 20 20 20   *zName,        
e1d0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
e1e0: 72 20 74 6f 20 62 75 66 66 65 72 20 63 6f 6e 74  r to buffer cont
e1f0: 61 69 6e 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20  aining name */. 
e200: 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
e210: 69 64 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  id*)            
e220: 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61    /* Memory mana
e230: 67 65 6d 65 6e 74 20 73 74 72 61 74 65 67 79 20  gement strategy 
e240: 66 6f 72 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a  for zName */.){.
e250: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20    int rc;.  Mem 
e260: 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73  *pColName;.  ass
e270: 65 72 74 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73  ert( idx<p->nRes
e280: 43 6f 6c 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65  Column );.  asse
e290: 72 74 28 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f  rt( var<COLNAME_
e2a0: 4e 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  N );.  if( p->db
e2b0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
e2c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 7a  {.    assert( !z
e2d0: 4e 61 6d 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51  Name || xDel!=SQ
e2e0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a  LITE_DYNAMIC );.
e2f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
e300: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 61  E_NOMEM;.  }.  a
e310: 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61  ssert( p->aColNa
e320: 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e  me!=0 );.  pColN
e330: 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e  ame = &(p->aColN
e340: 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e  ame[idx+var*p->n
e350: 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72  ResColumn]);.  r
e360: 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  c = sqlite3VdbeM
e370: 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d  emSetStr(pColNam
e380: 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51  e, zName, -1, SQ
e390: 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29  LITE_UTF8, xDel)
e3a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
e3b0: 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28  0 || !zName || (
e3c0: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26  pColName->flags&
e3d0: 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a  MEM_Term)!=0 );.
e3e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e3f0: 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20  /*.** A read or 
e400: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
e410: 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  n may or may not
e420: 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61   be active on da
e430: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
e440: 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61   db. If a transa
e450: 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c  ction is active,
e460: 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74   commit it. If t
e470: 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69  here is a.** wri
e480: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  te-transaction s
e490: 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61  panning more tha
e4a0: 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66  n one database f
e4b0: 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ile, this routin
e4c0: 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20  e.** takes care 
e4d0: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  of the master jo
e4e0: 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a  urnal trickery..
e4f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
e500: 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  beCommit(sqlite3
e510: 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a   *db, Vdbe *p){.
e520: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
e530: 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e  Trans = 0;  /* N
e540: 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62 61 73  umber of databas
e550: 65 73 20 77 69 74 68 20 61 6e 20 61 63 74 69 76  es with an activ
e560: 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  e write-transact
e570: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ion */.  int rc 
e580: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e590: 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
e5a0: 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
e5b0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
e5c0: 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
e5d0: 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
e5e0: 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
e5f0: 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
e600: 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
e610: 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
e620: 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
e630: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
e640: 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
e650: 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
e660: 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
e670: 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
e680: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
e690: 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
e6a0: 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
e6b0: 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
e6c0: 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
e6d0: 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
e6e0: 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
e6f0: 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
e700: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
e710: 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
e720: 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
e730: 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
e740: 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
e750: 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
e760: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
e770: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
e780: 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
e790: 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
e7a0: 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
e7b0: 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
e7c0: 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
e7d0: 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
e7e0: 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
e7f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
e800: 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
e810: 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
e820: 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
e830: 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
e840: 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
e850: 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
e860: 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
e870: 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
e880: 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
e890: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
e8a0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
e8b0: 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
e8c0: 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
e8d0: 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
e8e0: 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
e8f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
e900: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
e910: 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
e920: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
e930: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
e940: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
e950: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 6e  (pBt) ){.      n
e960: 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a  eedXcommit = 1;.
e970: 20 20 20 20 20 20 69 66 28 20 69 21 3d 31 20 29        if( i!=1 )
e980: 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
e990: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e9a0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 72  er(pBt);.      r
e9b0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e9c0: 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 73 71  ExclusiveLock(sq
e9d0: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
e9e0: 70 42 74 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  pBt));.      sql
e9f0: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ea00: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Bt);.    }.  }. 
ea10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ea20: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
ea30: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   rc;.  }..  /* I
ea40: 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20  f there are any 
ea50: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
ea60: 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76 6f 6b  ns at all, invok
ea70: 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f  e the commit hoo
ea80: 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65 64 58  k */.  if( needX
ea90: 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e 78 43  commit && db->xC
eaa0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 29 7b  ommitCallback ){
eab0: 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e 78 43  .    rc = db->xC
eac0: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28 64 62  ommitCallback(db
ead0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b 0a 20  ->pCommitArg);. 
eae0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
eaf0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
eb00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
eb10: 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITHOOK;.    }.  
eb20: 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69 6d 70  }..  /* The simp
eb30: 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d 6f 72  le case - no mor
eb40: 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74 61 62  e than one datab
eb50: 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 63 6f  ase file (not co
eb60: 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  unting the.  ** 
eb70: 54 45 4d 50 20 64 61 74 61 62 61 73 65 29 20 68  TEMP database) h
eb80: 61 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  as a transaction
eb90: 20 61 63 74 69 76 65 2e 20 20 20 54 68 65 72 65   active.   There
eba0: 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20   is no need for 
ebb0: 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65 72 2d  the.  ** master-
ebc0: 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a 20 20  journal..  **.  
ebd0: 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  ** If the return
ebe0: 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69 74 65   value of sqlite
ebf0: 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
ec00: 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20 6c 65  e() is a zero le
ec10: 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69 6e 67  ngth.  ** string
ec20: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 6d  , it means the m
ec30: 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
ec40: 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20 74 65  :memory: or a te
ec50: 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a 20 20  mp file.  In .  
ec60: 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77 65 20  ** that case we 
ec70: 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 61  do not support a
ec80: 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69 6c 65  tomic multi-file
ec90: 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75 73 65   commits, so use
eca0: 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d 70 6c   the .  ** simpl
ecb0: 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f 6f 2e  e case then too.
ecc0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73  .  */.  if( 0==s
ecd0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 73  qlite3Strlen30(s
ece0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69  qlite3BtreeGetFi
ecf0: 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30  lename(db->aDb[0
ed00: 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20 6e 54  ].pBt)).   || nT
ed10: 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20 20 20  rans<=1.  ){.   
ed20: 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51   for(i=0; rc==SQ
ed30: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d  LITE_OK && i<db-
ed40: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
ed50: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
ed60: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
ed70: 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
ed80: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
ed90: 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
eda0: 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30 29 3b  haseOne(pBt, 0);
edb0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
edc0: 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f      /* Do the co
edd0: 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61 6c 6c  mmit only if all
ede0: 20 64 61 74 61 62 61 73 65 73 20 73 75 63 63 65   databases succe
edf0: 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65 74 65  ssfully complete
ee00: 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20 20 2a   phase 1. .    *
ee10: 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  * If one of the 
ee20: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
ee30: 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61 69 6c  One() calls fail
ee40: 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61 74 65  s, this indicate
ee50: 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f 20 65  s an.    ** IO e
ee60: 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c 65 74  rror while delet
ee70: 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74 69 6e  ing or truncatin
ee80: 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  g a journal file
ee90: 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65 6c 79  . It is unlikely
eea0: 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63 6f 75  ,.    ** but cou
eeb0: 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20 74 68  ld happen. In th
eec0: 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f 6e 20  is case abandon 
eed0: 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64 20 72  processing and r
eee0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 2e  eturn the error.
eef0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
ef00: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
ef10: 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
ef20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72   i++){.      Btr
ef30: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
ef40: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20  b[i].pBt;.      
ef50: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
ef60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
ef70: 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54  treeCommitPhaseT
ef80: 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20  wo(pBt, 0);.    
ef90: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
efa0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
efb0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
efc0: 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a  VtabCommit(db);.
efd0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
efe0: 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61 73 65  The complex case
eff0: 20 2d 20 54 68 65 72 65 20 69 73 20 61 20 6d 75   - There is a mu
f000: 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65 2d 74  lti-file write-t
f010: 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
f020: 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72 65 71  e..  ** This req
f030: 75 69 72 65 73 20 61 20 6d 61 73 74 65 72 20 6a  uires a master j
f040: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65  ournal file to e
f050: 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e 73 61  nsure the transa
f060: 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 63 6f  ction is.  ** co
f070: 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63 61 6c  mmitted atomical
f080: 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ly..  */.#ifndef
f090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
f0a0: 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20  KIO.  else{.    
f0b0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
f0c0: 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20  s = db->pVfs;.  
f0d0: 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
f0e0: 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d   0;.    char *zM
f0f0: 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
f100: 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
f110: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f120: 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
f130: 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
f140: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
f150: 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
f160: 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
f170: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
f180: 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
f190: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
f1a0: 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
f1b0: 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
f1c0: 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
f1d0: 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
f1e0: 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
f1f0: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
f200: 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
f210: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
f220: 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
f230: 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
f240: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
f250: 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
f260: 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
f270: 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
f280: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
f290: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 64 6f 20 7b 0a  NOMEM;.    do {.
f2a0: 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64 6f        u32 iRando
f2b0: 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65 74  m;.      if( ret
f2c0: 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20  ryCount ){.     
f2d0: 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e     if( retryCoun
f2e0: 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  t>100 ){.       
f2f0: 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
f300: 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
f310: 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d 61  delete: %s", zMa
f320: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
f330: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
f340: 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
f350: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  0);.          br
f360: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
f370: 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e  se if( retryCoun
f380: 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  t==1 ){.        
f390: 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
f3a0: 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20 63  LITE_FULL, "MJ c
f3b0: 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d 61  ollide: %s", zMa
f3c0: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ster);.        }
f3d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
f3e0: 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  etryCount++;.   
f3f0: 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f     sqlite3_rando
f400: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52 61  mness(sizeof(iRa
f410: 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d 29  ndom), &iRandom)
f420: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f430: 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a 4d  snprintf(13, &zM
f440: 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65 5d  aster[nMainFile]
f450: 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58 22  , "-mj%06X9%02X"
f460: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30 78   (iRandom>>8)&0x
f490: 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d 26  ffffff, iRandom&
f4a0: 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a 20  0xff);.      /* 
f4b0: 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69 6d  The antipenultim
f4c0: 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f 66  ate character of
f4d0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f4e0: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20 20  nal name must.  
f4f0: 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74 6f      ** be "9" to
f500: 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c 6c   avoid name coll
f510: 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69 6e  isions when usin
f520: 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73 2e  g 8+3 filenames.
f530: 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74   */.      assert
f540: 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74 65  ( zMaster[sqlite
f550: 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74 65  3Strlen30(zMaste
f560: 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20 20  r)-3]=='9' );.  
f570: 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65 53      sqlite3FileS
f580: 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c 65  uffix3(zMainFile
f590: 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
f5a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
f5b0: 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d 61  Access(pVfs, zMa
f5c0: 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43 43  ster, SQLITE_ACC
f5d0: 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65 73  ESS_EXISTS, &res
f5e0: 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
f5f0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
f600: 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20 72  res );.    if( r
f610: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
f620: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
f630: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
f640: 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20  . */.      rc = 
f650: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61 6c  sqlite3OsOpenMal
f660: 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  loc(pVfs, zMaste
f670: 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20 20  r, &pMaster, .  
f680: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
f690: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
f6a0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
f6b0: 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49  |.          SQLI
f6c0: 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
f6d0: 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
f6e0: 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30 0a  STER_JOURNAL, 0.
f6f0: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
f700: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
f710: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
f720: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
f730: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
f740: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f750: 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20  . .    /* Write 
f760: 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63 68  the name of each
f770: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
f780: 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  n the transactio
f790: 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a 20  n into the new. 
f7a0: 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75     ** master jou
f7b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 6e  rnal file. If an
f7c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 74   error occurs at
f7d0: 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f 73   this point clos
f7e0: 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65 6c  e.    ** and del
f7f0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
f800: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c 6c  ournal file. All
f810: 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 20   the individual 
f820: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20 20  journal files.  
f830: 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65 20    ** still have 
f840: 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d 61  'null' as the ma
f850: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69  ster journal poi
f860: 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77 69  nter, so they wi
f870: 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20 62  ll roll.    ** b
f880: 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c  ack independentl
f890: 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  y if a failure o
f8a0: 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  ccurs..    */.  
f8b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
f8c0: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
f8d0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
f8e0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
f8f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
f900: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
f910: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  Bt) ){.        c
f920: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
f930: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
f940: 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70 42  etJournalname(pB
f950: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
f960: 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zFile==0 ){.    
f970: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20        continue; 
f980: 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50 20   /* Ignore TEMP 
f990: 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61 74  and :memory: dat
f9a0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20 20  abases */.      
f9b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
f9c0: 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30 20  rt( zFile[0]!=0 
f9d0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  );.        if( !
f9e0: 6e 65 65 64 53 79 6e 63 20 26 26 20 21 73 71 6c  needSync && !sql
f9f0: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
fa00: 61 62 6c 65 64 28 70 42 74 29 20 29 7b 0a 20 20  abled(pBt) ){.  
fa10: 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e 63          needSync
fa20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
fa30: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
fa40: 69 74 65 33 4f 73 57 72 69 74 65 28 70 4d 61 73  ite3OsWrite(pMas
fa50: 74 65 72 2c 20 7a 46 69 6c 65 2c 20 73 71 6c 69  ter, zFile, sqli
fa60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
fa70: 65 29 2b 31 2c 20 6f 66 66 73 65 74 29 3b 0a 20  e)+1, offset);. 
fa80: 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d         offset +=
fa90: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
faa0: 28 7a 46 69 6c 65 29 2b 31 3b 0a 20 20 20 20 20  (zFile)+1;.     
fab0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
fac0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
fad0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
fae0: 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  Free(pMaster);. 
faf0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
fb00: 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
fb10: 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20  Master, 0);.    
fb20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
fb30: 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
fb40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
fb50: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
fb60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
fb70: 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
fb80: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fb90: 69 6c 65 2e 20 49 66 20 74 68 65 20 49 4f 43 41  ile. If the IOCA
fba0: 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 64 65 76  P_SEQUENTIAL dev
fbb0: 69 63 65 0a 20 20 20 20 2a 2a 20 66 6c 61 67 20  ice.    ** flag 
fbc0: 69 73 20 73 65 74 20 74 68 69 73 20 69 73 20 6e  is set this is n
fbd0: 6f 74 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20  ot required..   
fbe0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 65 64   */.    if( need
fbf0: 53 79 6e 63 20 0a 20 20 20 20 20 26 26 20 30 3d  Sync .     && 0=
fc00: 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  =(sqlite3OsDevic
fc10: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
fc20: 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49 54 45  (pMaster)&SQLITE
fc30: 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
fc40: 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c 49 54  L).     && SQLIT
fc50: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
fc60: 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73 74 65  te3OsSync(pMaste
fc70: 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e  r, SQLITE_SYNC_N
fc80: 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b 0a 20  ORMAL)).    ){. 
fc90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
fca0: 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
fcb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
fcc0: 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d  sDelete(pVfs, zM
fcd0: 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  aster, 0);.     
fce0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
fcf0: 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  b, zMaster);.   
fd00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
fd10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63    }..    /* Sync
fd20: 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69 6c 65   all the db file
fd30: 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
fd40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54  e transaction. T
fd50: 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20 20 20  he same call.   
fd60: 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d 61 73   ** sets the mas
fd70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e  ter journal poin
fd80: 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e 64 69  ter in each indi
fd90: 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 2e 20  vidual journal. 
fda0: 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65 72 72  If.    ** an err
fdb0: 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65 2c 20  or occurs here, 
fdc0: 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
fdd0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
fde0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
fdf0: 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72 72 6f    ** If the erro
fe00: 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
fe10: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
fe20: 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  o.    ** sqlite3
fe30: 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
fe40: 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68 65 72  One(), then ther
fe50: 65 20 69 73 20 61 20 63 68 61 6e 63 65 20 74 68  e is a chance th
fe60: 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 6d 61  at the.    ** ma
fe70: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
fe80: 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68 61 6e  e will be orphan
fe90: 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e 6e 6f  ed. But we canno
fea0: 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20 20 20  t delete it,.   
feb0: 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20   ** in case the 
fec0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
fed0: 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77 72 69  ile name was wri
fee0: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
fef0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
ff00: 65 20 62 65 66 6f 72 65 20 74 68 65 20 66 61 69  e before the fai
ff10: 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e 0a 20  lure occurred.. 
ff20: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
ff30: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
ff40: 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69   && i<db->nDb; i
ff50: 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65  ++){ .      Btre
ff60: 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
ff70: 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
ff80: 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
ff90: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
ffa0: 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
ffb0: 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72 29 3b  e(pBt, zMaster);
ffc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ffd0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
ffe0: 65 46 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a  eFree(pMaster);.
fff0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
10000 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b 0a 20  SQLITE_BUSY );. 
10010 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10020 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
10030 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
10040 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
10050 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10060 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20  ..    /* Delete 
10070 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10080 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 63 6f  al file. This co
10090 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e 73 61  mmits the transa
100a0 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20 20 20  ction. After.   
100b0 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73 20 74   ** doing this t
100c0 68 65 20 64 69 72 65 63 74 6f 72 79 20 69 73 20  he directory is 
100d0 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62 65 66  synced again bef
100e0 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69 64 75  ore any individu
100f0 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  al.    ** transa
10100 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72 65 20  ction files are 
10110 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
10120 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10130 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
10140 4d 61 73 74 65 72 2c 20 6e 65 65 64 53 79 6e 63  Master, needSync
10150 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
10160 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
10170 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
10180 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29   0;.    if( rc )
10190 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
101a0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
101b0 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64   All files and d
101c0 69 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20  irectories have 
101d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
101e0 63 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c  ced, so the foll
101f0 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c  owing.    ** cal
10200 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ls to sqlite3Btr
10210 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  eeCommitPhaseTwo
10220 28 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73  () are only clos
10230 69 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20  ing files and.  
10240 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72    ** deleting or
10250 20 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72   truncating jour
10260 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69  nals. If somethi
10270 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68  ng goes wrong wh
10280 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20  ile.    ** this 
10290 69 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20  is happening we 
102a0 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72  don't really car
102b0 65 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79  e. The integrity
102c0 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74   of the.    ** t
102d0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
102e0 72 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64  ready guaranteed
102f0 2c 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79  , but some stray
10300 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73   'cold' journals
10310 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c  .    ** may be l
10320 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74  ying around. Ret
10330 75 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  urning an error 
10340 63 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20  code won't help 
10350 6d 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a  matters..    */.
10360 20 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75      disable_simu
10370 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
10380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  );.    sqlite3Be
10390 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
103a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
103b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
103c0 20 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70   .      Btree *p
103d0 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
103e0 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
103f0 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  Bt ){.        sq
10400 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10410 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29  PhaseTwo(pBt, 1)
10420 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10430 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
10440 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
10450 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
10460 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
10470 0a 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62  .    sqlite3Vtab
10480 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a  Commit(db);.  }.
10490 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
104a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54   rc;.}../* .** T
104b0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
104c0 6b 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69  ks that the sqli
104d0 74 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20  te3.nVdbeActive 
104e0 63 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a  count variable.*
104f0 2a 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75  * matches the nu
10500 6d 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69  mber of vdbe's i
10510 6e 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74  n the list sqlit
10520 65 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72  e3.pVdbe that ar
10530 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61  e.** currently a
10540 63 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74  ctive. An assert
10550 69 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65  ion fails if the
10560 20 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e   two counts do n
10570 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69  ot match..** Thi
10580 73 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c  s is an internal
10590 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79   self-check only
105a0 20 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20   - it is not an 
105b0 65 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73  essential proces
105c0 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a  sing.** step..**
105d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f  .** This is a no
105e0 2d 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73  -op if NDEBUG is
105f0 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66   defined..*/.#if
10600 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
10610 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74  ic void checkAct
10620 69 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74  iveVdbeCnt(sqlit
10630 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20  e3 *db){.  Vdbe 
10640 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  *p;.  int cnt = 
10650 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20  0;.  int nWrite 
10660 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64  = 0;.  int nRead
10670 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e   = 0;.  p = db->
10680 70 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20  pVdbe;.  while( 
10690 70 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  p ){.    if( sql
106a0 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28  ite3_stmt_busy((
106b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29  sqlite3_stmt*)p)
106c0 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b   ){.      cnt++;
106d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65  .      if( p->re
106e0 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69  adOnly==0 ) nWri
106f0 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  te++;.      if( 
10700 70 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e  p->bIsReader ) n
10710 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Read++;.    }.  
10720 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a    p = p->pNext;.
10730 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e    }.  assert( cn
10740 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  t==db->nVdbeActi
10750 76 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ve );.  assert( 
10760 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62  nWrite==db->nVdb
10770 65 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65  eWrite );.  asse
10780 72 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e  rt( nRead==db->n
10790 56 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65  VdbeRead );.}.#e
107a0 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63  lse.#define chec
107b0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78  kActiveVdbeCnt(x
107c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
107d0 49 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73  If the Vdbe pass
107e0 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
107f0 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20  argument opened 
10800 61 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e  a statement-tran
10810 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73  saction,.** clos
10820 65 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65  e it now. Argume
10830 6e 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65  nt eOp must be e
10840 69 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f  ither SAVEPOINT_
10850 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53  ROLLBACK or.** S
10860 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10870 2e 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50  . If it is SAVEP
10880 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74  OINT_ROLLBACK, t
10890 68 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hen the statemen
108a0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
108b0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
108c0 20 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50   If eOp is SAVEP
108d0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68  OINT_RELEASE, th
108e0 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65  en the .** state
108f0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10900 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a   is committed..*
10910 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72  *.** If an IO er
10920 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53  ror occurs, an S
10930 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20  QLITE_IOERR_XXX 
10940 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
10950 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65  turned. .** Othe
10960 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e  rwise SQLITE_OK.
10970 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
10980 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e  dbeCloseStatemen
10990 74 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65  t(Vdbe *p, int e
109a0 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  Op){.  sqlite3 *
109b0 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62  const db = p->db
109c0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
109d0 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66  ITE_OK;..  /* If
109e0 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69   p->iStatement i
109f0 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a  s greater than z
10a00 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56  ero, then this V
10a10 64 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20  dbe opened a .  
10a20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61  ** statement tra
10a30 6e 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68  nsaction that sh
10a40 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68  ould be closed h
10a50 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78  ere. The only ex
10a60 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  ception.  ** is 
10a70 74 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72  that an IO error
10a80 20 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72   may have occurr
10a90 65 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65  ed, causing an e
10aa0 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63  mergency rollbac
10ab0 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20  k..  ** In this 
10ac0 63 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65  case (db->nState
10ad0 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68  ment==0), and th
10ae0 65 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74  ere is nothing t
10af0 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o do..  */.  if(
10b00 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
10b10 26 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  && p->iStatement
10b20 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
10b30 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61     const int iSa
10b40 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74  vepoint = p->iSt
10b50 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20  atement-1;..    
10b60 61 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56  assert( eOp==SAV
10b70 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
10b80 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  || eOp==SAVEPOIN
10b90 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20  T_RELEASE);.    
10ba0 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61  assert( db->nSta
10bb0 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20  tement>0 );.    
10bc0 61 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74  assert( p->iStat
10bd0 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61  ement==(db->nSta
10be0 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65  tement+db->nSave
10bf0 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66  point) );..    f
10c00 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
10c10 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20  b; i++){ .      
10c20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45  int rc2 = SQLITE
10c30 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65  _OK;.      Btree
10c40 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
10c50 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
10c60 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
10c70 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f   if( eOp==SAVEPO
10c80 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
10c90 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
10ca0 73 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65  sqlite3BtreeSave
10cb0 70 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50  point(pBt, SAVEP
10cc0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69  OINT_ROLLBACK, i
10cd0 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Savepoint);.    
10ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
10cf0 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2==SQLITE_OK
10d00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
10d10 32 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  2 = sqlite3Btree
10d20 53 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53  Savepoint(pBt, S
10d30 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45  AVEPOINT_RELEASE
10d40 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
10d50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10d60 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10d70 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
10d80 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
10d90 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10da0 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65  }.    db->nState
10db0 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69  ment--;.    p->i
10dc0 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a  Statement = 0;..
10dd0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10de0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
10df0 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
10e00 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
10e10 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10e20 65 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28  e3VtabSavepoint(
10e30 64 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  db, SAVEPOINT_RO
10e40 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69  LLBACK, iSavepoi
10e50 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nt);.      }.   
10e60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10e70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10e80 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62  rc = sqlite3Vtab
10e90 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41  Savepoint(db, SA
10ea0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
10eb0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
10ec0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10ed0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
10ee0 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
10ef0 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64   is being rolled
10f00 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74   back, also rest
10f10 6f 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  ore the .    ** 
10f20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73  database handles
10f30 20 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72   deferred constr
10f40 61 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20  aint counter to 
10f50 74 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64  the value it had
10f60 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   when .    ** th
10f70 65 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  e statement tran
10f80 73 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e  saction was open
10f90 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  ed.  */.    if( 
10fa0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
10fb0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
10fc0 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f   db->nDeferredCo
10fd0 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66  ns = p->nStmtDef
10fe0 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Cons;.      db->
10ff0 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
11000 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d   = p->nStmtDefIm
11010 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d  mCons;.    }.  }
11020 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11030 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
11040 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
11050 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
11060 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
11070 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e  database .** han
11080 64 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  dle associated w
11090 69 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65  ith the VM passe
110a0 64 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  d as an argument
110b0 20 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20   is about to be 
110c0 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49  .** committed. I
110d0 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
110e0 74 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64  tanding deferred
110f0 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e   foreign key con
11100 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61  straint.** viola
11110 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51  tions, return SQ
11120 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65  LITE_ERROR. Othe
11130 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b  rwise, SQLITE_OK
11140 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65  ..**.** If there
11150 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
11160 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61   FK violations a
11170 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
11180 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c   returns .** SQL
11190 49 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74  ITE_ERROR, set t
111a0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
111b0 20 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f   VM to SQLITE_CO
111c0 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e  NSTRAINT_FOREIGN
111d0 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65  KEY.** and write
111e0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
111f0 65 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65  e to it. Then re
11200 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
11210 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  R..*/.#ifndef SQ
11220 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47  LITE_OMIT_FOREIG
11230 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65  N_KEY.int sqlite
11240 33 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62  3VdbeCheckFk(Vdb
11250 65 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72  e *p, int deferr
11260 65 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ed){.  sqlite3 *
11270 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
11280 28 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28  ( (deferred && (
11290 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
112a0 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49  s+db->nDeferredI
112b0 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c  mmCons)>0) .   |
112c0 7c 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20  | (!deferred && 
112d0 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74  p->nFkConstraint
112e0 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d  >0) .  ){.    p-
112f0 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e  >rc = SQLITE_CON
11300 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
11310 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72  EY;.    p->error
11320 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72  Action = OE_Abor
11330 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65  t;.    sqlite3Se
11340 74 53 74 72 69 6e 67 28 26 70 2d 3e 7a 45 72 72  tString(&p->zErr
11350 4d 73 67 2c 20 64 62 2c 20 22 46 4f 52 45 49 47  Msg, db, "FOREIG
11360 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e 74  N KEY constraint
11370 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20 72   failed");.    r
11380 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
11390 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
113a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
113b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
113c0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
113d0 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56 44  ed the when a VD
113e0 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c 74  BE tries to halt
113f0 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a 2a  .  If the VDBE.*
11400 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e 67  * has made chang
11410 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75 74  es and is in aut
11420 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68  ocommit mode, th
11430 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a  en commit those.
11440 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66 20  ** changes.  If 
11450 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65  a rollback is ne
11460 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74 68  eded, then do th
11470 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  e rollback..**.*
11480 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11490 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20 74  s the only way t
114a0 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74 65  o move the state
114b0 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a   of a VM from.**
114c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55   SQLITE_MAGIC_RU
114d0 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49  N to SQLITE_MAGI
114e0 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20 68  C_HALT.  It is h
114f0 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61  armless to.** ca
11500 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d 20  ll this on a VM 
11510 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 53  that is in the S
11520 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54  QLITE_MAGIC_HALT
11530 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65   state..**.** Re
11540 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
11550 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  de.  If the comm
11560 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d  it could not com
11570 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f 66  plete because of
11580 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74  .** lock content
11590 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ion, return SQLI
115a0 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51 4c  TE_BUSY.  If SQL
115b0 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
115c0 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e  rned, it.** mean
115d0 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64 20  s the close did 
115e0 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20 6e  not happen and n
115f0 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65 61  eeds to be repea
11600 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
11610 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62 65  te3VdbeHalt(Vdbe
11620 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20   *p){.  int rc; 
11630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11640 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
11650 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69 65  to store transie
11660 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73 20  nt return codes 
11670 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11680 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20   = p->db;..  /* 
11690 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
116a0 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69 63  ntains the logic
116b0 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73   that determines
116c0 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74 20   if a statement 
116d0 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  or.  ** transact
116e0 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ion will be comm
116f0 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
11700 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c 74  back as a result
11710 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78 65   of the.  ** exe
11720 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 76  cution of this v
11730 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20  irtual machine. 
11740 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e  .  **.  ** If an
11750 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
11760 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72 3a  ng errors occur:
11770 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53  .  **.  **     S
11780 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a  QLITE_NOMEM.  **
11790 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
117a0 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54  R.  **     SQLIT
117b0 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20  E_FULL.  **     
117c0 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
117d0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20  .  **.  ** Then 
117e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61 63  the internal cac
117f0 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62 65  he might have be
11800 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e  en left in an in
11810 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20  consistent.  ** 
11820 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64 20  state.  We need 
11830 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20  to rollback the 
11840 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
11850 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65 20  ction, if there 
11860 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20  is.  ** one, or 
11870 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72 61  the complete tra
11880 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
11890 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e  e is no statemen
118a0 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  t transaction.. 
118b0 20 2a 2f 0a 0a 20 20 69 66 28 20 70 2d 3e 64 62   */..  if( p->db
118c0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
118d0 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51  {.    p->rc = SQ
118e0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
118f0 20 20 69 66 28 20 70 2d 3e 61 4f 6e 63 65 46 6c    if( p->aOnceFl
11900 61 67 20 29 20 6d 65 6d 73 65 74 28 70 2d 3e 61  ag ) memset(p->a
11910 4f 6e 63 65 46 6c 61 67 2c 20 30 2c 20 70 2d 3e  OnceFlag, 0, p->
11920 6e 4f 6e 63 65 46 6c 61 67 29 3b 0a 20 20 63 6c  nOnceFlag);.  cl
11930 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 29  oseAllCursors(p)
11940 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61 67 69 63  ;.  if( p->magic
11950 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e  !=VDBE_MAGIC_RUN
11960 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11970 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
11980 63 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43  checkActiveVdbeC
11990 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f  nt(db);..  /* No
119a0 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62   commit or rollb
119b0 61 63 6b 20 6e 65 65 64 65 64 20 69 66 20 74 68  ack needed if th
119c0 65 20 70 72 6f 67 72 61 6d 20 6e 65 76 65 72 20  e program never 
119d0 73 74 61 72 74 65 64 20 6f 72 20 69 66 20 74 68  started or if th
119e0 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65  e.  ** SQL state
119f0 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74 20 72 65  ment does not re
11a00 61 64 20 6f 72 20 77 72 69 74 65 20 61 20 64 61  ad or write a da
11a10 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 2a 2f  tabase file.  */
11a20 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
11a30 26 26 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  && p->bIsReader 
11a40 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72 63 3b 20  ){.    int mrc; 
11a50 20 20 2f 2a 20 50 72 69 6d 61 72 79 20 65 72 72    /* Primary err
11a60 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 70 2d 3e  or code from p->
11a70 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74 20 65 53  rc */.    int eS
11a80 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a  tatementOp = 0;.
11a90 20 20 20 20 69 6e 74 20 69 73 53 70 65 63 69 61      int isSpecia
11aa0 6c 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  lError;         
11ab0 20 20 20 2f 2a 20 53 65 74 20 74 6f 20 74 72 75     /* Set to tru
11ac0 65 20 69 66 20 61 20 27 73 70 65 63 69 61 6c 27  e if a 'special'
11ad0 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f   error */..    /
11ae0 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74 72 65 65  * Lock all btree
11af0 73 20 75 73 65 64 20 62 79 20 74 68 65 20 73 74  s used by the st
11b00 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 73  atement */.    s
11b10 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65 72 28  qlite3VdbeEnter(
11b20 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  p);..    /* Chec
11b30 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  k for one of the
11b40 20 73 70 65 63 69 61 6c 20 65 72 72 6f 72 73 20   special errors 
11b50 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20 70 2d 3e  */.    mrc = p->
11b60 72 63 20 26 20 30 78 66 66 3b 0a 20 20 20 20 69  rc & 0xff;.    i
11b70 73 53 70 65 63 69 61 6c 45 72 72 6f 72 20 3d 20  sSpecialError = 
11b80 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45  mrc==SQLITE_NOME
11b90 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45  M || mrc==SQLITE
11ba0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
11bb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 6d              || m
11bc0 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc==SQLITE_INTER
11bd0 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  RUPT || mrc==SQL
11be0 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 69 66  ITE_FULL;.    if
11bf0 28 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72  ( isSpecialError
11c00 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
11c10 74 68 65 20 71 75 65 72 79 20 77 61 73 20 72 65  the query was re
11c20 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74 68 65 20  ad-only and the 
11c30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51  error code is SQ
11c40 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 2c 20  LITE_INTERRUPT, 
11c50 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c  .      ** no rol
11c60 6c 62 61 63 6b 20 69 73 20 6e 65 63 65 73 73 61  lback is necessa
11c70 72 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ry. Otherwise, a
11c80 74 20 6c 65 61 73 74 20 61 20 73 61 76 65 70 6f  t least a savepo
11c90 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  int .      ** tr
11ca0 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
11cb0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f  e rolled back to
11cc0 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
11cd0 61 62 61 73 65 20 74 6f 20 61 20 0a 20 20 20 20  abase to a .    
11ce0 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65 6e 74 20    ** consistent 
11cf0 73 74 61 74 65 2e 0a 20 20 20 20 20 20 2a 2a 0a  state..      **.
11d00 20 20 20 20 20 20 2a 2a 20 45 76 65 6e 20 69 66        ** Even if
11d10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
11d20 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20 69 74 20  s read-only, it 
11d30 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
11d40 70 65 72 66 6f 72 6d 0a 20 20 20 20 20 20 2a 2a  perform.      **
11d50 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
11d60 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c  transaction roll
11d70 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e 2e 20  back operation. 
11d80 49 66 20 74 68 65 20 65 72 72 6f 72 20 0a 20 20  If the error .  
11d90 20 20 20 20 2a 2a 20 6f 63 63 75 72 72 65 64 20      ** occurred 
11da0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 74 6f  while writing to
11db0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 73 75   the journal, su
11dc0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 64 61 74  b-journal or dat
11dd0 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
11de0 69 6c 65 20 61 73 20 70 61 72 74 20 6f 66 20 61  ile as part of a
11df0 6e 20 65 66 66 6f 72 74 20 74 6f 20 66 72 65 65  n effort to free
11e00 20 75 70 20 63 61 63 68 65 20 73 70 61 63 65 20   up cache space 
11e10 28 73 65 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20  (see function.  
11e20 20 20 20 20 2a 2a 20 70 61 67 65 72 53 74 72 65      ** pagerStre
11e30 73 73 28 29 20 69 6e 20 70 61 67 65 72 2e 63 29  ss() in pager.c)
11e40 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 69  , the rollback i
11e50 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 72 65  s required to re
11e60 73 74 6f 72 65 20 0a 20 20 20 20 20 20 2a 2a 20  store .      ** 
11e70 74 68 65 20 70 61 67 65 72 20 74 6f 20 61 20 63  the pager to a c
11e80 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65 2e  onsistent state.
11e90 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11ea0 69 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79  if( !p->readOnly
11eb0 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49 54 45 5f   || mrc!=SQLITE_
11ec0 49 4e 54 45 52 52 55 50 54 20 29 7b 0a 20 20 20  INTERRUPT ){.   
11ed0 20 20 20 20 20 69 66 28 20 28 6d 72 63 3d 3d 53       if( (mrc==S
11ee0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d  QLITE_NOMEM || m
11ef0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 29  rc==SQLITE_FULL)
11f00 20 26 26 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a   && p->usesStmtJ
11f10 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11f20 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
11f30 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c   = SAVEPOINT_ROL
11f40 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20 20 20 7d  LBACK;.        }
11f50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
11f60 2f 2a 20 57 65 20 61 72 65 20 66 6f 72 63 65 64  /* We are forced
11f70 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 74 68   to roll back th
11f80 65 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  e active transac
11f90 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20 64 6f 69  tion. Before doi
11fa0 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ng.          ** 
11fb0 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79 20 6f 74  so, abort any ot
11fc0 68 65 72 20 73 74 61 74 65 6d 65 6e 74 73 20 74  her statements t
11fd0 68 69 73 20 68 61 6e 64 6c 65 20 63 75 72 72 65  his handle curre
11fe0 6e 74 6c 79 20 68 61 73 20 61 63 74 69 76 65 2e  ntly has active.
11ff0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
12000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
12010 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
12020 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
12030 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  BACK);.         
12040 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
12050 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
12060 20 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43         db->autoC
12070 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  ommit = 1;.     
12080 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
12090 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
120a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
120b0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 69    /* Check for i
120c0 6d 6d 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e  mmediate foreign
120d0 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f 6e 73 2e   key violations.
120e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   */.    if( p->r
120f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12100 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
12110 65 43 68 65 63 6b 46 6b 28 70 2c 20 30 29 3b 0a  eCheckFk(p, 0);.
12120 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
12130 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
12140 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  it flag is set a
12150 6e 64 20 74 68 69 73 20 69 73 20 74 68 65 20 6f  nd this is the o
12160 6e 6c 79 20 61 63 74 69 76 65 20 77 72 69 74 65  nly active write
12170 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c 20 74 68  r .    ** VM, th
12180 65 6e 20 77 65 20 64 6f 20 65 69 74 68 65 72 20  en we do either 
12190 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c  a commit or roll
121a0 62 61 63 6b 20 6f 66 20 74 68 65 20 63 75 72 72  back of the curr
121b0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
121c0 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20   .    **.    ** 
121d0 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c 6f 63 6b  Note: This block
121e0 20 61 6c 73 6f 20 72 75 6e 73 20 69 66 20 6f 6e   also runs if on
121f0 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c  e of the special
12200 20 65 72 72 6f 72 73 20 68 61 6e 64 6c 65 64 20   errors handled 
12210 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 20 68 61  .    ** above ha
12220 73 20 6f 63 63 75 72 72 65 64 2e 20 0a 20 20 20  s occurred. .   
12230 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 73 71 6c   */.    if( !sql
12240 69 74 65 33 56 74 61 62 49 6e 53 79 6e 63 28 64  ite3VtabInSync(d
12250 62 29 20 0a 20 20 20 20 20 26 26 20 64 62 2d 3e  b) .     && db->
12260 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20 20 20 20  autoCommit .    
12270 20 26 26 20 64 62 2d 3e 6e 56 64 62 65 57 72 69   && db->nVdbeWri
12280 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f 6e 6c 79  te==(p->readOnly
12290 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ==0) .    ){.   
122a0 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
122b0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65  LITE_OK || (p->e
122c0 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46  rrorAction==OE_F
122d0 61 69 6c 20 26 26 20 21 69 73 53 70 65 63 69 61  ail && !isSpecia
122e0 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20 20 20 20  lError) ){.     
122f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12300 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 31 29  dbeCheckFk(p, 1)
12310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
12320 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12330 20 20 20 20 20 20 20 20 20 69 66 28 20 4e 45 56           if( NEV
12340 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 29 20  ER(p->readOnly) 
12350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
12360 71 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28  qlite3VdbeLeave(
12370 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  p);.            
12380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
12390 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ROR;.          }
123a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
123b0 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
123c0 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20 20  T_FOREIGNKEY;.  
123d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 20 0a 20 20        }else{ .  
123e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
123f0 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20  uto-commit flag 
12400 69 73 20 74 72 75 65 2c 20 74 68 65 20 76 64 62  is true, the vdb
12410 65 20 70 72 6f 67 72 61 6d 20 77 61 73 20 73 75  e program was su
12420 63 63 65 73 73 66 75 6c 20 0a 20 20 20 20 20 20  ccessful .      
12430 20 20 20 20 2a 2a 20 6f 72 20 68 69 74 20 61 6e      ** or hit an
12440 20 27 4f 52 20 46 41 49 4c 27 20 63 6f 6e 73 74   'OR FAIL' const
12450 72 61 69 6e 74 20 61 6e 64 20 74 68 65 72 65 20  raint and there 
12460 61 72 65 20 6e 6f 20 64 65 66 65 72 72 65 64 20  are no deferred 
12470 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 20 20 20  foreign.        
12480 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73 74 72 61    ** key constra
12490 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20 75 70 20  ints to hold up 
124a0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
124b0 20 54 68 69 73 20 6d 65 61 6e 73 20 61 20 63 6f   This means a co
124c0 6d 6d 69 74 20 0a 20 20 20 20 20 20 20 20 20 20  mmit .          
124d0 2a 2a 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ** is required. 
124e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
124f0 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28 64 62 2c  = vdbeCommit(db,
12500 20 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   p);.        }. 
12510 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
12520 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 2d  QLITE_BUSY && p-
12530 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
12540 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
12550 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  beLeave(p);.    
12560 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12570 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20  ITE_BUSY;.      
12580 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
12590 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
125a0 20 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72         p->rc = r
125b0 63 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  c;.          sql
125c0 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
125d0 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
125e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68            p->nCh
125f0 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  ange = 0;.      
12600 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
12610 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64     db->nDeferred
12620 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
12630 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
12640 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
12650 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67          db->flag
12660 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
12670 65 72 46 4b 73 3b 0a 20 20 20 20 20 20 20 20 20  erFKs;.         
12680 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69 74 49 6e   sqlite3CommitIn
12690 74 65 72 6e 61 6c 43 68 61 6e 67 65 73 28 64 62  ternalChanges(db
126a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
126b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
126c0 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
126d0 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
126e0 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  OK);.        p->
126f0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
12700 20 20 20 7d 0a 20 20 20 20 20 20 64 62 2d 3e 6e     }.      db->n
12710 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20  Statement = 0;. 
12720 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
12730 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a  atementOp==0 ){.
12740 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
12750 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d  =SQLITE_OK || p-
12760 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
12770 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20 20 20 20  _Fail ){.       
12780 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
12790 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
127a0 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  E;.      }else i
127b0 66 28 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f  f( p->errorActio
127c0 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29 7b 0a 20  n==OE_Abort ){. 
127d0 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
127e0 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
127f0 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
12800 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12810 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
12820 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
12830 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
12840 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
12850 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
12860 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
12870 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
12880 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
12890 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
128a0 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
128b0 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 69 73   eStatementOp is
128c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
128d0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
128e0 73 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f  saction needs to
128f0 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f 6d 6d 69  .    ** be commi
12900 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62  tted or rolled b
12910 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65  ack. Call sqlite
12920 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12930 65 6e 74 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20  ent() to.    ** 
12940 64 6f 20 73 6f 2e 20 49 66 20 74 68 69 73 20 6f  do so. If this o
12950 70 65 72 61 74 69 6f 6e 20 72 65 74 75 72 6e 73  peration returns
12960 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20 74   an error, and t
12970 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
12980 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65 72 72 6f  ment.    ** erro
12990 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
129a0 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 43 4f  _OK or SQLITE_CO
129b0 4e 53 54 52 41 49 4e 54 2c 20 74 68 65 6e 20 70  NSTRAINT, then p
129c0 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20 20 20 2a  romote the.    *
129d0 2a 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  * current statem
129e0 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ent error code..
129f0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65      */.    if( e
12a00 53 74 61 74 65 6d 65 6e 74 4f 70 20 29 7b 0a 20  StatementOp ){. 
12a10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12a20 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65 6d  3VdbeCloseStatem
12a30 65 6e 74 28 70 2c 20 65 53 74 61 74 65 6d 65 6e  ent(p, eStatemen
12a40 74 4f 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tOp);.      if( 
12a50 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  rc ){.        if
12a60 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
12a70 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26 30 78 66  OK || (p->rc&0xf
12a80 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f 4e 53 54  f)==SQLITE_CONST
12a90 52 41 49 4e 54 20 29 7b 0a 20 20 20 20 20 20 20  RAINT ){.       
12aa0 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
12ab0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12ac0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45  DbFree(db, p->zE
12ad0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
12ae0 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
12af0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12b00 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
12b10 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
12b20 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
12b30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
12b40 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
12b50 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64  s(db);.        d
12b60 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
12b70 31 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43  1;.        p->nC
12b80 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20  hange = 0;.     
12b90 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20   }.    }.  .    
12ba0 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 61  /* If this was a
12bb0 6e 20 49 4e 53 45 52 54 2c 20 55 50 44 41 54 45  n INSERT, UPDATE
12bc0 20 6f 72 20 44 45 4c 45 54 45 20 61 6e 64 20 6e   or DELETE and n
12bd0 6f 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  o statement tran
12be0 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 68  saction.    ** h
12bf0 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62  as been rolled b
12c00 61 63 6b 2c 20 75 70 64 61 74 65 20 74 68 65 20  ack, update the 
12c10 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
12c20 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ion change-count
12c30 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  er. .    */.    
12c40 69 66 28 20 70 2d 3e 63 68 61 6e 67 65 43 6e 74  if( p->changeCnt
12c50 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  On ){.      if( 
12c60 65 53 74 61 74 65 6d 65 6e 74 4f 70 21 3d 53 41  eStatementOp!=SA
12c70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12c80 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12c90 74 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65  te3VdbeSetChange
12ca0 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61 6e 67 65  s(db, p->nChange
12cb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
12cc0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12cd0 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
12ce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
12cf0 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d      p->nChange =
12d00 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
12d10 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
12d20 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  cks */.    sqlit
12d30 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
12d40 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20 68 61 76    }..  /* We hav
12d50 65 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 68  e successfully h
12d60 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64  alted and closed
12d70 20 74 68 65 20 56 4d 2e 20 20 52 65 63 6f 72 64   the VM.  Record
12d80 20 74 68 69 73 20 66 61 63 74 2e 20 2a 2f 0a 20   this fact. */. 
12d90 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20 29 7b   if( p->pc>=0 ){
12da0 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62 65 41 63  .    db->nVdbeAc
12db0 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tive--;.    if( 
12dc0 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 20 64  !p->readOnly ) d
12dd0 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 2d 2d 3b  b->nVdbeWrite--;
12de0 0a 20 20 20 20 69 66 28 20 70 2d 3e 62 49 73 52  .    if( p->bIsR
12df0 65 61 64 65 72 20 29 20 64 62 2d 3e 6e 56 64 62  eader ) db->nVdb
12e00 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20 61 73 73  eRead--;.    ass
12e10 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 41 63  ert( db->nVdbeAc
12e20 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64 62 65 52  tive>=db->nVdbeR
12e30 65 61 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ead );.    asser
12e40 74 28 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64  t( db->nVdbeRead
12e50 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  >=db->nVdbeWrite
12e60 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12e70 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3e 3d  db->nVdbeWrite>=
12e80 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61  0 );.  }.  p->ma
12e90 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49 43  gic = VDBE_MAGIC
12ea0 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63 6b 41 63  _HALT;.  checkAc
12eb0 74 69 76 65 56 64 62 65 43 6e 74 28 64 62 29 3b  tiveVdbeCnt(db);
12ec0 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61  .  if( p->db->ma
12ed0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
12ee0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
12ef0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
12f00 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f  * If the auto-co
12f10 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
12f20 20 74 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61   to true, then a
12f30 6e 79 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65  ny locks that we
12f40 72 65 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20  re held.  ** by 
12f50 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61  connection db ha
12f60 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65  ve now been rele
12f70 61 73 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74  ased. Call sqlit
12f80 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
12f90 63 6b 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20  cked() .  ** to 
12fa0 69 6e 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69  invoke any requi
12fb0 72 65 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  red unlock-notif
12fc0 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
12fd0 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f  /.  if( db->auto
12fe0 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71  Commit ){.    sq
12ff0 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55  lite3ConnectionU
13000 6e 6c 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d  nlocked(db);.  }
13010 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
13020 6e 56 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c  nVdbeActive>0 ||
13030 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d   db->autoCommit=
13040 3d 30 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65  =0 || db->nState
13050 6d 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74  ment==0 );.  ret
13060 75 72 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49  urn (p->rc==SQLI
13070 54 45 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45  TE_BUSY ? SQLITE
13080 5f 42 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f  _BUSY : SQLITE_O
13090 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61  K);.}.../*.** Ea
130a0 63 68 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68  ch VDBE holds th
130b0 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
130c0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
130d0 74 65 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a  te3_step() call.
130e0 2a 2a 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68  ** in p->rc.  Th
130f0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
13100 74 68 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b  that result back
13110 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a   to SQLITE_OK..*
13120 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
13130 62 65 52 65 73 65 74 53 74 65 70 52 65 73 75 6c  beResetStepResul
13140 74 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  t(Vdbe *p){.  p-
13150 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  >rc = SQLITE_OK;
13160 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74  .}../*.** Copy t
13170 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e  he error code an
13180 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  d error message 
13190 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
131a0 20 56 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20   VDBE passed.** 
131b0 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
131c0 75 6d 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74  ument to its dat
131d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f  abase handle (so
131e0 20 74 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20   that they will 
131f0 62 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  be .** returned 
13200 62 79 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  by calls to sqli
13210 74 65 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e  te3_errcode() an
13220 64 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  d sqlite3_errmsg
13230 28 29 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ())..**.** This 
13240 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
13250 74 20 63 6c 65 61 72 20 74 68 65 20 56 44 42 45  t clear the VDBE
13260 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d   error code or m
13270 65 73 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20  essage, just.** 
13280 63 6f 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74  copies them to t
13290 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
132a0 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
132b0 65 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72  e3VdbeTransferEr
132c0 72 6f 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ror(Vdbe *p){.  
132d0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d  sqlite3 *db = p-
132e0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
132f0 70 2d 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e  p->rc;.  if( p->
13300 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 75  zErrMsg ){.    u
13310 38 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  8 mallocFailed =
13320 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
13330 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  d;.    sqlite3Be
13340 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
13350 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70  );.    if( db->p
13360 45 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72  Err==0 ) db->pEr
13370 72 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  r = sqlite3Value
13380 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
13390 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
133a0 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d  db->pErr, -1, p-
133b0 3e 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45  >zErrMsg, SQLITE
133c0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52  _UTF8, SQLITE_TR
133d0 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71  ANSIENT);.    sq
133e0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
133f0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e  lloc();.    db->
13400 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 6d  mallocFailed = m
13410 61 6c 6c 6f 63 46 61 69 6c 65 64 3b 0a 20 20 20  allocFailed;.   
13420 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72   db->errCode = r
13430 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  c;.  }else{.    
13440 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
13450 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75   rc);.  }.  retu
13460 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  rn rc;.}..#ifdef
13470 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
13480 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66 20 61  QLLOG./*.** If a
13490 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  n SQLITE_CONFIG_
134a0 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73 20 72  SQLLOG hook is r
134b0 65 67 69 73 74 65 72 65 64 20 61 6e 64 20 74 68  egistered and th
134c0 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20 72 75  e VM has been ru
134d0 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20 69 74  n, .** invoke it
134e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
134f0 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
13500 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 69 66  g(Vdbe *v){.  if
13510 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13520 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 26 26  onfig.xSqllog &&
13530 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   v->rc==SQLITE_O
13540 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26 26 20  K && v->zSql && 
13550 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  v->pc>=0 ){.    
13560 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65 64 20  char *zExpanded 
13570 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78 70  = sqlite3VdbeExp
13580 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a 53 71  andSql(v, v->zSq
13590 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  l);.    assert( 
135a0 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79  v->db->init.busy
135b0 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  ==0 );.    if( z
135c0 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20 20 20  Expanded ){.    
135d0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
135e0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 0a 20  onfig.xSqllog(. 
135f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13600 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71  GlobalConfig.pSq
13610 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62 2c 20  llogArg, v->db, 
13620 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20 20 20  zExpanded, 1.   
13630 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69     );.      sqli
13640 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64 62 2c  te3DbFree(v->db,
13650 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20 20 20   zExpanded);.   
13660 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23   }.  }.}.#else.#
13670 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e 76 6f   define vdbeInvo
13680 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65 6e 64  keSqllog(x).#end
13690 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20  if../*.** Clean 
136a0 75 70 20 61 20 56 44 42 45 20 61 66 74 65 72 20  up a VDBE after 
136b0 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20 64 6f  execution but do
136c0 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
136d0 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e 0a 2a  VDBE just yet..*
136e0 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72 72 6f  * Write any erro
136f0 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74 6f 20  r messages into 
13700 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65 74 75  *pzErrMsg.  Retu
13710 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  rn the result co
13720 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20  de..**.** After 
13730 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13740 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20 73 68  run, the VDBE sh
13750 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20 74 6f  ould be ready to
13760 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a 2a 20   be executed.** 
13770 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  again..**.** To 
13780 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f 74 68  look at it anoth
13790 65 72 20 77 61 79 2c 20 74 68 69 73 20 72 6f 75  er way, this rou
137a0 74 69 6e 65 20 72 65 73 65 74 73 20 74 68 65 20  tine resets the 
137b0 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a 2a 20  state of the.** 
137c0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20  virtual machine 
137d0 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49 43 5f  from VDBE_MAGIC_
137e0 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41 47 49  RUN or VDBE_MAGI
137f0 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f 0a 2a  C_HALT back to.*
13800 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  * VDBE_MAGIC_INI
13810 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  T..*/.int sqlite
13820 33 56 64 62 65 52 65 73 65 74 28 56 64 62 65 20  3VdbeReset(Vdbe 
13830 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  *p){.  sqlite3 *
13840 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64 62  db;.  db = p->db
13850 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56  ;..  /* If the V
13860 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20 74 6f  M did not run to
13870 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72 20 69   completion or i
13880 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72 65 64  f it encountered
13890 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72 2c 20   an.  ** error, 
138a0 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 6e 6f  then it might no
138b0 74 20 68 61 76 65 20 62 65 65 6e 20 68 61 6c 74  t have been halt
138c0 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20 53 6f  ed properly.  So
138d0 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20 6e 6f   halt.  ** it no
138e0 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  w..  */.  sqlite
138f0 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a 0a 20  3VdbeHalt(p);.. 
13900 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42 45 20   /* If the VDBE 
13910 68 61 73 20 62 65 20 72 75 6e 20 65 76 65 6e 20  has be run even 
13920 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65 6e 20  partially, then 
13930 74 72 61 6e 73 66 65 72 20 74 68 65 20 65 72 72  transfer the err
13940 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 6e 64  or code.  ** and
13950 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   error message f
13960 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69 6e 74  rom the VDBE int
13970 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  o the main datab
13980 61 73 65 20 73 74 72 75 63 74 75 72 65 2e 20 20  ase structure.  
13990 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68 65 20  But.  ** if the 
139a0 56 44 42 45 20 68 61 73 20 6a 75 73 74 20 62 65  VDBE has just be
139b0 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20 62 75  en set to run bu
139c0 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75 61 6c  t has not actual
139d0 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e 79 0a  ly executed any.
139e0 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e    ** instruction
139f0 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74 68 65  s yet, leave the
13a00 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 65   main database e
13a10 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  rror information
13a20 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2f   unchanged..  */
13a30 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30 20  .  if( p->pc>=0 
13a40 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76 6f 6b  ){.    vdbeInvok
13a50 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20 20 20  eSqllog(p);.    
13a60 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
13a70 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20 20 20  ferError(p);.   
13a80 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
13a90 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  b, p->zErrMsg);.
13aa0 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d      p->zErrMsg =
13ab0 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 72   0;.    if( p->r
13ac0 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70 2d 3e  unOnlyOnce ) p->
13ad0 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20 20 7d  expired = 1;.  }
13ae0 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63 20 26  else if( p->rc &
13af0 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29 7b 0a  & p->expired ){.
13b00 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 69 72      /* The expir
13b10 65 64 20 66 6c 61 67 20 77 61 73 20 73 65 74 20  ed flag was set 
13b20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65 66 6f  on the VDBE befo
13b30 72 65 20 74 68 65 20 66 69 72 73 74 20 63 61 6c  re the first cal
13b40 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69  l.    ** to sqli
13b50 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f 72 20  te3_step(). For 
13b60 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73 69 6e  consistency (sin
13b70 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  ce sqlite3_step(
13b80 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63 61 6c  ) was.    ** cal
13b90 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20 64 61  led), set the da
13ba0 74 61 62 61 73 65 20 65 72 72 6f 72 20 69 6e 20  tabase error in 
13bb0 74 68 69 73 20 63 61 73 65 20 61 73 20 77 65 6c  this case as wel
13bc0 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  l..    */.    sq
13bd0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
13be0 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70 2d 3e  g(db, p->rc, p->
13bf0 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
13c00 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b   0, p->zErrMsg);
13c10 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
13c20 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
13c30 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d  g);.    p->zErrM
13c40 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  sg = 0;.  }..  /
13c50 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20 6d 65  * Reclaim all me
13c60 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74 68 65  mory used by the
13c70 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43 6c 65   VDBE.  */.  Cle
13c80 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a 20 53  anup(p);..  /* S
13c90 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20 69 6e  ave profiling in
13ca0 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74  formation from t
13cb0 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a 20 20  his VDBE run..  
13cc0 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50  */.#ifdef VDBE_P
13cd0 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20 20 46  ROFILE.  {.    F
13ce0 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70 65 6e  ILE *out = fopen
13cf0 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65 2e 6f  ("vdbe_profile.o
13d00 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20 20 69  ut", "a");.    i
13d10 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 20 20  f( out ){.      
13d20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 70 72  int i;.      fpr
13d30 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d 2d 20  intf(out, "---- 
13d40 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ");.      for(i=
13d50 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b  0; i<p->nOp; i++
13d60 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e  ){.        fprin
13d70 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22 2c 20  tf(out, "%02x", 
13d80 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65  p->aOp[i].opcode
13d90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
13da0 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c   fprintf(out, "\
13db0 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n");.      if( p
13dc0 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20 20 20  ->zSql ){.      
13dd0 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d 20 30    char c, pc = 0
13de0 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69 6e 74  ;.        fprint
13df0 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20  f(out, "-- ");. 
13e00 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
13e10 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69 5d 29  (c = p->zSql[i])
13e20 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  !=0; i++){.     
13e30 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27 5c 6e       if( pc=='\n
13e40 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
13e50 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
13e60 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74 29 3b     putc(c, out);
13e70 0a 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20  .          pc = 
13e80 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
13e90 20 20 20 20 20 69 66 28 20 70 63 21 3d 27 5c 6e       if( pc!='\n
13ea0 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75 74 2c  ' ) fprintf(out,
13eb0 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a   "\n");.      }.
13ec0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
13ed0 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20  <p->nOp; i++){. 
13ee0 20 20 20 20 20 20 20 63 68 61 72 20 7a 48 64 72         char zHdr
13ef0 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 73  [100];.        s
13f00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
13f10 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20 7a 48  sizeof(zHdr), zH
13f20 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c 75 20  dr, "%6u %12llu 
13f30 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20 20 20  %8llu ",.       
13f40 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
13f50 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  t,.           p-
13f60 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2c 0a  >aOp[i].cycles,.
13f70 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 4f             p->aO
13f80 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70 2d 3e  p[i].cnt>0 ? p->
13f90 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f 70 2d  aOp[i].cycles/p-
13fa0 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20 30 0a  >aOp[i].cnt : 0.
13fb0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
13fc0 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
13fd0 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20 20 20  "%s", zHdr);.   
13fe0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
13ff0 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69 2c 20  PrintOp(out, i, 
14000 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20 20 20  &p->aOp[i]);.   
14010 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c 6f 73     }.      fclos
14020 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  e(out);.    }.  
14030 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 69 43  }.#endif.  p->iC
14040 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30 3b 0a  urrentTime = 0;.
14050 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42    p->magic = VDB
14060 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20 20  E_MAGIC_INIT;.  
14070 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26 20 64  return p->rc & d
14080 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 20 0a  b->errMask;.}. .
14090 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61  /*.** Clean up a
140a0 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44 42 45  nd delete a VDBE
140b0 20 61 66 74 65 72 20 65 78 65 63 75 74 69 6f 6e   after execution
140c0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69 6e 74  .  Return an int
140d0 65 67 65 72 20 77 68 69 63 68 20 69 73 0a 2a 2a  eger which is.**
140e0 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 64 65   the result code
140f0 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65 72 72  .  Write any err
14100 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78 74 20  or message text 
14110 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 0a  into *pzErrMsg..
14120 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
14130 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62 65 20  beFinalize(Vdbe 
14140 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
14150 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
14160 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
14170 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70 2d 3e  MAGIC_RUN || p->
14180 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
14190 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20 72 63  C_HALT ){.    rc
141a0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
141b0 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73 73 65  set(p);.    asse
141c0 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64 62 2d  rt( (rc & p->db-
141d0 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20 29 3b  >errMask)==rc );
141e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 64  .  }.  sqlite3Vd
141f0 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20 20 72  beDelete(p);.  r
14200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
14210 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
14220 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68 61 6e  iOp is less than
14230 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e 76 6f   zero, then invo
14240 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
14250 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61 75 78  r for.** all aux
14260 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f 69 6e  iliary data poin
14270 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79 20 63  ters currently c
14280 61 63 68 65 64 20 62 79 20 74 68 65 20 56 4d 20  ached by the VM 
14290 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74 68 65  passed as.** the
142a0 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e   first argument.
142b0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 69 4f  .**.** Or, if iO
142c0 70 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  p is greater tha
142d0 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
142e0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64 65 73  ro, then the des
142f0 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20 6f 6e  tructor is.** on
14300 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72 20 74  ly invoked for t
14310 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79 20 64  hose auxiliary d
14320 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63 72 65  ata pointers cre
14330 61 74 65 64 20 62 79 20 74 68 65 20 75 73 65 72  ated by the user
14340 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 6e   .** function in
14350 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f 50 5f  voked by the OP_
14360 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64 65 20  Function opcode 
14370 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  at instruction i
14380 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70 56 64  Op of .** VM pVd
14390 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  be, and only the
143a0 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a  n if:.**.**    *
143b0 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
143c0 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
143d0 65 72 20 69 73 20 74 68 65 20 33 32 6e 64 20 6f  er is the 32nd o
143e0 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74 69 6e  r later (countin
143f0 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20 6c  g.**      from l
14400 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c 20 6f  eft to right), o
14410 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65  r.**.**    * the
14420 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62   corresponding b
14430 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74 20 6d  it in argument m
14440 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28 77 68  ask is clear (wh
14450 65 72 65 20 74 68 65 20 66 69 72 73 74 0a 2a 2a  ere the first.**
14460 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 70        function p
14470 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65 73 70  arameter corresp
14480 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20 65 74  onds to bit 0 et
14490 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  c.)..*/.void sql
144a0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75  ite3VdbeDeleteAu
144b0 78 44 61 74 61 28 56 64 62 65 20 2a 70 56 64 62  xData(Vdbe *pVdb
144c0 65 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  e, int iOp, int 
144d0 6d 61 73 6b 29 7b 0a 20 20 41 75 78 44 61 74 61  mask){.  AuxData
144e0 20 2a 2a 70 70 20 3d 20 26 70 56 64 62 65 2d 3e   **pp = &pVdbe->
144f0 70 41 75 78 44 61 74 61 3b 0a 20 20 77 68 69 6c  pAuxData;.  whil
14500 65 28 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75  e( *pp ){.    Au
14510 78 44 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70  xData *pAux = *p
14520 70 3b 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c  p;.    if( (iOp<
14530 30 29 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78  0).     || (pAux
14540 2d 3e 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70  ->iOp==iOp && (p
14550 41 75 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20  Aux->iArg>31 || 
14560 21 28 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54  !(mask & MASKBIT
14570 33 32 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29  32(pAux->iArg)))
14580 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74  ).    ){.      t
14590 65 73 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69  estcase( pAux->i
145a0 41 72 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20  Arg==31 );.     
145b0 20 69 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65   if( pAux->xDele
145c0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41  te ){.        pA
145d0 75 78 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78  ux->xDelete(pAux
145e0 2d 3e 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d  ->pAux);.      }
145f0 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75  .      *pp = pAu
14600 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20  x->pNext;.      
14610 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 70 56  sqlite3DbFree(pV
14620 64 62 65 2d 3e 64 62 2c 20 70 41 75 78 29 3b 0a  dbe->db, pAux);.
14630 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14640 20 70 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78   pp= &pAux->pNex
14650 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  t;.    }.  }.}..
14660 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d  /*.** Free all m
14670 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
14680 20 77 69 74 68 20 74 68 65 20 56 64 62 65 20 70   with the Vdbe p
14690 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
146a0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a  ond argument,.**
146b0 20 65 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65   except for obje
146c0 63 74 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68  ct itself, which
146d0 20 69 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a   is preserved..*
146e0 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65  *.** The differe
146f0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
14700 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71   function and sq
14710 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28  lite3VdbeDelete(
14720 29 20 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62  ) is that.** Vdb
14730 65 44 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75  eDelete() also u
14740 6e 6c 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20  nlinks the Vdbe 
14750 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
14760 20 56 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20   VMs associated 
14770 77 69 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61  with.** the data
14780 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14790 61 6e 64 20 66 72 65 65 73 20 74 68 65 20 6f 62  and frees the ob
147a0 6a 65 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a  ject itself..*/.
147b0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
147c0 43 6c 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69  ClearObject(sqli
147d0 74 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70  te3 *db, Vdbe *p
147e0 29 7b 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20  ){.  SubProgram 
147f0 2a 70 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20  *pSub, *pNext;. 
14800 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74   int i;.  assert
14810 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d  ( p->db==0 || p-
14820 3e 64 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c  >db==db );.  rel
14830 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e  easeMemArray(p->
14840 61 56 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a  aVar, p->nVar);.
14850 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61    releaseMemArra
14860 79 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70  y(p->aColName, p
14870 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c  ->nResColumn*COL
14880 4e 41 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70  NAME_N);.  for(p
14890 53 75 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b  Sub=p->pProgram;
148a0 20 70 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78   pSub; pSub=pNex
148b0 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
148c0 70 53 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pSub->pNext;.   
148d0 20 76 64 62 65 46 72 65 65 4f 70 41 72 72 61 79   vdbeFreeOpArray
148e0 28 64 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20  (db, pSub->aOp, 
148f0 70 53 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20  pSub->nOp);.    
14900 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14910 2c 20 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66  , pSub);.  }.  f
14920 6f 72 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b  or(i=p->nzVar-1;
14930 20 69 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69   i>=0; i--) sqli
14940 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
14950 3e 61 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 76 64  >azVar[i]);.  vd
14960 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64 62  beFreeOpArray(db
14970 2c 20 70 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70  , p->aOp, p->nOp
14980 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
14990 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61  ee(db, p->aColNa
149a0 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  me);.  sqlite3Db
149b0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c  Free(db, p->zSql
149c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
149d0 65 65 28 64 62 2c 20 70 2d 3e 70 46 72 65 65 29  ee(db, p->pFree)
149e0 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
149f0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
14a00 53 54 41 54 55 53 0a 20 20 66 6f 72 28 69 3d 30  STATUS.  for(i=0
14a10 3b 20 69 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b  ; i<p->nScan; i+
14a20 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  +){.    sqlite3D
14a30 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53 63  bFree(db, p->aSc
14a40 61 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20  an[i].zName);.  
14a50 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
14a60 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b  e(db, p->aScan);
14a70 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
14a80 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
14a90 65 20 56 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20  e VDBE..*/.void 
14aa0 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
14ab0 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  e(Vdbe *p){.  sq
14ac0 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66  lite3 *db;..  if
14ad0 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 29 20  ( NEVER(p==0) ) 
14ae0 72 65 74 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70  return;.  db = p
14af0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
14b00 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
14b10 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
14b20 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  .  sqlite3VdbeCl
14b30 65 61 72 4f 62 6a 65 63 74 28 64 62 2c 20 70 29  earObject(db, p)
14b40 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76  ;.  if( p->pPrev
14b50 20 29 7b 0a 20 20 20 20 70 2d 3e 70 50 72 65 76   ){.    p->pPrev
14b60 2d 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65  ->pNext = p->pNe
14b70 78 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  xt;.  }else{.   
14b80 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70 56 64   assert( db->pVd
14b90 62 65 3d 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d  be==p );.    db-
14ba0 3e 70 56 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78  >pVdbe = p->pNex
14bb0 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  t;.  }.  if( p->
14bc0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pNext ){.    p->
14bd0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
14be0 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70  ->pPrev;.  }.  p
14bf0 2d 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d  ->magic = VDBE_M
14c00 41 47 49 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e  AGIC_DEAD;.  p->
14c10 64 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  db = 0;.  sqlite
14c20 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
14c30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72  }../*.** The cur
14c40 73 6f 72 20 22 70 22 20 68 61 73 20 61 20 70 65  sor "p" has a pe
14c50 6e 64 69 6e 67 20 73 65 65 6b 20 6f 70 65 72 61  nding seek opera
14c60 74 69 6f 6e 20 74 68 61 74 20 68 61 73 20 6e 6f  tion that has no
14c70 74 20 79 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61  t yet been.** ca
14c80 72 72 69 65 64 20 6f 75 74 2e 20 20 53 65 65 6b  rried out.  Seek
14c90 20 74 68 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e   the cursor now.
14ca0 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63    If an error oc
14cb0 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  curs, return.** 
14cc0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
14cd0 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
14ce0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
14cf0 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
14d00 44 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 28 56  DeferredMoveto(V
14d10 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20  dbeCursor *p){. 
14d20 20 69 6e 74 20 72 65 73 2c 20 72 63 3b 0a 23 69   int res, rc;.#i
14d30 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
14d40 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
14d50 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75  lite3_search_cou
14d60 6e 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73  nt;.#endif.  ass
14d70 65 72 74 28 20 70 2d 3e 64 65 66 65 72 72 65 64  ert( p->deferred
14d80 4d 6f 76 65 74 6f 20 29 3b 0a 20 20 61 73 73 65  Moveto );.  asse
14d90 72 74 28 20 70 2d 3e 69 73 54 61 62 6c 65 20 29  rt( p->isTable )
14da0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14db0 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63  BtreeMovetoUnpac
14dc0 6b 65 64 28 70 2d 3e 70 43 75 72 73 6f 72 2c 20  ked(p->pCursor, 
14dd0 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
14de0 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
14df0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
14e00 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30  rc;.  if( res!=0
14e10 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14e20 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23  _CORRUPT_BKPT;.#
14e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
14e40 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72  T.  sqlite3_sear
14e50 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
14e60 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64  if.  p->deferred
14e70 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d  Moveto = 0;.  p-
14e80 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
14e90 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65  ACHE_STALE;.  re
14ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14eb0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69  }../*.** Somethi
14ec0 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72  ng has moved cur
14ed0 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70  sor "p" out of p
14ee0 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65  lace.  Maybe the
14ef0 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70   row it was.** p
14f00 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65  ointed to was de
14f10 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
14f20 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79  nder it.  Or may
14f30 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73  be the btree was
14f40 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20  .** rebalanced. 
14f50 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61   Whatever the ca
14f60 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74  use, try to rest
14f70 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70  ore "p" to the p
14f80 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75  lace it.** is su
14f90 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69  pposed to be poi
14fa0 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  nting.  If the r
14fb0 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  ow was deleted o
14fc0 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
14fd0 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74  e.** cursor, set
14fe0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
14ff0 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72  oint to a NULL r
15000 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
15010 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
15020 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  E handleMovedCur
15030 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a  sor(VdbeCursor *
15040 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66  p){.  int isDiff
15050 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20  erentRow, rc;.  
15060 61 73 73 65 72 74 28 20 70 2d 3e 70 43 75 72 73  assert( p->pCurs
15070 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  or!=0 );.  asser
15080 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  t( sqlite3BtreeC
15090 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d  ursorHasMoved(p-
150a0 3e 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72  >pCursor) );.  r
150b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
150c0 43 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d  CursorRestore(p-
150d0 3e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69 66  >pCursor, &isDif
150e0 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70 2d  ferentRow);.  p-
150f0 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
15100 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69 66  ACHE_STALE;.  if
15110 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  ( isDifferentRow
15120 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d 20   ) p->nullRow = 
15130 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  1;.  return rc;.
15140 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
15150 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
15160 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c 69  e cursor is vali
15170 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65 20  d.  Restore the 
15180 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65 65  cursor.** if nee
15190 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61 6e  d be.  Return an
151a0 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f 6d  y I/O error from
151b0 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70 65   the restore ope
151c0 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  ration..*/.int s
151d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
151e0 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72 73  Restore(VdbeCurs
151f0 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 73 71  or *p){.  if( sq
15200 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
15210 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70 43 75 72  HasMoved(p->pCur
15220 73 6f 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75  sor) ){.    retu
15230 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  rn handleMovedCu
15240 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72  rsor(p);.  }.  r
15250 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15260 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
15270 75 72 65 20 74 68 65 20 63 75 72 73 6f 72 20 70  ure the cursor p
15280 20 69 73 20 72 65 61 64 79 20 74 6f 20 72 65 61   is ready to rea
15290 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 72  d or write the r
152a0 6f 77 20 74 6f 20 77 68 69 63 68 20 69 74 0a 2a  ow to which it.*
152b0 2a 20 77 61 73 20 6c 61 73 74 20 70 6f 73 69 74  * was last posit
152c0 69 6f 6e 65 64 2e 20 20 52 65 74 75 72 6e 20 61  ioned.  Return a
152d0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
152e0 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20  an OOM fault or 
152f0 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65  I/O error.** pre
15300 76 65 6e 74 73 20 75 73 20 66 72 6f 6d 20 70 6f  vents us from po
15310 73 69 74 69 6f 6e 69 6e 67 20 74 68 65 20 63 75  sitioning the cu
15320 72 73 6f 72 20 74 6f 20 69 74 73 20 63 6f 72 72  rsor to its corr
15330 65 63 74 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a  ect position..**
15340 0a 2a 2a 20 49 66 20 61 20 4d 6f 76 65 54 6f 20  .** If a MoveTo 
15350 6f 70 65 72 61 74 69 6f 6e 20 69 73 20 70 65 6e  operation is pen
15360 64 69 6e 67 20 6f 6e 20 74 68 65 20 67 69 76 65  ding on the give
15370 6e 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 64  n cursor, then d
15380 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f  o that.** MoveTo
15390 20 6e 6f 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76   now.  If no mov
153a0 65 20 69 73 20 70 65 6e 64 69 6e 67 2c 20 63 68  e is pending, ch
153b0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
153c0 65 20 72 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a  e row has been.*
153d0 2a 20 64 65 6c 65 74 65 64 20 6f 75 74 20 66 72  * deleted out fr
153e0 6f 6d 20 75 6e 64 65 72 20 74 68 65 20 63 75 72  om under the cur
153f0 73 6f 72 20 61 6e 64 20 69 66 20 69 74 20 68 61  sor and if it ha
15400 73 2c 20 6d 61 72 6b 20 74 68 65 20 72 6f 77 20  s, mark the row 
15410 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77  as.** a NULL row
15420 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
15430 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64 79  ursor is already
15440 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
15450 20 63 6f 72 72 65 63 74 20 72 6f 77 20 61 6e 64   correct row and
15460 20 74 68 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a   that row has.**
15470 20 6e 6f 74 20 62 65 65 6e 20 64 65 6c 65 74 65   not been delete
15480 64 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72  d out from under
15490 20 74 68 65 20 63 75 72 73 6f 72 2c 20 74 68 65   the cursor, the
154a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
154b0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
154c0 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
154d0 73 6f 72 4d 6f 76 65 74 6f 28 56 64 62 65 43 75  sorMoveto(VdbeCu
154e0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  rsor *p){.  if( 
154f0 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74  p->deferredMovet
15500 6f 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  o ){.    return 
15510 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
15520 76 65 74 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 69  veto(p);.  }.  i
15530 66 28 20 70 2d 3e 70 43 75 72 73 6f 72 20 26 26  f( p->pCursor &&
15540 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
15550 73 6f 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 70  sorHasMoved(p->p
15560 43 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 72  Cursor) ){.    r
15570 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76 65  eturn handleMove
15580 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d 0a  dCursor(p);.  }.
15590 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
155a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
155b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
155c0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
155d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
155e0 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
155f0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
15600 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
15610 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
15620 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
15630 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
15640 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
15650 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
15660 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
15670 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
15680 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
15690 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
156a0 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
156b0 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
156c0 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
156d0 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
156e0 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
156f0 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
15700 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
15710 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
15720 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
15730 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
15740 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
15750 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
15760 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
15770 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
15780 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
15790 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
157a0 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
157b0 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
157c0 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
157d0 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
157e0 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
157f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
15800 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
15810 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
15820 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
15830 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
15840 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
15850 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
15860 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
15870 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
15880 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
15890 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
158a0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
158b0 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
158c0 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
158d0 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
158e0 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
158f0 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
15900 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
15910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
15920 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
15930 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
15940 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
15950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15960 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
15970 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15990 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
159a0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
159b0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
159c0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
159d0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
159e0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
15a10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
15a20 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
15a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
15a40 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
15a50 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
15a60 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
15a70 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
15a80 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
15a90 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
15aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ab0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
15ac0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
15ad0 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
15af0 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
15b00 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
15b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
15b30 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
15b40 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
15b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b60 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
15b70 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
15b80 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
15b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ba0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
15bb0 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
15bc0 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
15bd0 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
15be0 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
15bf0 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
15c00 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
15c10 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
15c20 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
15c30 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
15c40 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
15c50 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
15c60 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
15c70 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
15c80 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
15c90 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
15ca0 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
15cb0 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
15cc0 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
15cd0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
15ce0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
15cf0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
15d00 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
15d10 6c 65 5f 66 6f 72 6d 61 74 29 7b 0a 20 20 69 6e  le_format){.  in
15d20 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d 2d 3e  t flags = pMem->
15d30 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e 3b 0a  flags;.  u32 n;.
15d40 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
15d50 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
15d60 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
15d70 20 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29   flags&MEM_Int )
15d80 7b 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  {.    /* Figure 
15d90 6f 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75  out whether to u
15da0 73 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72  se 1, 2, 4, 6 or
15db0 20 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20   8 bytes. */.#  
15dc0 20 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54   define MAX_6BYT
15dd0 45 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30  E ((((i64)0x0000
15de0 38 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20  8000)<<32)-1).  
15df0 20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e    i64 i = pMem->
15e00 75 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a  u.i;.    u64 u;.
15e10 20 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20      if( i<0 ){. 
15e20 20 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20       u = ~i;.   
15e30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20   }else{.      u 
15e40 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = i;.    }.    i
15e50 66 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20  f( u<=127 ){.   
15e60 20 20 20 72 65 74 75 72 6e 20 28 28 69 26 31 29     return ((i&1)
15e70 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f 72 6d  ==i && file_form
15e80 61 74 3e 3d 34 29 20 3f 20 38 2b 28 75 33 32 29  at>=4) ? 8+(u32)
15e90 75 20 3a 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  u : 1;.    }.   
15ea0 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20 29 20   if( u<=32767 ) 
15eb0 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
15ec0 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 20 72  ( u<=8388607 ) r
15ed0 65 74 75 72 6e 20 33 3b 0a 20 20 20 20 69 66 28  eturn 3;.    if(
15ee0 20 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29   u<=2147483647 )
15ef0 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 69   return 4;.    i
15f00 66 28 20 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20  f( u<=MAX_6BYTE 
15f10 29 20 72 65 74 75 72 6e 20 35 3b 0a 20 20 20 20  ) return 5;.    
15f20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20 20  return 6;.  }.  
15f30 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52 65  if( flags&MEM_Re
15f40 61 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  al ){.    return
15f50 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
15f60 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
15f70 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
15f80 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
15f90 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74  lob) );.  assert
15fa0 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a  ( pMem->n>=0 );.
15fb0 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d    n = (u32)pMem-
15fc0 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
15fd0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
15fe0 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
15ff0 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Zero;.  }.  retu
16000 72 6e 20 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b  rn ((n*2) + 12 +
16010 20 28 28 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72   ((flags&MEM_Str
16020 29 21 3d 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  )!=0));.}../*.**
16030 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
16040 74 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 63  th of the data c
16050 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
16060 74 68 65 20 73 75 70 70 6c 69 65 64 20 73 65 72  the supplied ser
16070 69 61 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32  ial-type..*/.u32
16080 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16090 61 6c 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65  alTypeLen(u32 se
160a0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66  rial_type){.  if
160b0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
160c0 32 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  2 ){.    return 
160d0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
160e0 2f 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /2;.  }else{.   
160f0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
16100 20 61 53 69 7a 65 5b 5d 20 3d 20 7b 20 30 2c 20   aSize[] = { 0, 
16110 31 2c 20 32 2c 20 33 2c 20 34 2c 20 36 2c 20 38  1, 2, 3, 4, 6, 8
16120 2c 20 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 8, 0, 0, 0, 0 
16130 7d 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 61 53  };.    return aS
16140 69 7a 65 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  ize[serial_type]
16150 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
16160 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20 61  f we are on an a
16170 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74 68  rchitecture with
16180 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66 6c   mixed-endian fl
16190 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e 74  oating .** point
161a0 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68 65  s (ex: ARM7) the
161b0 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65 72  n swap the lower
161c0 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74 68   4 bytes with th
161d0 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62 79  e .** upper 4 by
161e0 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  tes.  Return the
161f0 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 46   result..**.** F
16200 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65 63  or most architec
16210 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20 61  tures, this is a
16220 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28 6c   no-op..**.** (l
16230 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72 65  ater):  It is re
16240 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68 61  ported to me tha
16250 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64 69  t the mixed-endi
16260 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f 6e  an problem.** on
16270 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73 75   ARM7 is an issu
16280 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74 20  e with GCC, not 
16290 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63 68  with the ARM7 ch
162a0 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a 2a  ip.  It seems.**
162b0 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72 73   that early vers
162c0 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f 72  ions of GCC stor
162d0 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64 73  ed the two words
162e0 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a 20   of a 64-bit.** 
162f0 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72 6f  float in the wro
16300 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20 74  ng order.  And t
16310 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62 65  hat error has be
16320 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a 2a  en propagated.**
16330 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54 68   ever since.  Th
16340 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20 6e  e blame is not n
16350 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68 20  ecessarily with 
16360 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a 20  GCC, though..** 
16370 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20 6a  GCC might have j
16380 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65 20  ust copying the 
16390 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20 70  problem from a p
163a0 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a 2a  rior compiler..*
163b0 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c 64  * I am also told
163c0 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72 73   that newer vers
163d0 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61 74  ions of GCC that
163e0 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65 72   follow a differ
163f0 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20 74  ent.** ABI get t
16400 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72 69  he byte order ri
16410 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65 6c  ght..**.** Devel
16420 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c 69  opers using SQLi
16430 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73 68  te on an ARM7 sh
16440 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e 64  ould compile and
16450 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61 70   run their.** ap
16460 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67 20  plication using 
16470 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d 31  -DSQLITE_DEBUG=1
16480 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e 20   at least once. 
16490 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20 65   With DEBUG.** e
164a0 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73 73  nabled, some ass
164b0 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c 20  erts below will 
164c0 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
164d0 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a 2a  byte order of.**
164e0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
164f0 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65 63  values is correc
16500 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d 30  t..**.** (2007-0
16510 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61 6e  8-30)  Frank van
16520 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69 65   Vugt has studie
16530 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20 63  d this problem c
16540 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68 61  losely.** and ha
16550 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64 69  s send his findi
16560 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69 74  ngs to the SQLit
16570 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20 46  e developers.  F
16580 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20 74  rank.** writes t
16590 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20 6b  hat some Linux k
165a0 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c 6f  ernels offer flo
165b0 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72 64  ating point hard
165c0 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69 6f  ware.** emulatio
165d0 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c 79  n that uses only
165e0 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73 61   32-bit mantissa
165f0 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20 66  s instead of a f
16600 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73 20  ull .** 48-bits 
16610 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  as required by t
16620 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72 64  he IEEE standard
16630 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65 0a  .  (This is the.
16640 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46 41  ** CONFIG_FPE_FA
16650 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20 20  STFPE option.)  
16660 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73 2c  On such systems,
16670 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 0a   floating point.
16680 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e 67  ** byte swapping
16690 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63 6f   becomes very co
166a0 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20 61  mplicated.  To a
166b0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a 2a  void problems,.*
166c0 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20  * the necessary 
166d0 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69 73  byte swapping is
166e0 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73 69   carried out usi
166f0 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  ng a 64-bit inte
16700 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ger.** rather th
16710 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61  an a 64-bit floa
16720 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72 65  t.  Frank assure
16730 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63 6f  s us that the co
16740 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b 73  de here.** works
16750 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20 74   for him.  We, t
16760 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20 68  he developers, h
16770 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69 6e  ave no way to in
16780 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20 76  dependently.** v
16790 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74 20  erify this, but 
167a0 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20 6b  Frank seems to k
167b0 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20 74  now what he is t
167c0 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a 20  alking about.** 
167d0 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d 2e  so we trust him.
167e0 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
167f0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
16800 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74 69  4BIT_FLOAT.stati
16810 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70 28  c u64 floatSwap(
16820 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f 6e  u64 in){.  union
16830 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20 20   {.    u64 r;.  
16840 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d 20    u32 i[2];.  } 
16850 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20 75  u;.  u32 t;..  u
16860 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20 75  .r = in;.  t = u
16870 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d 20  .i[0];.  u.i[0] 
16880 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69 5b  = u.i[1];.  u.i[
16890 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72 6e  1] = t;.  return
168a0 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e 65   u.r;.}.# define
168b0 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e   swapMixedEndian
168c0 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66 6c  Float(X)  X = fl
168d0 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73 65  oatSwap(X).#else
168e0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
168f0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
16900 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16910 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61 6c  Write the serial
16920 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20 66  ized data blob f
16930 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74 6f  or the value sto
16940 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74 6f  red in pMem into
16950 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73 20   .** buf. It is 
16960 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
16970 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c 6f   caller has allo
16980 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e 74  cated sufficient
16990 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75 72   space..** Retur
169a0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
169b0 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a 2a  bytes written..*
169c0 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68 65  *.** nBuf is the
169d0 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63 65   amount of space
169e0 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e 20   left in buf[]. 
169f0 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
16a00 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66 6f  esponsible.** fo
16a10 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e 6f  r allocating eno
16a20 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75 66  ugh space to buf
16a30 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 65  [] to hold the e
16a40 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78 63  ntire field, exc
16a50 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68 65  lusive.** of the
16a60 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20 62   pMem->u.nZero b
16a70 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f 5a  ytes for a MEM_Z
16a80 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  ero value..**.**
16a90 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
16aa0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
16ab0 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e 74  ally written int
16ac0 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e 75  o buf[].  The nu
16ad0 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65 73  mber.** of bytes
16ae0 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69 6c   in the zero-fil
16af0 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63 6c  led tail is incl
16b00 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74 75  uded in the retu
16b10 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a 2a  rn value only.**
16b20 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73 20   if those bytes 
16b30 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20 62  were zeroed in b
16b40 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73 71  uf[]..*/ .u32 sq
16b50 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
16b60 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d 20  ut(u8 *buf, Mem 
16b70 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69 61  *pMem, u32 seria
16b80 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20 6c  l_type){.  u32 l
16b90 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67 65  en;..  /* Intege
16ba0 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20 20  r and Real */.  
16bb0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
16bc0 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =7 && serial_typ
16bd0 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20 76  e>0 ){.    u64 v
16be0 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20 20  ;.    u32 i;.   
16bf0 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
16c00 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==7 ){.      ass
16c10 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d 3d  ert( sizeof(v)==
16c20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e 72  sizeof(pMem->u.r
16c30 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  ) );.      memcp
16c40 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e 72  y(&v, &pMem->u.r
16c50 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20 20  , sizeof(v));.  
16c60 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64      swapMixedEnd
16c70 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20 20  ianFloat(v);.   
16c80 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76 20   }else{.      v 
16c90 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20  = pMem->u.i;.   
16ca0 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20 3d   }.    len = i =
16cb0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
16cc0 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69 61 6c  alTypeLen(serial
16cd0 5f 74 79 70 65 29 3b 0a 20 20 20 20 61 73 73 65  _type);.    asse
16ce0 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64  rt( i>0 );.    d
16cf0 6f 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69  o{.      buf[--i
16d00 5d 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29  ] = (u8)(v&0xFF)
16d10 3b 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b  ;.      v >>= 8;
16d20 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29  .    }while( i )
16d30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
16d40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69  ;.  }..  /* Stri
16d50 6e 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20  ng or blob */.  
16d60 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
16d70 3d 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72  =12 ){.    asser
16d80 74 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70  t( pMem->n + ((p
16d90 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
16da0 5f 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e  _Zero)?pMem->u.n
16db0 5a 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20  Zero:0).        
16dc0 20 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c       == (int)sql
16dd0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
16de0 70 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70  peLen(serial_typ
16df0 65 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20  e) );.    len = 
16e00 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 6d 65 6d  pMem->n;.    mem
16e10 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d 3e 7a  cpy(buf, pMem->z
16e20 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  , len);.    retu
16e30 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
16e40 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73 74 61  * NULL or consta
16e50 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20  nts 0 or 1 */.  
16e60 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20  return 0;.}../* 
16e70 49 6e 70 75 74 20 22 78 22 20 69 73 20 61 20 73  Input "x" is a s
16e80 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73 69 67  equence of unsig
16e90 6e 65 64 20 63 68 61 72 61 63 74 65 72 73 20 74  ned characters t
16ea0 68 61 74 20 72 65 70 72 65 73 65 6e 74 20 61 0a  hat represent a.
16eb0 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  ** big-endian in
16ec0 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e 20 74  teger.  Return t
16ed0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20 6e 61  he equivalent na
16ee0 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a  tive integer.*/.
16ef0 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59 54 45  #define ONE_BYTE
16f00 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69 38 29  _INT(x)    ((i8)
16f10 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[0]).#define 
16f20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78 29 20  TWO_BYTE_INT(x) 
16f30 20 20 20 28 32 35 36 2a 28 69 38 29 28 28 78 29     (256*(i8)((x)
16f40 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23 64 65  [0])|(x)[1]).#de
16f50 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54 45 5f  fine THREE_BYTE_
16f60 49 4e 54 28 78 29 20 20 28 36 35 35 33 36 2a 28  INT(x)  (65536*(
16f70 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29  i8)((x)[0])|((x)
16f80 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d 29 0a  [1]<<8)|(x)[2]).
16f90 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54  #define FOUR_BYT
16fa0 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28 75 33  E_UINT(x)  (((u3
16fb0 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c 28 28  2)(x)[0]<<24)|((
16fc0 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29 5b  x)[1]<<16)|((x)[
16fd0 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a 23  2]<<8)|(x)[3]).#
16fe0 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59 54 45  define FOUR_BYTE
16ff0 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37 32 31  _INT(x) (1677721
17000 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
17010 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78 29  (x)[1]<<16)|((x)
17020 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29 0a  [2]<<8)|(x)[3]).
17030 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61 6c 69  ./*.** Deseriali
17040 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c 6f 62  ze the data blob
17050 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 62   pointed to by b
17060 75 66 20 61 73 20 73 65 72 69 61 6c 20 74 79 70  uf as serial typ
17070 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a 2a 2a  e serial_type.**
17080 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20 72   and store the r
17090 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e 20 20  esult in pMem.  
170a0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
170b0 72 20 6f 66 20 62 79 74 65 73 20 72 65 61 64 2e  r of bytes read.
170c0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
170d0 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
170e0 74 65 64 20 61 73 20 74 77 6f 20 73 65 70 61 72  ted as two separ
170f0 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72  ate routines for
17100 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a   performance..**
17110 20 54 68 65 20 66 65 77 20 63 61 73 65 73 20 74   The few cases t
17120 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f 63 61  hat require loca
17130 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  l variables are 
17140 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74 6f 20  broken out into 
17150 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20 72 6f  a separate.** ro
17160 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20 69 6e  utine so that in
17170 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68 65 20   most cases the 
17180 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f 76 69  overhead of movi
17190 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70 6f 69  ng the stack poi
171a0 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f 69 64  nter.** is avoid
171b0 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 75  ed..*/ .static u
171c0 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  32 SQLITE_NOINLI
171d0 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a 20 20  NE serialGet(.  
171e0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
171f0 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a  har *buf,     /*
17200 20 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72   Buffer to deser
17210 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20  ialize from */. 
17220 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65   u32 serial_type
17230 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17240 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f  * Serial type to
17250 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a   deserialize */.
17260 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20    Mem *pMem     
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74  /* Memory cell t
17290 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e  o write value in
172a0 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34 20 78  to */.){.  u64 x
172b0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
172c0 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20 79 20  T(buf);.  u32 y 
172d0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
172e0 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d 20 28  (buf+4);.  x = (
172f0 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20 69 66  x<<32) + y;.  if
17300 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 36  ( serial_type==6
17310 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
17320 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35 31 2d  NCE-OF: R-29851-
17330 35 32 32 37 32 20 56 61 6c 75 65 20 69 73 20 61  52272 Value is a
17340 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34 2d 62   big-endian 64-b
17350 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63  it.    ** twos-c
17360 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65  omplement intege
17370 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e  r. */.    pMem->
17380 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26 78 3b  u.i = *(i64*)&x;
17390 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
173a0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
173b0 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
173c0 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c 73 65  u.i<0 );.  }else
173d0 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43  {.    /* EVIDENC
173e0 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d 34 39  E-OF: R-57343-49
173f0 31 31 34 20 56 61 6c 75 65 20 69 73 20 61 20 62  114 Value is a b
17400 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45 20 37  ig-endian IEEE 7
17410 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74 0a 20  54-2008 64-bit. 
17420 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70     ** floating p
17430 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a  oint number. */.
17440 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
17450 42 55 47 29 20 26 26 20 21 64 65 66 69 6e 65 64  BUG) && !defined
17460 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
17470 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20  ATING_POINT).   
17480 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
17490 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66 6c 6f  integers and flo
174a0 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
174b0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 0a  es use the same.
174c0 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72 64 65      ** byte orde
174d0 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69 66 20  r.  Or, that if 
174e0 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44  SQLITE_MIXED_END
174f0 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41 54 20  IAN_64BIT_FLOAT 
17500 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 65  is.    ** define
17510 64 20 74 68 61 74 20 36 34 2d 62 69 74 20 66 6c  d that 64-bit fl
17520 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c  oating point val
17530 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65 20 6d  ues really are m
17540 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e 64 69  ixed.    ** endi
17550 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  an..    */.    s
17560 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36 34 20  tatic const u64 
17570 74 31 20 3d 20 28 28 75 36 34 29 30 78 33 66 66  t1 = ((u64)0x3ff
17580 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20 20 20  00000)<<32;.    
17590 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64 6f 75  static const dou
175a0 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a 20 20  ble r1 = 1.0;.  
175b0 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b 0a 20    u64 t2 = t1;. 
175c0 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69     swapMixedEndi
175d0 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20 20 20  anFloat(t2);.   
175e0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
175f0 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32 29 20  r1)==sizeof(t2) 
17600 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c 20 26  && memcmp(&r1, &
17610 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29 29 3d  t2, sizeof(r1))=
17620 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =0 );.#endif.   
17630 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
17640 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f 66 28  x)==8 && sizeof(
17650 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20 29 3b  pMem->u.r)==8 );
17660 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
17670 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a 20 20  dianFloat(x);.  
17680 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d 2d 3e    memcpy(&pMem->
17690 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f 66 28  u.r, &x, sizeof(
176a0 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66  x));.    pMem->f
176b0 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33 49 73  lags = sqlite3Is
176c0 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29 20 3f  NaN(pMem->u.r) ?
176d0 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45 4d 5f   MEM_Null : MEM_
176e0 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Real;.  }.  retu
176f0 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71 6c 69  rn 8;.}.u32 sqli
17700 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
17710 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
17720 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20  ed char *buf,   
17730 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64    /* Buffer to d
17740 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20  eserialize from 
17750 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f  */.  u32 serial_
17760 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20  type,           
17770 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
17780 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  e to deserialize
17790 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20   */.  Mem *pMem 
177a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177b0 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
177c0 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75  ll to write valu
177d0 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 73  e into */.){.  s
177e0 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79  witch( serial_ty
177f0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
17800 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64  0:   /* Reserved
17810 20 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20   for future use 
17820 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31 3a 20  */.    case 11: 
17830 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f    /* Reserved fo
17840 72 20 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a  r future use */.
17850 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20 20 2f      case 0: {  /
17860 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20 20 20  * Null */.      
17870 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17880 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20 56 61  R-24078-09375 Va
17890 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e 20 2a  lue is a NULL. *
178a0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  /.      pMem->fl
178b0 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
178c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
178d0 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b   }.    case 1: {
178e0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
178f0 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35 2d 32  CE-OF: R-44885-2
17900 35 31 39 36 20 56 61 6c 75 65 20 69 73 20 61 6e  5196 Value is an
17910 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f 6d 70   8-bit twos-comp
17920 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20  lement.      ** 
17930 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
17940 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 4f 4e    pMem->u.i = ON
17950 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
17960 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17970 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17990 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
179a0 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
179b0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
179c0 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65   /* 2-byte signe
179d0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
179e0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
179f0 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30 32 36  F: R-49794-35026
17a00 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
17a10 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a 20 20  endian 16-bit.  
17a20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
17a30 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
17a40 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17a50 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f 49 4e  .i = TWO_BYTE_IN
17a60 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d  T(buf);.      pM
17a70 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
17a80 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Int;.      testc
17a90 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
17aa0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
17ab0 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   2;.    }.    ca
17ac0 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74  se 3: { /* 3-byt
17ad0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
17ae0 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
17af0 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37 38 33  DENCE-OF: R-3783
17b00 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20 69 73  9-54301 Value is
17b10 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 32 34   a big-endian 24
17b20 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77  -bit.      ** tw
17b30 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e  os-complement in
17b40 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20  teger. */.      
17b50 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48 52 45  pMem->u.i = THRE
17b60 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29 3b  E_BYTE_INT(buf);
17b70 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
17b80 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
17b90 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d      testcase( pM
17ba0 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20  em->u.i<0 );.   
17bb0 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20 20 20     return 3;.   
17bc0 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b   }.    case 4: {
17bd0 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67 6e 65   /* 4-byte signe
17be0 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  d integer */.   
17bf0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
17c00 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30 37 39  F: R-01849-26079
17c10 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
17c20 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a 20 20  endian 32-bit.  
17c30 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70      ** twos-comp
17c40 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20  lement integer. 
17c50 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75  */.      pMem->u
17c60 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 49  .i = FOUR_BYTE_I
17c70 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70  NT(buf);.      p
17c80 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
17c90 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74  _Int;.      test
17ca0 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c  case( pMem->u.i<
17cb0 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
17cc0 6e 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 4;.    }.    c
17cd0 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
17ce0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
17cf0 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  r */.      /* EV
17d00 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33  IDENCE-OF: R-503
17d10 38 35 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69  85-09674 Value i
17d20 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34  s a big-endian 4
17d30 38 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74  8-bit.      ** t
17d40 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69  wos-complement i
17d50 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20  nteger. */.     
17d60 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55   pMem->u.i = FOU
17d70 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
17d80 32 29 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c  2) + (((i64)1)<<
17d90 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54  32)*TWO_BYTE_INT
17da0 28 62 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65  (buf);.      pMe
17db0 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
17dc0 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
17dd0 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
17de0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
17df0 36 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  6;.    }.    cas
17e00 65 20 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65  e 6:   /* 8-byte
17e10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
17e20 2a 2f 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b  */.    case 7: {
17e30 20 2f 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e   /* IEEE floatin
17e40 67 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20  g point */.     
17e50 20 2f 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f   /* These use lo
17e60 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73  cal variables, s
17e70 6f 20 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73  o do them in a s
17e80 65 70 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a  eparate routine.
17e90 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
17ea0 64 20 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65  d having to move
17eb0 20 74 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74   the frame point
17ec0 65 72 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  er in the common
17ed0 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72   case */.      r
17ee0 65 74 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28  eturn serialGet(
17ef0 62 75 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c  buf,serial_type,
17f00 70 4d 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pMem);.    }.   
17f10 20 63 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49   case 8:    /* I
17f20 6e 74 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20  nteger 0 */.    
17f30 63 61 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e  case 9: {  /* In
17f40 74 65 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20  teger 1 */.     
17f50 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
17f60 20 52 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56   R-12976-22893 V
17f70 61 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65  alue is the inte
17f80 67 65 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20  ger 0. */.      
17f90 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
17fa0 52 2d 31 38 31 34 33 2d 31 32 31 32 31 20 56 61  R-18143-12121 Va
17fb0 6c 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67  lue is the integ
17fc0 65 72 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70  er 1. */.      p
17fd0 4d 65 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61  Mem->u.i = seria
17fe0 6c 5f 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20  l_type-8;.      
17ff0 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
18000 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74  M_Int;.      ret
18010 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
18020 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
18030 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
18040 3a 20 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20  : R-14606-31564 
18050 56 61 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20  Value is a BLOB 
18060 74 68 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32  that is (N-12)/2
18070 20 62 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20   bytes in.      
18080 2a 2a 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20  ** length..     
18090 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   ** EVIDENCE-OF:
180a0 20 52 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56   R-28401-00140 V
180b0 61 6c 75 65 20 69 73 20 61 20 73 74 72 69 6e 67  alue is a string
180c0 20 69 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63   in the text enc
180d0 6f 64 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20  oding and.      
180e0 2a 2a 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65  ** (N-13)/2 byte
180f0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a  s in length. */.
18100 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
18110 73 74 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d  st u16 aFlag[] =
18120 20 7b 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f   { MEM_Blob|MEM_
18130 45 70 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d  Ephem, MEM_Str|M
18140 45 4d 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20  EM_Ephem };.    
18150 20 20 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61    pMem->z = (cha
18160 72 20 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70  r *)buf;.      p
18170 4d 65 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c  Mem->n = (serial
18180 5f 74 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20  _type-12)/2;.   
18190 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
181a0 20 61 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79   aFlag[serial_ty
181b0 70 65 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74  pe&1];.      ret
181c0 75 72 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20  urn pMem->n;.   
181d0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
181e0 30 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  0;.}./*.** This 
181f0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
18200 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66  to allocate suff
18210 69 63 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72  icient space for
18220 20 61 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f   an UnpackedReco
18230 72 64 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  rd.** structure 
18240 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
18250 62 65 20 75 73 65 64 20 77 69 74 68 20 73 71 6c  be used with sql
18260 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
18270 70 61 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65  pack() if.** the
18280 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
18290 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
182a0 4b 65 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72  KeyInfo structur
182b0 65 20 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a  e pKeyInfo..**.*
182c0 2a 20 54 68 65 20 73 70 61 63 65 20 69 73 20 65  * The space is e
182d0 69 74 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20  ither allocated 
182e0 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d  using sqlite3DbM
182f0 61 6c 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72  allocRaw() or fr
18300 6f 6d 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65  om within.** the
18310 20 75 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65   unaligned buffe
18320 72 20 70 61 73 73 65 64 20 76 69 61 20 74 68 65  r passed via the
18330 20 73 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72   second and thir
18340 64 20 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65  d arguments (pre
18350 73 75 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b  sumably.** stack
18360 20 73 70 61 63 65 29 2e 20 49 66 20 74 68 65 20   space). If the 
18370 66 6f 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70  former, then *pp
18380 46 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 61  Free is set to a
18390 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68   pointer that sh
183a0 6f 75 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74  ould.** be event
183b0 75 61 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74  ually freed by t
183c0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
183d0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e  sqlite3DbFree().
183e0 20 4f 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20   Or, if the .** 
183f0 61 6c 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73  allocation comes
18400 20 66 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65   from the pSpace
18410 2f 73 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c  /szSpace buffer,
18420 20 2a 70 70 46 72 65 65 20 69 73 20 73 65 74 20   *ppFree is set 
18430 74 6f 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72  to NULL.** befor
18440 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
18450 2a 2a 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72  ** If an OOM err
18460 6f 72 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20  or occurs, NULL 
18470 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
18480 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
18490 73 71 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63  sqlite3VdbeAlloc
184a0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a  UnpackedRecord(.
184b0 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
184c0 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
184d0 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e    /* Description
184e0 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a   of the record *
184f0 2f 0a 20 20 63 68 61 72 20 2a 70 53 70 61 63 65  /.  char *pSpace
18500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18510 20 20 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64      /* Unaligned
18520 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
18530 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63   */.  int szSpac
18540 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
18550 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
18560 20 70 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74   pSpace[] in byt
18570 65 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  es */.  char **p
18580 70 46 72 65 65 20 20 20 20 20 20 20 20 20 20 20  pFree           
18590 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
185a0 43 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72  Caller should fr
185b0 65 65 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  ee this pointer 
185c0 2a 2f 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64  */.){.  Unpacked
185d0 52 65 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20  Record *p;      
185e0 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63          /* Unpac
185f0 6b 65 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65  ked record to re
18600 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  turn */.  int nO
18610 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
18620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63            /* Inc
18630 72 65 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79  rement pSpace by
18640 20 6e 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69   nOff to align i
18650 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  t */.  int nByte
18660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
18670 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
18680 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
18690 65 64 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20  ed for *p */..  
186a0 2f 2a 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68  /* We want to sh
186b0 69 66 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ift the pointer 
186c0 70 53 70 61 63 65 20 75 70 20 73 75 63 68 20 74  pSpace up such t
186d0 68 61 74 20 69 74 20 69 73 20 38 2d 62 79 74 65  hat it is 8-byte
186e0 20 61 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54   aligned..  ** T
186f0 68 75 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  hus, we need to 
18700 63 61 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75  calculate a valu
18710 65 2c 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e  e, nOff, between
18720 20 30 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69   0 and 7, to shi
18730 66 74 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20  ft .  ** it by. 
18740 20 49 66 20 70 53 70 61 63 65 20 69 73 20 61 6c   If pSpace is al
18750 72 65 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69  ready 8-byte ali
18760 67 6e 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c  gned, nOff shoul
18770 64 20 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a  d be zero..  */.
18780 20 20 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53    nOff = (8 - (S
18790 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
187a0 28 70 53 70 61 63 65 29 20 26 20 37 29 29 20 26  (pSpace) & 7)) &
187b0 20 37 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f   7;.  nByte = RO
187c0 55 4e 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61  UND8(sizeof(Unpa
187d0 63 6b 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73  ckedRecord)) + s
187e0 69 7a 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79  izeof(Mem)*(pKey
187f0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b  Info->nField+1);
18800 0a 20 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53  .  if( nByte>szS
18810 70 61 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20  pace+nOff ){.   
18820 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65   p = (UnpackedRe
18830 63 6f 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62  cord *)sqlite3Db
18840 4d 61 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e  MallocRaw(pKeyIn
18850 66 6f 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a  fo->db, nByte);.
18860 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63      *ppFree = (c
18870 68 61 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28  har *)p;.    if(
18880 20 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a   !p ) return 0;.
18890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d    }else{.    p =
188a0 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64   (UnpackedRecord
188b0 2a 29 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b  *)&pSpace[nOff];
188c0 0a 20 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30  .    *ppFree = 0
188d0 3b 0a 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d  ;.  }..  p->aMem
188e0 20 3d 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72   = (Mem*)&((char
188f0 2a 29 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65  *)p)[ROUND8(size
18900 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
18910 64 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  d))];.  assert( 
18920 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f  pKeyInfo->aSortO
18930 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e  rder!=0 );.  p->
18940 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
18950 6e 66 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64  nfo;.  p->nField
18960 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   = pKeyInfo->nFi
18970 65 6c 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72  eld + 1;.  retur
18980 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n p;.}../*.** Gi
18990 76 65 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74  ven the nKey-byt
189a0 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20  e encoding of a 
189b0 72 65 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d  record in pKey[]
189c0 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a  , populate the .
189d0 2a 2a 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  ** UnpackedRecor
189e0 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 64 69  d structure indi
189f0 63 61 74 65 64 20 62 79 20 74 68 65 20 66 6f 75  cated by the fou
18a00 72 74 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74  rth argument wit
18a10 68 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  h the.** content
18a20 73 20 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64  s of the decoded
18a30 20 72 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69   record..*/ .voi
18a40 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  d sqlite3VdbeRec
18a50 6f 72 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79  ordUnpack(.  Key
18a60 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
18a70 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
18a80 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 72 65 63  on about the rec
18a90 6f 72 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20  ord format */.  
18aa0 69 6e 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20  int nKey,       
18ab0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
18ac0 66 20 74 68 65 20 62 69 6e 61 72 79 20 72 65 63  f the binary rec
18ad0 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76  ord */.  const v
18ae0 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20  oid *pKey,      
18af0 2f 2a 20 54 68 65 20 62 69 6e 61 72 79 20 72 65  /* The binary re
18b00 63 6f 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  cord */.  Unpack
18b10 65 64 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20  edRecord *p     
18b20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69   /* Populate thi
18b30 73 20 73 74 72 75 63 74 75 72 65 20 62 65 66 6f  s structure befo
18b40 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
18b50 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  .){.  const unsi
18b60 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
18b70 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
18b80 64 20 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20  d char *)pKey;. 
18b90 20 69 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69   int d; .  u32 i
18ba0 64 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dx;             
18bb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
18bc0 66 73 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74  fset in aKey[] t
18bd0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
18be0 20 75 31 36 20 75 3b 20 20 20 20 20 20 20 20 20   u16 u;         
18bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c00 20 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f   /* Unsigned loo
18c10 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75  p counter */.  u
18c20 33 32 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20  32 szHdr;.  Mem 
18c30 2a 70 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b  *pMem = p->aMem;
18c40 0a 0a 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72  ..  p->default_r
18c50 63 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  c = 0;.  assert(
18c60 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47   EIGHT_BYTE_ALIG
18c70 4e 4d 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20  NMENT(pMem) );. 
18c80 20 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74   idx = getVarint
18c90 33 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b  32(aKey, szHdr);
18ca0 0a 20 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20  .  d = szHdr;.  
18cb0 75 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20  u = 0;.  while( 
18cc0 69 64 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d  idx<szHdr && d<=
18cd0 6e 4b 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20  nKey ){.    u32 
18ce0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
18cf0 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69    idx += getVari
18d00 6e 74 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c  nt32(&aKey[idx],
18d10 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20   serial_type);. 
18d20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70     pMem->enc = p
18d30 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20  KeyInfo->enc;.  
18d40 20 20 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65    pMem->db = pKe
18d50 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f  yInfo->db;.    /
18d60 2a 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20  * pMem->flags = 
18d70 30 3b 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62  0; // sqlite3Vdb
18d80 65 53 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c  eSerialGet() wil
18d90 6c 20 73 65 74 20 74 68 69 73 20 66 6f 72 20 75  l set this for u
18da0 73 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73  s */.    pMem->s
18db0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  zMalloc = 0;.   
18dc0 20 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62   d += sqlite3Vdb
18dd0 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
18de0 5b 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  [d], serial_type
18df0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65  , pMem);.    pMe
18e00 6d 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b  m++;.    if( (++
18e10 75 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20  u)>=p->nField ) 
18e20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73  break;.  }.  ass
18e30 65 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f  ert( u<=pKeyInfo
18e40 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a  ->nField + 1 );.
18e50 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b    p->nField = u;
18e60 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  .}..#if SQLITE_D
18e70 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EBUG./*.** This 
18e80 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
18e90 73 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74  s two index or t
18ea0 61 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73  able record keys
18eb0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
18ec0 0a 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74  .** as the sqlit
18ed0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
18ee0 61 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55  are() routine. U
18ef0 6e 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64  nlike VdbeRecord
18f00 43 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68  Compare(),.** th
18f10 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65  is function dese
18f20 72 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d  rializes and com
18f30 70 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69  pares values usi
18f40 6e 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  ng the.** sqlite
18f50 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29  3VdbeSerialGet()
18f60 20 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43   and sqlite3MemC
18f70 6f 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f  ompare() functio
18f80 6e 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a  ns. It is used.*
18f90 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74  * in assert() st
18fa0 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
18fb0 72 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69  re that the opti
18fc0 6d 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a  mized code in.**
18fd0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
18fe0 72 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75  rdCompare() retu
18ff0 72 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68  rns results with
19000 20 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69   these two primi
19010 74 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  tives..**.** Ret
19020 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
19030 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
19040 69 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  ison is equivale
19050 6e 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73  nt to desiredRes
19060 75 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66  ult..** Return f
19070 61 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73  alse if there is
19080 20 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e   a disagreement.
19090 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
190a0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
190b0 44 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65  Debug(.  int nKe
190c0 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
190d0 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
190e0 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e  ey */.  const Un
190f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
19100 4b 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b  Key2, /* Right k
19110 65 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69  ey */.  int desi
19120 72 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20  redResult       
19130 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74        /* Correct
19140 20 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20   answer */.){.  
19150 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
19160 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74     /* Offset int
19170 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74  o aKey[] of next
19180 20 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f   data element */
19190 0a 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20  .  u32 idx1;    
191a0 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
191b0 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e  into aKey[] of n
191c0 65 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65  ext header eleme
191d0 6e 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64  nt */.  u32 szHd
191e0 72 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  r1;        /* Nu
191f0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
19200 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
19210 20 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   i = 0;.  int rc
19220 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e   = 0;.  const un
19230 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65  signed char *aKe
19240 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  y1 = (const unsi
19250 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79  gned char *)pKey
19260 31 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b  1;.  KeyInfo *pK
19270 65 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65  eyInfo;.  Mem me
19280 6d 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20  m1;..  pKeyInfo 
19290 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  = pPKey2->pKeyIn
192a0 66 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e  fo;.  if( pKeyIn
192b0 66 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75  fo->db==0 ) retu
192c0 72 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63  rn 1;.  mem1.enc
192d0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63   = pKeyInfo->enc
192e0 3b 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b  ;.  mem1.db = pK
192f0 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a  eyInfo->db;.  /*
19300 20 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b   mem1.flags = 0;
19310 20 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69    // Will be ini
19320 74 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69  tialized by sqli
19330 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
19340 28 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59  () */.  VVA_ONLY
19350 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20  ( mem1.szMalloc 
19360 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e  = 0; ) /* Only n
19370 65 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28  eeded by assert(
19380 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a  ) statements */.
19390 0a 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20  .  /* Compilers 
193a0 6d 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61  may complain tha
193b0 74 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f  t mem1.u.i is po
193c0 74 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74  tentially uninit
193d0 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65  ialized..  ** We
193e0 20 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a   could initializ
193f0 65 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68  e it, as shown h
19400 65 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20  ere, to silence 
19410 74 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73  those complaints
19420 2e 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61  ..  ** But in fa
19430 63 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c  ct, mem1.u.i wil
19440 6c 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79  l never actually
19450 20 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69   be used uniniti
19460 61 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e  alized, and doin
19470 67 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65  g .  ** the unne
19480 63 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69  cessary initiali
19490 7a 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61  zation has a mea
194a0 73 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65  surable negative
194b0 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a   performance.  *
194c0 2a 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20  * impact, since 
194d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
194e0 61 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e  a very high runn
194f0 65 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20  er.  And so, we 
19500 63 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69  choose.  ** to i
19510 67 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c  gnore the compil
19520 65 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20  er warnings and 
19530 6c 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61  leave this varia
19540 62 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  ble uninitialize
19550 64 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65  d..  */.  /*  me
19560 6d 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20  m1.u.i = 0;  // 
19570 6e 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65  not needed, here
19580 20 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70   to silence comp
19590 69 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a  iler warning */.
195a0 20 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56    .  idx1 = getV
195b0 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
195c0 7a 48 64 72 31 29 3b 0a 20 20 64 31 20 3d 20 73  zHdr1);.  d1 = s
195d0 7a 48 64 72 31 3b 0a 20 20 61 73 73 65 72 74 28  zHdr1;.  assert(
195e0 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
195f0 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
19600 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e 6e 46 69  eld>=pPKey2->nFi
19610 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  eld || CORRUPT_D
19620 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
19630 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72  KeyInfo->aSortOr
19640 64 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  der!=0 );.  asse
19650 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
19660 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
19670 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
19680 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
19690 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
196a0 73 65 72 69 61 6c 5f 74 79 70 65 31 3b 0a 0a 20  serial_type1;.. 
196b0 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 73     /* Read the s
196c0 65 72 69 61 6c 20 74 79 70 65 73 20 66 6f 72 20  erial types for 
196d0 74 68 65 20 6e 65 78 74 20 65 6c 65 6d 65 6e 74  the next element
196e0 20 69 6e 20 65 61 63 68 20 6b 65 79 2e 20 2a 2f   in each key. */
196f0 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 67 65 74  .    idx1 += get
19700 56 61 72 69 6e 74 33 32 28 20 61 4b 65 79 31 2b  Varint32( aKey1+
19710 69 64 78 31 2c 20 73 65 72 69 61 6c 5f 74 79 70  idx1, serial_typ
19720 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 65  e1 );..    /* Ve
19730 72 69 66 79 20 74 68 61 74 20 74 68 65 72 65 20  rify that there 
19740 69 73 20 65 6e 6f 75 67 68 20 6b 65 79 20 73 70  is enough key sp
19750 61 63 65 20 72 65 6d 61 69 6e 69 6e 67 20 74 6f  ace remaining to
19760 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a 20 61 20   avoid.    ** a 
19770 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 2e  buffer overread.
19780 20 20 54 68 65 20 22 64 31 2b 73 65 72 69 61 6c    The "d1+serial
19790 5f 74 79 70 65 31 2b 32 22 20 73 75 62 65 78 70  _type1+2" subexp
197a0 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a 20 20 20  ression will.   
197b0 20 2a 2a 20 61 6c 77 61 79 73 20 62 65 20 67 72   ** always be gr
197c0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
197d0 75 61 6c 20 74 6f 20 74 68 65 20 61 6d 6f 75 6e  ual to the amoun
197e0 74 20 6f 66 20 72 65 71 75 69 72 65 64 20 6b 65  t of required ke
197f0 79 20 73 70 61 63 65 2e 0a 20 20 20 20 2a 2a 20  y space..    ** 
19800 55 73 65 20 74 68 61 74 20 61 70 70 72 6f 78 69  Use that approxi
19810 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f 69 64 20  mation to avoid 
19820 74 68 65 20 6d 6f 72 65 20 65 78 70 65 6e 73 69  the more expensi
19830 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ve call to.    *
19840 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
19850 69 61 6c 54 79 70 65 4c 65 6e 28 29 20 69 6e 20  ialTypeLen() in 
19860 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e  the common case.
19870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
19880 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65 31 2b  d1+serial_type1+
19890 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a 20 20 20  2>(u32)nKey1.   
198a0 20 20 26 26 20 64 31 2b 73 71 6c 69 74 65 33 56    && d1+sqlite3V
198b0 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e  dbeSerialTypeLen
198c0 28 73 65 72 69 61 6c 5f 74 79 70 65 31 29 3e 28  (serial_type1)>(
198d0 75 33 32 29 6e 4b 65 79 31 20 0a 20 20 20 20 29  u32)nKey1 .    )
198e0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
198f0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 45 78 74     }..    /* Ext
19900 72 61 63 74 20 74 68 65 20 76 61 6c 75 65 73 20  ract the values 
19910 74 6f 20 62 65 20 63 6f 6d 70 61 72 65 64 2e 0a  to be compared..
19920 20 20 20 20 2a 2f 0a 20 20 20 20 64 31 20 2b 3d      */.    d1 +=
19930 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
19940 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
19950 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 31 2c 20  , serial_type1, 
19960 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20  &mem1);..    /* 
19970 44 6f 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  Do the compariso
19980 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  n.    */.    rc 
19990 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70  = sqlite3MemComp
199a0 61 72 65 28 26 6d 65 6d 31 2c 20 26 70 50 4b 65  are(&mem1, &pPKe
199b0 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20 70 4b 65  y2->aMem[i], pKe
199c0 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 29  yInfo->aColl[i])
199d0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 30 20  ;.    if( rc!=0 
199e0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
199f0 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d   mem1.szMalloc==
19a00 30 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d  0 );  /* See com
19a10 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ment below */.  
19a20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f      if( pKeyInfo
19a30 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69 5d 20  ->aSortOrder[i] 
19a40 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
19a50 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65 72 74 20  -rc;  /* Invert 
19a60 74 68 65 20 72 65 73 75 6c 74 20 66 6f 72 20 44  the result for D
19a70 45 53 43 20 73 6f 72 74 20 6f 72 64 65 72 2e 20  ESC sort order. 
19a80 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  */.      }.     
19a90 20 67 6f 74 6f 20 64 65 62 75 67 43 6f 6d 70 61   goto debugCompa
19aa0 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a 20 20 20  reEnd;.    }.   
19ab0 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20   i++;.  }while( 
19ac0 69 64 78 31 3c 73 7a 48 64 72 31 20 26 26 20 69  idx1<szHdr1 && i
19ad0 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20  <pPKey2->nField 
19ae0 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
19af0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
19b00 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
19b10 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
19b20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
19b30 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
19b40 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
19b50 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
19b60 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
19b70 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
19b80 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
19b90 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
19ba0 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20 20 2a 2f  ase(&mem1)..  */
19bb0 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
19bc0 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
19bd0 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
19be0 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
19bf0 66 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f  f the keys ran o
19c00 75 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64  ut of fields and
19c10 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69  .  ** all the fi
19c20 65 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20  elds up to that 
19c30 70 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c  point were equal
19c40 2e 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66  . Return the def
19c50 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c  ault_rc.  ** val
19c60 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  ue.  */.  rc = p
19c70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72  PKey2->default_r
19c80 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70 61 72 65  c;..debugCompare
19c90 45 6e 64 3a 0a 20 20 69 66 28 20 64 65 73 69 72  End:.  if( desir
19ca0 65 64 52 65 73 75 6c 74 3d 3d 30 20 26 26 20 72  edResult==0 && r
19cb0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  c==0 ) return 1;
19cc0 0a 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65  .  if( desiredRe
19cd0 73 75 6c 74 3c 30 20 26 26 20 72 63 3c 30 20 29  sult<0 && rc<0 )
19ce0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
19cf0 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3e 30   desiredResult>0
19d00 20 26 26 20 72 63 3e 30 20 29 20 72 65 74 75 72   && rc>0 ) retur
19d10 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f 52 52 55  n 1;.  if( CORRU
19d20 50 54 5f 44 42 20 29 20 72 65 74 75 72 6e 20 31  PT_DB ) return 1
19d30 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66 6f  ;.  if( pKeyInfo
19d40 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
19d50 65 64 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  ed ) return 1;. 
19d60 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
19d70 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
19d80 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e  DEBUG./*.** Coun
19d90 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
19da0 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61 2e 20 63  fields (a.k.a. c
19db0 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68 65 20 72  olumns) in the r
19dc0 65 63 6f 72 64 20 67 69 76 65 6e 20 62 79 0a 2a  ecord given by.*
19dd0 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20 20 54 68  * pKey,nKey.  Th
19de0 65 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  e verify that th
19df0 69 73 20 63 6f 75 6e 74 20 69 73 20 6c 65 73 73  is count is less
19e00 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
19e10 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 67  o the.** limit g
19e20 69 76 65 6e 20 62 79 20 70 4b 65 79 49 6e 66 6f  iven by pKeyInfo
19e30 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b 65 79 49  ->nField + pKeyI
19e40 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e 0a 2a 2a  nfo->nXField..**
19e50 0a 2a 2a 20 49 66 20 74 68 69 73 20 63 6f 6e 73  .** If this cons
19e60 74 72 61 69 6e 74 20 69 73 20 6e 6f 74 20 73 61  traint is not sa
19e70 74 69 73 66 69 65 64 2c 20 69 74 20 6d 65 61 6e  tisfied, it mean
19e80 73 20 74 68 61 74 20 74 68 65 20 68 69 67 68 2d  s that the high-
19e90 73 70 65 65 64 0a 2a 2a 20 76 64 62 65 52 65 63  speed.** vdbeRec
19ea0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 20  ordCompareInt() 
19eb0 61 6e 64 20 76 64 62 65 52 65 63 6f 72 64 43 6f  and vdbeRecordCo
19ec0 6d 70 61 72 65 53 74 72 69 6e 67 28 29 20 72 6f  mpareString() ro
19ed0 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a 2a 20 6e  utines will.** n
19ee0 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
19ef0 79 2e 20 20 49 66 20 74 68 69 73 20 61 73 73 65  y.  If this asse
19f00 72 74 28 29 20 65 76 65 72 20 66 69 72 65 73 2c  rt() ever fires,
19f10 20 69 74 20 70 72 6f 62 61 62 6c 79 20 6d 65 61   it probably mea
19f20 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 4b  ns.** that the K
19f30 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 6f 72  eyInfo.nField or
19f40 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69 65 6c 64   KeyInfo.nXField
19f50 20 76 61 6c 75 65 73 20 77 65 72 65 20 63 6f 6d   values were com
19f60 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f 72 72 65  puted.** incorre
19f70 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ctly..*/.static 
19f80 76 6f 69 64 20 76 64 62 65 41 73 73 65 72 74 46  void vdbeAssertF
19f90 69 65 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c  ieldCountWithinL
19fa0 69 6d 69 74 73 28 0a 20 20 69 6e 74 20 6e 4b 65  imits(.  int nKe
19fb0 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  y, const void *p
19fc0 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65 20 72 65  Key,   /* The re
19fd0 63 6f 72 64 20 74 6f 20 76 65 72 69 66 79 20 2a  cord to verify *
19fe0 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65 79 49 6e  / .  const KeyIn
19ff0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 20 20 20  fo *pKeyInfo    
1a000 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65 20 73 69     /* Compare si
1a010 7a 65 20 77 69 74 68 20 74 68 69 73 20 4b 65 79  ze with this Key
1a020 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  Info */.){.  int
1a030 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a 20 20 75   nField = 0;.  u
1a040 33 32 20 73 7a 48 64 72 3b 0a 20 20 75 33 32 20  32 szHdr;.  u32 
1a050 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f 74 55 73  idx;.  u32 notUs
1a060 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  ed;.  const unsi
1a070 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20  gned char *aKey 
1a080 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  = (const unsigne
1a090 64 20 63 68 61 72 2a 29 70 4b 65 79 3b 0a 0a 20  d char*)pKey;.. 
1a0a0 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42 20   if( CORRUPT_DB 
1a0b0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 64 78 20  ) return;.  idx 
1a0c0 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b  = getVarint32(aK
1a0d0 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20 20 61 73  ey, szHdr);.  as
1a0e0 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30 20 29 3b  sert( nKey>=0 );
1a0f0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 48 64 72  .  assert( szHdr
1a100 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29 3b 0a 20  <=(u32)nKey );. 
1a110 20 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64   while( idx<szHd
1a120 72 20 29 7b 0a 20 20 20 20 69 64 78 20 2b 3d 20  r ){.    idx += 
1a130 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1a140 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64 29 3b 0a  +idx, notUsed);.
1a150 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b 0a 20 20      nField++;.  
1a160 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 46 69 65  }.  assert( nFie
1a170 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  ld <= pKeyInfo->
1a180 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d  nField+pKeyInfo-
1a190 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d 0a 23 65  >nXField );.}.#e
1a1a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62  lse.# define vdb
1a1b0 65 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e  eAssertFieldCoun
1a1c0 74 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 41 2c  tWithinLimits(A,
1a1d0 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  B,C).#endif../*.
1a1e0 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d 31 20 61  ** Both *pMem1 a
1a1f0 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e 74 61 69  nd *pMem2 contai
1a200 6e 20 73 74 72 69 6e 67 20 76 61 6c 75 65 73 2e  n string values.
1a210 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 77 6f   Compare the two
1a220 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73 69 6e 67   values.** using
1a230 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1a240 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 2e 20 41  equence pColl. A
1a250 73 20 75 73 75 61 6c 2c 20 72 65 74 75 72 6e 20  s usual, return 
1a260 61 20 6e 65 67 61 74 69 76 65 20 2c 20 7a 65 72  a negative , zer
1a270 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76 65  o.** or positive
1a280 20 76 61 6c 75 65 20 69 66 20 2a 70 4d 65 6d 31   value if *pMem1
1a290 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20 65   is less than, e
1a2a0 71 75 61 6c 20 74 6f 20 6f 72 20 67 72 65 61 74  qual to or great
1a2b0 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a 70 4d 65  er than .** *pMe
1a2c0 6d 32 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79  m2, respectively
1a2d0 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20 73 70 69  . Similar in spi
1a2e0 72 69 74 20 74 6f 20 22 72 63 20 3d 20 28 2a 70  rit to "rc = (*p
1a2f0 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65 6d 32 29  Mem1) - (*pMem2)
1a300 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ;"..*/.static in
1a310 74 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  t vdbeCompareMem
1a320 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74 20  String(.  const 
1a330 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20 20 63 6f  Mem *pMem1,.  co
1a340 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 32 2c 0a  nst Mem *pMem2,.
1a350 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71 20    const CollSeq 
1a360 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20 2a 70 72  *pColl,.  u8 *pr
1a370 63 45 72 72 20 20 20 20 20 20 20 20 20 20 20 20  cErr            
1a380 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1a390 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73 2c 20 73  an OOM occurs, s
1a3a0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d  et to SQLITE_NOM
1a3b0 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 70  EM */.){.  if( p
1a3c0 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c  Mem1->enc==pColl
1a3d0 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 2f 2a 20  ->enc ){.    /* 
1a3e0 54 68 65 20 73 74 72 69 6e 67 73 20 61 72 65 20  The strings are 
1a3f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
1a400 6f 72 72 65 63 74 20 65 6e 63 6f 64 69 6e 67 2e  orrect encoding.
1a410 20 20 43 61 6c 6c 20 74 68 65 0a 20 20 20 20 20    Call the.     
1a420 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75  ** comparison fu
1a430 6e 63 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  nction directly 
1a440 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  */.    return pC
1a450 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1a460 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d 3e 6e 2c  >pUser,pMem1->n,
1a470 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e  pMem1->z,pMem2->
1a480 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a 20 20 7d  n,pMem2->z);.  }
1a490 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63  else{.    int rc
1a4a0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  ;.    const void
1a4b0 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20 20 20 69   *v1, *v2;.    i
1a4c0 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20 20 20 4d  nt n1, n2;.    M
1a4d0 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65 6d 20 63  em c1;.    Mem c
1a4e0 32 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  2;.    sqlite3Vd
1a4f0 62 65 4d 65 6d 49 6e 69 74 28 26 63 31 2c 20 70  beMemInit(&c1, p
1a500 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75  Mem1->db, MEM_Nu
1a510 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ll);.    sqlite3
1a520 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 32 2c  VdbeMemInit(&c2,
1a530 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d 5f   pMem1->db, MEM_
1a540 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Null);.    sqlit
1a550 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f 77  e3VdbeMemShallow
1a560 43 6f 70 79 28 26 63 31 2c 20 70 4d 65 6d 31 2c  Copy(&c1, pMem1,
1a570 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20 20   MEM_Ephem);.   
1a580 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53   sqlite3VdbeMemS
1a590 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63 32 2c 20  hallowCopy(&c2, 
1a5a0 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70 68 65 6d  pMem2, MEM_Ephem
1a5b0 29 3b 0a 20 20 20 20 76 31 20 3d 20 73 71 6c 69  );.    v1 = sqli
1a5c0 74 65 33 56 61 6c 75 65 54 65 78 74 28 28 73 71  te3ValueText((sq
1a5d0 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26 63 31  lite3_value*)&c1
1a5e0 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b 0a 20  , pColl->enc);. 
1a5f0 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30 20 3f 20     n1 = v1==0 ? 
1a600 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20 20 76 32  0 : c1.n;.    v2
1a610 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
1a620 65 78 74 28 28 73 71 6c 69 74 65 33 5f 76 61 6c  ext((sqlite3_val
1a630 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c 6c 2d 3e  ue*)&c2, pColl->
1a640 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20 3d 20 76  enc);.    n2 = v
1a650 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32 2e 6e 3b  2==0 ? 0 : c2.n;
1a660 0a 20 20 20 20 72 63 20 3d 20 70 43 6f 6c 6c 2d  .    rc = pColl-
1a670 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73  >xCmp(pColl->pUs
1a680 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e 32 2c 20  er, n1, v1, n2, 
1a690 76 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  v2);.    sqlite3
1a6a0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1a6b0 63 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  c1);.    sqlite3
1a6c0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1a6d0 63 32 29 3b 0a 20 20 20 20 69 66 28 20 28 76 31  c2);.    if( (v1
1a6e0 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29 20 26 26  ==0 || v2==0) &&
1a6f0 20 70 72 63 45 72 72 20 29 20 2a 70 72 63 45 72   prcErr ) *prcEr
1a700 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  r = SQLITE_NOMEM
1a710 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1a720 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1a730 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73 2e  mpare two blobs.
1a740 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69 76    Return negativ
1a750 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69  e, zero, or posi
1a760 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72 73  tive if the firs
1a770 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68 61  t.** is less tha
1a780 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1a790 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1a7a0 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63 74   second, respect
1a7b0 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e 65  ively..** If one
1a7c0 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66 69   blob is a prefi
1a7d0 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c 20  x of the other, 
1a7e0 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65 72  then the shorter
1a7f0 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e 0a   is the lessor..
1a800 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54 45  */.static SQLITE
1a810 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73 71  _NOINLINE int sq
1a820 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72 65  lite3BlobCompare
1a830 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31 2c  (const Mem *pB1,
1a840 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32 29   const Mem *pB2)
1a850 7b 0a 20 20 69 6e 74 20 63 20 3d 20 6d 65 6d 63  {.  int c = memc
1a860 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e  mp(pB1->z, pB2->
1a870 7a 2c 20 70 42 31 2d 3e 6e 3e 70 42 32 2d 3e 6e  z, pB1->n>pB2->n
1a880 20 3f 20 70 42 32 2d 3e 6e 20 3a 20 70 42 31 2d   ? pB2->n : pB1-
1a890 3e 6e 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72  >n);.  if( c ) r
1a8a0 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72  eturn c;.  retur
1a8b0 6e 20 70 42 31 2d 3e 6e 20 2d 20 70 42 32 2d 3e  n pB1->n - pB2->
1a8c0 6e 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  n;.}.../*.** Com
1a8d0 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20  pare the values 
1a8e0 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68 65  contained by the
1a8f0 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c 6c   two memory cell
1a900 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a 20  s, returning.** 
1a910 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20 6f  negative, zero o
1a920 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70 4d  r positive if pM
1a930 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1a940 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20 67  , equal to, or g
1a950 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20 70  reater.** than p
1a960 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f 72  Mem2. Sorting or
1a970 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66 69  der is NULL's fi
1a980 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  rst, followed by
1a990 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67 65   numbers (intege
1a9a0 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73 29  rs.** and reals)
1a9b0 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63 61   sorted numerica
1a9c0 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62 79  lly, followed by
1a9d0 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62 79   text ordered by
1a9e0 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a   the collating.*
1a9f0 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  * sequence pColl
1aa00 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c 6f   and finally blo
1aa10 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20 6d  b's ordered by m
1aa20 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  emcmp()..**.** T
1aa30 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20 61  wo NULL values a
1aa40 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65 71  re considered eq
1aa50 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e 63  ual by this func
1aa60 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
1aa70 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 63  ite3MemCompare(c
1aa80 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c  onst Mem *pMem1,
1aa90 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1aaa0 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65 71  2, const CollSeq
1aab0 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74 20   *pColl){.  int 
1aac0 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63 6f  f1, f2;.  int co
1aad0 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a 20  mbined_flags;.. 
1aae0 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c 61   f1 = pMem1->fla
1aaf0 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d 32  gs;.  f2 = pMem2
1ab00 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62 69  ->flags;.  combi
1ab10 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c 66  ned_flags = f1|f
1ab20 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63 6f  2;.  assert( (co
1ab30 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20 4d  mbined_flags & M
1ab40 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29 3b  EM_RowSet)==0 );
1ab50 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 76  . .  /* If one v
1ab60 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69 74  alue is NULL, it
1ab70 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74 68   is less than th
1ab80 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74 68  e other. If both
1ab90 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72 65   values.  ** are
1aba0 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30 2e   NULL, return 0.
1abb0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1abc0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 4e  ined_flags&MEM_N
1abd0 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ull ){.    retur
1abe0 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29 20  n (f2&MEM_Null) 
1abf0 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29 3b  - (f1&MEM_Null);
1ac00 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1ac10 65 20 76 61 6c 75 65 20 69 73 20 61 20 6e 75 6d  e value is a num
1ac20 62 65 72 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ber and the othe
1ac30 72 20 69 73 20 6e 6f 74 2c 20 74 68 65 20 6e 75  r is not, the nu
1ac40 6d 62 65 72 20 69 73 20 6c 65 73 73 2e 0a 20 20  mber is less..  
1ac50 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65 20 6e  ** If both are n
1ac60 75 6d 62 65 72 73 2c 20 63 6f 6d 70 61 72 65 20  umbers, compare 
1ac70 61 73 20 72 65 61 6c 73 20 69 66 20 6f 6e 65 20  as reals if one 
1ac80 69 73 20 61 20 72 65 61 6c 2c 20 6f 72 20 61 73  is a real, or as
1ac90 20 69 6e 74 65 67 65 72 73 0a 20 20 2a 2a 20 69   integers.  ** i
1aca0 66 20 62 6f 74 68 20 76 61 6c 75 65 73 20 61 72  f both values ar
1acb0 65 20 69 6e 74 65 67 65 72 73 2e 0a 20 20 2a 2f  e integers..  */
1acc0 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f  .  if( combined_
1acd0 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d  flags&(MEM_Int|M
1ace0 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20 20 20 20  EM_Real) ){.    
1acf0 64 6f 75 62 6c 65 20 72 31 2c 20 72 32 3b 0a 20  double r1, r2;. 
1ad00 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1ad10 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
1ad20 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1ad30 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
1ad40 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
1ad50 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1ad60 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
1ad70 69 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  i ) return 1;.  
1ad80 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1ad90 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1ada0 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1adb0 20 20 20 20 20 20 72 31 20 3d 20 70 4d 65 6d 31        r1 = pMem1
1adc0 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.r;.    }else
1add0 20 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74   if( (f1&MEM_Int
1ade0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 31  )!=0 ){.      r1
1adf0 20 3d 20 28 64 6f 75 62 6c 65 29 70 4d 65 6d 31   = (double)pMem1
1ae00 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d 65 6c 73 65  ->u.i;.    }else
1ae10 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
1ae20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1ae30 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d 30  (f2&MEM_Real)!=0
1ae40 20 29 7b 0a 20 20 20 20 20 20 72 32 20 3d 20 70   ){.      r2 = p
1ae50 4d 65 6d 32 2d 3e 75 2e 72 3b 0a 20 20 20 20 7d  Mem2->u.r;.    }
1ae60 65 6c 73 65 20 69 66 28 20 28 66 32 26 4d 45 4d  else if( (f2&MEM
1ae70 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  _Int)!=0 ){.    
1ae80 20 20 72 32 20 3d 20 28 64 6f 75 62 6c 65 29 70    r2 = (double)p
1ae90 4d 65 6d 32 2d 3e 75 2e 69 3b 0a 20 20 20 20 7d  Mem2->u.i;.    }
1aea0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1aeb0 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
1aec0 20 69 66 28 20 72 31 3c 72 32 20 29 20 72 65 74   if( r1<r2 ) ret
1aed0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  urn -1;.    if( 
1aee0 72 31 3e 72 32 20 29 20 72 65 74 75 72 6e 20 31  r1>r2 ) return 1
1aef0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1af00 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1af10 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1af20 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1af30 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1af40 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1af50 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1af60 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1af70 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1af80 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1af90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1afa0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1afb0 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1afc0 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1afd0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1afe0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1aff0 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1b000 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1b010 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1b020 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1b030 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1b040 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b050 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49  pMem1->enc==SQLI
1b060 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20 20 20 20  TE_UTF8 || .    
1b070 20 20 20 20 20 20 20 20 70 4d 65 6d 31 2d 3e 65          pMem1->e
1b080 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
1b090 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63  LE || pMem1->enc
1b0a0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
1b0b0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   );..    /* The 
1b0c0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1b0d0 63 65 20 6d 75 73 74 20 62 65 20 64 65 66 69 6e  ce must be defin
1b0e0 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
1b0f0 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20 2a 2a  , even if.    **
1b100 20 74 68 65 20 75 73 65 72 20 64 65 6c 65 74 65   the user delete
1b110 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  s the collation 
1b120 73 65 71 75 65 6e 63 65 20 61 66 74 65 72 20 74  sequence after t
1b130 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
1b140 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  is.    ** compil
1b150 65 64 20 28 74 68 69 73 20 77 61 73 20 6e 6f 74  ed (this was not
1b160 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
1b170 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  )..    */.    as
1b180 73 65 72 74 28 20 21 70 43 6f 6c 6c 20 7c 7c 20  sert( !pColl || 
1b190 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a  pColl->xCmp );..
1b1a0 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b      if( pColl ){
1b1b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 64  .      return vd
1b1c0 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69  beCompareMemStri
1b1d0 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c  ng(pMem1, pMem2,
1b1e0 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20 20 20 20   pColl, 0);.    
1b1f0 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 4e 55  }.    /* If a NU
1b200 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61 73 20 70  LL pointer was p
1b210 61 73 73 65 64 20 61 73 20 74 68 65 20 63 6f 6c  assed as the col
1b220 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 66  late function, f
1b230 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20 20 20 20  all through.    
1b240 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f 62 20 63  ** to the blob c
1b250 61 73 65 20 61 6e 64 20 75 73 65 20 6d 65 6d 63  ase and use memc
1b260 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a  mp().  */.  }. .
1b270 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c 75 65 73    /* Both values
1b280 20 6d 75 73 74 20 62 65 20 62 6c 6f 62 73 2e 20   must be blobs. 
1b290 20 43 6f 6d 70 61 72 65 20 75 73 69 6e 67 20 6d   Compare using m
1b2a0 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 72  emcmp().  */.  r
1b2b0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 6c 6f  eturn sqlite3Blo
1b2c0 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31 2c 20  bCompare(pMem1, 
1b2d0 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  pMem2);.}.../*.*
1b2e0 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
1b2f0 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 74  ment passed to t
1b300 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1b310 61 20 73 65 72 69 61 6c 2d 74 79 70 65 20 74 68  a serial-type th
1b320 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  at.** correspond
1b330 73 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  s to an integer 
1b340 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20 62 65 74  - all values bet
1b350 77 65 65 6e 20 31 20 61 6e 64 20 39 20 69 6e 63  ween 1 and 9 inc
1b360 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78 63 65 70  lusive .** excep
1b370 74 20 37 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  t 7. The second 
1b380 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66  points to a buff
1b390 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e  er containing an
1b3a0 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 0a 2a   integer value.*
1b3b0 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 61 63 63  * serialized acc
1b3c0 6f 72 64 69 6e 67 20 74 6f 20 73 65 72 69 61 6c  ording to serial
1b3d0 5f 74 79 70 65 2e 20 54 68 69 73 20 66 75 6e 63  _type. This func
1b3e0 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65  tion deserialize
1b3f0 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72 6e 73  s.** and returns
1b400 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73   the value..*/.s
1b410 74 61 74 69 63 20 69 36 34 20 76 64 62 65 52 65  tatic i64 vdbeRe
1b420 63 6f 72 64 44 65 63 6f 64 65 49 6e 74 28 75 33  cordDecodeInt(u3
1b430 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 63  2 serial_type, c
1b440 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 29 7b 0a  onst u8 *aKey){.
1b450 20 20 75 33 32 20 79 3b 0a 20 20 61 73 73 65 72    u32 y;.  asser
1b460 74 28 20 43 4f 52 52 55 50 54 5f 44 42 20 7c 7c  t( CORRUPT_DB ||
1b470 20 28 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31   (serial_type>=1
1b480 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70 65 3c   && serial_type<
1b490 3d 39 20 26 26 20 73 65 72 69 61 6c 5f 74 79 70  =9 && serial_typ
1b4a0 65 21 3d 37 29 20 29 3b 0a 20 20 73 77 69 74 63  e!=7) );.  switc
1b4b0 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29  h( serial_type )
1b4c0 7b 0a 20 20 20 20 63 61 73 65 20 30 3a 0a 20 20  {.    case 0:.  
1b4d0 20 20 63 61 73 65 20 31 3a 0a 20 20 20 20 20 20    case 1:.      
1b4e0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1b4f0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1b500 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59 54 45 5f  return ONE_BYTE_
1b510 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1b520 61 73 65 20 32 3a 0a 20 20 20 20 20 20 74 65 73  ase 2:.      tes
1b530 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1b540 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1b550 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54  urn TWO_BYTE_INT
1b560 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65  (aKey);.    case
1b570 20 33 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61   3:.      testca
1b580 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30  se( aKey[0]&0x80
1b590 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
1b5a0 20 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28   THREE_BYTE_INT(
1b5b0 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1b5c0 34 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  4: {.      testc
1b5d0 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1b5e0 30 20 29 3b 0a 20 20 20 20 20 20 79 20 3d 20 46  0 );.      y = F
1b5f0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1b600 65 79 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ey);.      retur
1b610 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a 29 26 79  n (i64)*(int*)&y
1b620 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1b630 20 35 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74   5: {.      test
1b640 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1b650 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1b660 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  rn FOUR_BYTE_UIN
1b670 54 28 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69  T(aKey+2) + (((i
1b680 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1b690 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1b6a0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 36 3a     }.    case 6:
1b6b0 20 7b 0a 20 20 20 20 20 20 75 36 34 20 78 20 3d   {.      u64 x =
1b6c0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1b6d0 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73  aKey);.      tes
1b6e0 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1b6f0 78 38 30 20 29 3b 0a 20 20 20 20 20 20 78 20 3d  x80 );.      x =
1b700 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f 55 52 5f   (x<<32) | FOUR_
1b710 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 2b 34  BYTE_UINT(aKey+4
1b720 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1b730 28 69 36 34 29 2a 28 69 36 34 2a 29 26 78 3b 0a  (i64)*(i64*)&x;.
1b740 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1b750 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79 70 65  urn (serial_type
1b760 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   - 8);.}../*.** 
1b770 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f  This function co
1b780 6d 70 61 72 65 73 20 74 68 65 20 74 77 6f 20 74  mpares the two t
1b790 61 62 6c 65 20 72 6f 77 73 20 6f 72 20 69 6e 64  able rows or ind
1b7a0 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a 20 73 70  ex records.** sp
1b7b0 65 63 69 66 69 65 64 20 62 79 20 7b 6e 4b 65 79  ecified by {nKey
1b7c0 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64 20 70 50  1, pKey1} and pP
1b7d0 4b 65 79 32 2e 20 20 49 74 20 72 65 74 75 72 6e  Key2.  It return
1b7e0 73 20 61 20 6e 65 67 61 74 69 76 65 2c 20 7a 65  s a negative, ze
1b7f0 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74 69 76  ro.** or positiv
1b800 65 20 69 6e 74 65 67 65 72 20 69 66 20 6b 65 79  e integer if key
1b810 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  1 is less than, 
1b820 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20  equal to or .** 
1b830 67 72 65 61 74 65 72 20 74 68 61 6e 20 6b 65 79  greater than key
1b840 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79 31 2c 20  2.  The {nKey1, 
1b850 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75 73 74 20  pKey1} key must 
1b860 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20 63 72 65  be a blob.** cre
1b870 61 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d  ated by the OP_M
1b880 61 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65  akeRecord opcode
1b890 20 6f 66 20 74 68 65 20 56 44 42 45 2e 20 20 54   of the VDBE.  T
1b8a0 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20 6b 65 79  he pPKey2.** key
1b8b0 20 6d 75 73 74 20 62 65 20 61 20 70 61 72 73 65   must be a parse
1b8c0 64 20 6b 65 79 20 73 75 63 68 20 61 73 20 6f 62  d key such as ob
1b8d0 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73  tained from.** s
1b8e0 71 6c 69 74 65 33 56 64 62 65 50 61 72 73 65 52  qlite3VdbeParseR
1b8f0 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ecord..**.** If 
1b900 61 72 67 75 6d 65 6e 74 20 62 53 6b 69 70 20 69  argument bSkip i
1b910 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69 74 20 69  s non-zero, it i
1b920 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
1b930 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
1b940 72 65 61 64 79 0a 2a 2a 20 64 65 74 65 72 6d 69  ready.** determi
1b950 6e 65 64 20 74 68 61 74 20 74 68 65 20 66 69 72  ned that the fir
1b960 73 74 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  st fields of the
1b970 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1b980 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61 6e 64 20  .**.** Key1 and 
1b990 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68 61 76 65  Key2 do not have
1b9a0 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20   to contain the 
1b9b0 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  same number of f
1b9c0 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c 20 0a 2a  ields. If all .*
1b9d0 2a 20 66 69 65 6c 64 73 20 74 68 61 74 20 61 70  * fields that ap
1b9e0 70 65 61 72 20 69 6e 20 62 6f 74 68 20 6b 65 79  pear in both key
1b9f0 73 20 61 72 65 20 65 71 75 61 6c 2c 20 74 68 65  s are equal, the
1ba00 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1ba10 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72 65 74 75  t_rc is .** retu
1ba20 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64  rned..**.** If d
1ba30 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1ba40 6f 6e 20 69 73 20 64 69 73 63 6f 76 65 72 65 64  on is discovered
1ba50 2c 20 73 65 74 20 70 50 4b 65 79 32 2d 3e 65 72  , set pPKey2->er
1ba60 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20 53 51 4c  rCode to .** SQL
1ba70 49 54 45 5f 43 4f 52 52 55 50 54 20 61 6e 64 20  ITE_CORRUPT and 
1ba80 72 65 74 75 72 6e 20 30 2e 20 49 66 20 61 6e 20  return 0. If an 
1ba90 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20 65 6e 63  OOM error is enc
1baa0 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a 20 70 50  ountered, .** pP
1bab0 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 69 73  Key2->errCode is
1bac0 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4e   set to SQLITE_N
1bad0 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20 69 74 20  OMEM and, if it 
1bae0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
1baf0 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65  .** malloc-faile
1bb00 64 20 66 6c 61 67 20 73 65 74 20 6f 6e 20 64 61  d flag set on da
1bb10 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 28 70  tabase handle (p
1bb20 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1bb30 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  >db)..*/.int sql
1bb40 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1bb50 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 0a 20  mpareWithSkip(. 
1bb60 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1bb70 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20  t void *pKey1,  
1bb80 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a   /* Left key */.
1bb90 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64    UnpackedRecord
1bba0 20 2a 70 50 4b 65 79 32 2c 20 20 20 20 20 20 20   *pPKey2,       
1bbb0 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1bbc0 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70 20 20 20  /.  int bSkip   
1bbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbe0 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1bbf0 73 6b 69 70 20 74 68 65 20 66 69 72 73 74 20 66  skip the first f
1bc00 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 75 33 32  ield */.){.  u32
1bc10 20 64 31 3b 20 20 20 20 20 20 20 20 20 20 20 20   d1;            
1bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc30 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1bc40 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20  [] of next data 
1bc50 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  element */.  int
1bc60 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
1bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bc80 49 6e 64 65 78 20 6f 66 20 6e 65 78 74 20 66 69  Index of next fi
1bc90 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a  eld to compare *
1bca0 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 31 3b 20  /.  u32 szHdr1; 
1bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcc0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72      /* Size of r
1bcd0 65 63 6f 72 64 20 68 65 61 64 65 72 20 69 6e 20  ecord header in 
1bce0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 69  bytes */.  u32 i
1bcf0 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 20 20  dx1;            
1bd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1bd10 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 74 79  fset of first ty
1bd20 70 65 20 69 6e 20 68 65 61 64 65 72 20 2a 2f 0a  pe in header */.
1bd30 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 20 20 20    int rc = 0;   
1bd40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd50 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
1bd60 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 52 68 73  e */.  Mem *pRhs
1bd70 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b   = pPKey2->aMem;
1bd80 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 66         /* Next f
1bd90 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 74  ield of pPKey2 t
1bda0 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 4b  o compare */.  K
1bdb0 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1bdc0 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49   = pPKey2->pKeyI
1bdd0 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  nfo;.  const uns
1bde0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1bdf0 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1be00 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1be10 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20  ;.  Mem mem1;.. 
1be20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20 69 73 20   /* If bSkip is 
1be30 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 63  true, then the c
1be40 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1be50 79 20 64 65 74 65 72 6d 69 6e 65 64 20 74 68 61  y determined tha
1be60 74 20 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a  t the first.  **
1be70 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73 20 69 6e   two elements in
1be80 20 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71   the keys are eq
1be90 75 61 6c 2e 20 46 69 78 20 74 68 65 20 76 61 72  ual. Fix the var
1bea0 69 6f 75 73 20 73 74 61 63 6b 20 76 61 72 69 61  ious stack varia
1beb0 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20 74 68 61  bles so.  ** tha
1bec0 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  t this routine b
1bed0 65 67 69 6e 73 20 63 6f 6d 70 61 72 69 6e 67 20  egins comparing 
1bee0 61 74 20 74 68 65 20 73 65 63 6f 6e 64 20 66 69  at the second fi
1bef0 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28 20 62 53  eld. */.  if( bS
1bf00 6b 69 70 20 29 7b 0a 20 20 20 20 75 33 32 20 73  kip ){.    u32 s
1bf10 31 3b 0a 20 20 20 20 69 64 78 31 20 3d 20 31 20  1;.    idx1 = 1 
1bf20 2b 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 61  + getVarint32(&a
1bf30 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b 0a 20 20  Key1[1], s1);.  
1bf40 20 20 73 7a 48 64 72 31 20 3d 20 61 4b 65 79 31    szHdr1 = aKey1
1bf50 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d 20 73 7a  [0];.    d1 = sz
1bf60 48 64 72 31 20 2b 20 73 71 6c 69 74 65 33 56 64  Hdr1 + sqlite3Vd
1bf70 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
1bf80 73 31 29 3b 0a 20 20 20 20 69 20 3d 20 31 3b 0a  s1);.    i = 1;.
1bf90 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20 20 7d 65      pRhs++;.  }e
1bfa0 6c 73 65 7b 0a 20 20 20 20 69 64 78 31 20 3d 20  lse{.    idx1 = 
1bfb0 67 65 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79  getVarint32(aKey
1bfc0 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20 20 20 20  1, szHdr1);.    
1bfd0 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 20  d1 = szHdr1;.   
1bfe0 20 69 66 28 20 64 31 3e 28 75 6e 73 69 67 6e 65   if( d1>(unsigne
1bff0 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20 20 20 20  d)nKey1 ){ .    
1c000 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1c010 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1c020 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c030 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a     return 0;  /*
1c040 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1c050 20 20 20 7d 0a 20 20 20 20 69 20 3d 20 30 3b 0a     }.    i = 0;.
1c060 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e 4c 59 28    }..  VVA_ONLY(
1c070 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1c080 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1c090 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1c0a0 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 20   statements */. 
1c0b0 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d   assert( pPKey2-
1c0c0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c  >pKeyInfo->nFiel
1c0d0 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  d+pPKey2->pKeyIn
1c0e0 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d 70 50 4b  fo->nXField>=pPK
1c0f0 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a 20 20 20  ey2->nField .   
1c100 20 20 20 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44      || CORRUPT_D
1c110 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1c120 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1c130 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1c140 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  ;.  assert( pPKe
1c150 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1c160 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65  ield>0 );.  asse
1c170 72 74 28 20 69 64 78 31 3c 3d 73 7a 48 64 72 31  rt( idx1<=szHdr1
1c180 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29   || CORRUPT_DB )
1c190 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75 33 32 20  ;.  do{.    u32 
1c1a0 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20  serial_type;..  
1c1b0 20 20 2f 2a 20 52 48 53 20 69 73 20 61 6e 20 69    /* RHS is an i
1c1c0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 69 66  nteger */.    if
1c1d0 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20  ( pRhs->flags & 
1c1e0 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20  MEM_Int ){.     
1c1f0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1c200 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1c210 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1c220 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1c230 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1c240 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20 20  type>=12 ){.    
1c250 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1c260 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72     }else if( ser
1c270 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20  ial_type==0 ){. 
1c280 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1c290 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c2a0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29  serial_type==7 )
1c2b0 7b 0a 20 20 20 20 20 20 20 20 64 6f 75 62 6c 65  {.        double
1c2c0 20 72 68 73 20 3d 20 28 64 6f 75 62 6c 65 29 70   rhs = (double)p
1c2d0 52 68 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20  Rhs->u.i;.      
1c2e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1c2f0 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1c300 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1c310 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1c320 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 72 68 73  if( mem1.u.r<rhs
1c330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
1c340 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1c350 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75 2e  else if( mem1.u.
1c360 72 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20  r>rhs ){.       
1c370 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20     rc = +1;.    
1c380 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
1c390 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
1c3a0 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
1c3b0 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
1c3c0 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
1c3d0 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
1c3e0 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
1c3f0 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1c400 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1c410 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1c420 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1c430 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1c440 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1c450 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c460 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1c470 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
1c480 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1c490 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1c4a0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1c4b0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1c4c0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1c4d0 6c 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20  l_type>=12 ){.  
1c4e0 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1c4f0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1c500 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29 7b  erial_type==0 ){
1c510 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31  .        rc = -1
1c520 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
1c530 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 68         double rh
1c540 73 20 3d 20 70 52 68 73 2d 3e 75 2e 72 3b 0a 20  s = pRhs->u.r;. 
1c550 20 20 20 20 20 20 20 64 6f 75 62 6c 65 20 6c 68         double lh
1c560 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  s;.        sqlit
1c570 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1c580 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69  &aKey1[d1], seri
1c590 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b  al_type, &mem1);
1c5a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 65 72  .        if( ser
1c5b0 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20  ial_type==7 ){. 
1c5c0 20 20 20 20 20 20 20 20 20 6c 68 73 20 3d 20 6d           lhs = m
1c5d0 65 6d 31 2e 75 2e 72 3b 0a 20 20 20 20 20 20 20  em1.u.r;.       
1c5e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c5f0 20 20 6c 68 73 20 3d 20 28 64 6f 75 62 6c 65 29    lhs = (double)
1c600 6d 65 6d 31 2e 75 2e 69 3b 0a 20 20 20 20 20 20  mem1.u.i;.      
1c610 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1c620 6c 68 73 3c 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs<rhs ){.     
1c630 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1c640 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c650 6c 68 73 3e 72 68 73 20 29 7b 0a 20 20 20 20 20  lhs>rhs ){.     
1c660 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1c670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c680 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48      }..    /* RH
1c690 53 20 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f  S is a string */
1c6a0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1c6b0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1c6c0 53 74 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74  Str ){.      get
1c6d0 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1c6e0 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  idx1], serial_ty
1c6f0 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  pe);.      testc
1c700 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ase( serial_type
1c710 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66  ==12 );.      if
1c720 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
1c730 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c740 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   -1;.      }else
1c750 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
1c760 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1c770 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20        rc = +1;. 
1c780 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c790 20 20 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65      mem1.n = (se
1c7a0 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20  rial_type - 12) 
1c7b0 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73  / 2;.        tes
1c7c0 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1c7d0 6e 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  n)==(unsigned)nK
1c7e0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1c7f0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d  estcase( (d1+mem
1c800 31 2e 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65  1.n+1)==(unsigne
1c810 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20  d)nKey1 );.     
1c820 20 20 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e     if( (d1+mem1.
1c830 6e 29 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e  n) > (unsigned)n
1c840 4b 65 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20  Key1 ){.        
1c850 20 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64    pPKey2->errCod
1c860 65 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43  e = (u8)SQLITE_C
1c870 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
1c880 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
1c890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c8a0 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f  /* Corruption */
1c8b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
1c8c0 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  f( pKeyInfo->aCo
1c8d0 6c 6c 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20  ll[i] ){.       
1c8e0 20 20 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b     mem1.enc = pK
1c8f0 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20  eyInfo->enc;.   
1c900 20 20 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d         mem1.db =
1c910 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20   pKeyInfo->db;. 
1c920 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c           mem1.fl
1c930 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20  ags = MEM_Str;. 
1c940 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20           mem1.z 
1c950 3d 20 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b  = (char*)&aKey1[
1c960 64 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72  d1];.          r
1c970 63 20 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d  c = vdbeCompareM
1c980 65 6d 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  emString(.      
1c990 20 20 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70          &mem1, p
1c9a0 52 68 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61  Rhs, pKeyInfo->a
1c9b0 43 6f 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32  Coll[i], &pPKey2
1c9c0 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20  ->errCode.      
1c9d0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d      );.        }
1c9e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c9f0 69 6e 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d  int nCmp = MIN(m
1ca00 65 6d 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b  em1.n, pRhs->n);
1ca10 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ca20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31  memcmp(&aKey1[d1
1ca30 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70  ], pRhs->z, nCmp
1ca40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1ca50 20 72 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65   rc==0 ) rc = me
1ca60 6d 31 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20  m1.n - pRhs->n; 
1ca70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ca80 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1ca90 20 52 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a   RHS is a blob *
1caa0 2f 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  /.    else if( p
1cab0 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Rhs->flags & MEM
1cac0 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 67  _Blob ){.      g
1cad0 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1cae0 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c 5f  1[idx1], serial_
1caf0 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65 73  type);.      tes
1cb00 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1cb10 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1cb20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c  if( serial_type<
1cb30 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79  12 || (serial_ty
1cb40 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20  pe & 0x01) ){.  
1cb50 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1cb60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cb70 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20 28      int nStr = (
1cb80 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31 32  serial_type - 12
1cb90 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20 74  ) / 2;.        t
1cba0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
1cbb0 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b  r)==(unsigned)nK
1cbc0 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74  ey1 );.        t
1cbd0 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53 74  estcase( (d1+nSt
1cbe0 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  r+1)==(unsigned)
1cbf0 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1cc00 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20 3e   if( (d1+nStr) >
1cc10 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31   (unsigned)nKey1
1cc20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50   ){.          pP
1cc30 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1cc40 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1cc50 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  PT_BKPT;.       
1cc60 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20     return 0;    
1cc70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1cc80 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  orruption */.   
1cc90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cca0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1ccb0 20 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d   MIN(nStr, pRhs-
1ccc0 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  >n);.          r
1ccd0 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  c = memcmp(&aKey
1cce0 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20  1[d1], pRhs->z, 
1ccf0 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  nCmp);.         
1cd00 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20   if( rc==0 ) rc 
1cd10 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e  = nStr - pRhs->n
1cd20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cd30 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1cd40 2a 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f  * RHS is null */
1cd50 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20  .    else{.     
1cd60 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61   serial_type = a
1cd70 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20  Key1[idx1];.    
1cd80 20 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74    rc = (serial_t
1cd90 79 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a  ype!=0);.    }..
1cda0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
1cdb0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1cdc0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1cdd0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1cde0 20 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = -rc;.      }.
1cdf0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64        assert( vd
1ce00 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1ce10 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79  ebug(nKey1, pKey
1ce20 31 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29  1, pPKey2, rc) )
1ce30 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1ce40 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30  mem1.szMalloc==0
1ce50 20 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d   );  /* See comm
1ce60 65 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20  ent below */.   
1ce70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ce80 20 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20    }..    i++;.  
1ce90 20 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31    pRhs++;.    d1
1cea0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1ceb0 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72  erialTypeLen(ser
1cec0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69  ial_type);.    i
1ced0 64 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61  dx1 += sqlite3Va
1cee0 72 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74  rintLen(serial_t
1cef0 79 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ype);.  }while( 
1cf00 69 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73  idx1<(unsigned)s
1cf10 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79  zHdr1 && i<pPKey
1cf20 32 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c  2->nField && d1<
1cf30 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31  =(unsigned)nKey1
1cf40 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d   );..  /* No mem
1cf50 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69  ory allocation i
1cf60 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d  s ever used on m
1cf70 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73  em1.  Prove this
1cf80 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20   using.  ** the 
1cf90 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1cfa0 28 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65  ().  If the asse
1cfb0 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69  rt() fails, it i
1cfc0 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20  ndicates a.  ** 
1cfd0 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20  memory leak and 
1cfe0 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73  a need to call s
1cff0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1d000 65 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f  ease(&mem1).  */
1d010 0a 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e  .  assert( mem1.
1d020 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a  szMalloc==0 );..
1d030 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20    /* rc==0 here 
1d040 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f  means that one o
1d050 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65  r both of the ke
1d060 79 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69  ys ran out of fi
1d070 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c  elds and.  ** al
1d080 6c 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20  l the fields up 
1d090 74 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  to that point we
1d0a0 72 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e  re equal. Return
1d0b0 20 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a   the default_rc.
1d0c0 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a    ** value.  */.
1d0d0 20 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50    assert( CORRUP
1d0e0 54 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20  T_DB .       || 
1d0f0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
1d100 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b  eDebug(nKey1, pK
1d110 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b  ey1, pPKey2, pPK
1d120 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29  ey2->default_rc)
1d130 20 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79   .       || pKey
1d140 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1d150 46 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65  Failed.  );.  re
1d160 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  turn pPKey2->def
1d170 61 75 6c 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73  ault_rc;.}.int s
1d180 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1d190 43 6f 6d 70 61 72 65 28 0a 20 20 69 6e 74 20 6e  Compare(.  int n
1d1a0 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
1d1b0 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65   *pKey1,   /* Le
1d1c0 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61  ft key */.  Unpa
1d1d0 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b 65  ckedRecord *pPKe
1d1e0 79 32 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  y2          /* R
1d1f0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
1d200 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
1d210 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1d220 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
1d230 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 30  pKey1, pPKey2, 0
1d240 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
1d250 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  s function is an
1d260 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72 73 69   optimized versi
1d270 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56 64 62  on of sqlite3Vdb
1d280 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1d290 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20 74 68   .** that (a) th
1d2a0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 6f 66  e first field of
1d2b0 20 70 50 4b 65 79 32 20 69 73 20 61 6e 20 69 6e   pPKey2 is an in
1d2c0 74 65 67 65 72 2c 20 61 6e 64 20 28 62 29 20 74  teger, and (b) t
1d2d0 68 65 20 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68  he .** size-of-h
1d2e0 65 61 64 65 72 20 76 61 72 69 6e 74 20 61 74 20  eader varint at 
1d2f0 74 68 65 20 73 74 61 72 74 20 6f 66 20 28 70 4b  the start of (pK
1d300 65 79 31 2f 6e 4b 65 79 31 29 20 66 69 74 73 20  ey1/nKey1) fits 
1d310 69 6e 20 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62  in a single.** b
1d320 79 74 65 20 28 69 2e 65 2e 20 69 73 20 6c 65 73  yte (i.e. is les
1d330 73 20 74 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a  s than 128)..**.
1d340 2a 2a 20 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63  ** To avoid conc
1d350 65 72 6e 73 20 61 62 6f 75 74 20 62 75 66 66 65  erns about buffe
1d360 72 20 6f 76 65 72 72 65 61 64 73 2c 20 74 68 69  r overreads, thi
1d370 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c  s routine is onl
1d380 79 20 75 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68  y used.** on sch
1d390 65 6d 61 73 20 77 68 65 72 65 20 74 68 65 20 6d  emas where the m
1d3a0 61 78 69 6d 75 6d 20 76 61 6c 69 64 20 68 65 61  aximum valid hea
1d3b0 64 65 72 20 73 69 7a 65 20 69 73 20 36 33 20 62  der size is 63 b
1d3c0 79 74 65 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f  ytes or less..*/
1d3d0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
1d3e0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1d3f0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1d400 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1d410 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f  , /* Left key */
1d420 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  .  UnpackedRecor
1d430 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20  d *pPKey2       
1d440 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1d450 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  .){.  const u8 *
1d460 61 4b 65 79 20 3d 20 26 28 28 63 6f 6e 73 74 20  aKey = &((const 
1d470 75 38 2a 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e  u8*)pKey1)[*(con
1d480 73 74 20 75 38 2a 29 70 4b 65 79 31 20 26 20 30  st u8*)pKey1 & 0
1d490 78 33 46 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69  x3F];.  int seri
1d4a0 61 6c 5f 74 79 70 65 20 3d 20 28 28 63 6f 6e 73  al_type = ((cons
1d4b0 74 20 75 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b  t u8*)pKey1)[1];
1d4c0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 33  .  int res;.  u3
1d4d0 32 20 79 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20  2 y;.  u64 x;.  
1d4e0 69 36 34 20 76 20 3d 20 70 50 4b 65 79 32 2d 3e  i64 v = pPKey2->
1d4f0 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20 69  aMem[0].u.i;.  i
1d500 36 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41  64 lhs;..  vdbeA
1d510 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
1d520 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
1d530 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1d540 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61  ->pKeyInfo);.  a
1d550 73 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b  ssert( (*(u8*)pK
1d560 65 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f  ey1)<=0x3F || CO
1d570 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77  RRUPT_DB );.  sw
1d580 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1d590 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
1d5a0 20 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67   { /* 1-byte sig
1d5b0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1d5c0 20 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42       lhs = ONE_B
1d5d0 59 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20  YTE_INT(aKey);. 
1d5e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1d5f0 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1d600 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d610 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79  ase 2: { /* 2-by
1d620 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1d630 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1d640 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b   TWO_BYTE_INT(aK
1d650 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  ey);.      testc
1d660 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
1d670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1d680 0a 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f  .    case 3: { /
1d690 2a 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 3-byte signed 
1d6a0 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1d6b0 20 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54   lhs = THREE_BYT
1d6c0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d6d0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1d6e0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1d6f0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d700 65 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65  e 4: { /* 4-byte
1d710 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1d720 2a 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55  */.      y = FOU
1d730 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d740 29 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28  );.      lhs = (
1d750 69 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20  i64)*(int*)&y;. 
1d760 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c       testcase( l
1d770 68 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72  hs<0 );.      br
1d780 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1d790 61 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79  ase 5: { /* 6-by
1d7a0 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  te signed intege
1d7b0 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d  r */.      lhs =
1d7c0 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28   FOUR_BYTE_UINT(
1d7d0 61 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34  aKey+2) + (((i64
1d7e0 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54  )1)<<32)*TWO_BYT
1d7f0 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20  E_INT(aKey);.   
1d800 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
1d810 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
1d820 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
1d830 65 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65  e 6: { /* 8-byte
1d840 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1d850 2a 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55  */.      x = FOU
1d860 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1d870 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1d880 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1d890 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1d8a0 20 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34       lhs = *(i64
1d8b0 2a 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&x;.      test
1d8c0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
1d8d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1d8e0 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20  }.    case 8: . 
1d8f0 20 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20       lhs = 0;.  
1d900 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1d910 61 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73  ase 9:.      lhs
1d920 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61   = 1;.      brea
1d930 6b 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20  k;..    /* This 
1d940 63 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65  case could be re
1d950 6d 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68  moved without ch
1d960 61 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c  anging the resul
1d970 74 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20  ts of running.  
1d980 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20    ** this code. 
1d990 49 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75  Including it cau
1d9a0 73 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72  ses gcc to gener
1d9b0 61 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69  ate a faster swi
1d9c0 74 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74  tch .    ** stat
1d9d0 65 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65  ement (since the
1d9e0 20 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68   range of switch
1d9f0 20 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61   targets now sta
1da00 72 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a  rts at zero and.
1da10 20 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67      ** is contig
1da20 75 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e  uous) but does n
1da30 6f 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70  ot cause any dup
1da40 6c 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62  licate code to b
1da50 65 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20  e generated.    
1da60 2a 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c  ** (as gcc is cl
1da70 65 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63  ever enough to c
1da80 6f 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c  ombine the two l
1da90 69 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65  ike cases). Othe
1daa0 72 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  r .    ** compil
1dab0 65 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d  ers might be sim
1dac0 69 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63  ilar.  */ .    c
1dad0 61 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20  ase 0: case 7:. 
1dae0 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1daf0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1db00 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79  pare(nKey1, pKey
1db10 31 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20  1, pPKey2);..   
1db20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
1db30 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1db40 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1db50 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1db60 4b 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Key2);.  }..  if
1db70 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20 20 72  ( v>lhs ){.    r
1db80 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b  es = pPKey2->r1;
1db90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3c 6c  .  }else if( v<l
1dba0 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20  hs ){.    res = 
1dbb0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 7d 65  pPKey2->r2;.  }e
1dbc0 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32 2d 3e  lse if( pPKey2->
1dbd0 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20 20 20  nField>1 ){.    
1dbe0 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66 69 65  /* The first fie
1dbf0 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f 20 6b  lds of the two k
1dc00 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20 43  eys are equal. C
1dc10 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61 69 6c  ompare the trail
1dc20 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69 65 6c  ing .    ** fiel
1dc30 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65 73 20  ds.  */.    res 
1dc40 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1dc50 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b  ordCompareWithSk
1dc60 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ip(nKey1, pKey1,
1dc70 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 7d   pPKey2, 1);.  }
1dc80 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1dc90 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
1dca0 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
1dcb0 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68 65 72  e equal and ther
1dcc0 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c 69 6e  e are no trailin
1dcd0 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e  g.    ** fields.
1dce0 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32 2d 3e   Return pPKey2->
1dcf0 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20 74 68  default_rc in th
1dd00 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  is case. */.    
1dd10 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65  res = pPKey2->de
1dd20 66 61 75 6c 74 5f 72 63 3b 0a 20 20 7d 0a 0a 20  fault_rc;.  }.. 
1dd30 20 61 73 73 65 72 74 28 20 76 64 62 65 52 65 63   assert( vdbeRec
1dd40 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28  ordCompareDebug(
1dd50 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50  nKey1, pKey1, pP
1dd60 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a 20 20  Key2, res) );.  
1dd70 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1dd80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1dd90 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a  on is an optimiz
1dda0 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 71  ed version of sq
1ddb0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
1ddc0 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74 68 61  ompare() .** tha
1ddd0 74 20 28 61 29 20 74 68 65 20 66 69 72 73 74 20  t (a) the first 
1dde0 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79 32 20  field of pPKey2 
1ddf0 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74 68 61  is a string, tha
1de00 74 20 28 62 29 20 74 68 65 20 66 69 72 73 74 20  t (b) the first 
1de10 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20 74 68  field.** uses th
1de20 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1de30 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e 64 20  ence BINARY and 
1de40 28 63 29 20 74 68 61 74 20 74 68 65 20 73 69 7a  (c) that the siz
1de50 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
1de60 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20 73 74  nt .** at the st
1de70 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f 6e 4b  art of (pKey1/nK
1de80 65 79 31 29 20 66 69 74 73 20 69 6e 20 61 20 73  ey1) fits in a s
1de90 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f 0a 73  ingle byte..*/.s
1dea0 74 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65  tatic int vdbeRe
1deb0 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e  cordCompareStrin
1dec0 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  g(.  int nKey1, 
1ded0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1dee0 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a  1, /* Left key *
1def0 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1df00 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20 20 20  rd *pPKey2      
1df10 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a    /* Right key *
1df20 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75 38 20  /.){.  const u8 
1df30 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20  *aKey1 = (const 
1df40 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69 6e 74  u8*)pKey1;.  int
1df50 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a 20 20   serial_type;.  
1df60 69 6e 74 20 72 65 73 3b 0a 0a 20 20 76 64 62 65  int res;..  vdbe
1df70 41 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74  AssertFieldCount
1df80 57 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65  WithinLimits(nKe
1df90 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
1dfa0 32 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20  2->pKeyInfo);.  
1dfb0 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1dfc0 79 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  y1[1], serial_ty
1dfd0 70 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61  pe);.  if( seria
1dfe0 6c 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20  l_type<12 ){.   
1dff0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e000 31 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79  1;      /* (pKey
1e010 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75  1/nKey1) is a nu
1e020 6d 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a  mber or a null *
1e030 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28  /.  }else if( !(
1e040 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1e050 30 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20  01) ){ .    res 
1e060 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20  = pPKey2->r2;   
1e070 20 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65     /* (pKey1/nKe
1e080 79 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f  y1) is a blob */
1e090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1e0a0 74 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20  t nCmp;.    int 
1e0b0 6e 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a  nStr;.    int sz
1e0c0 48 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  Hdr = aKey1[0];.
1e0d0 0a 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72  .    nStr = (ser
1e0e0 69 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32  ial_type-12) / 2
1e0f0 3b 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72  ;.    if( (szHdr
1e100 20 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31   + nStr) > nKey1
1e110 20 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32   ){.      pPKey2
1e120 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29  ->errCode = (u8)
1e130 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1e140 4b 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72  KPT;.      retur
1e150 6e 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75  n 0;    /* Corru
1e160 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ption */.    }. 
1e170 20 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70     nCmp = MIN( p
1e180 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e  PKey2->aMem[0].n
1e190 2c 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65  , nStr );.    re
1e1a0 73 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79  s = memcmp(&aKey
1e1b0 31 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32  1[szHdr], pPKey2
1e1c0 2d 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d  ->aMem[0].z, nCm
1e1d0 70 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73  p);..    if( res
1e1e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  ==0 ){.      res
1e1f0 20 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32   = nStr - pPKey2
1e200 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20  ->aMem[0].n;.   
1e210 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b     if( res==0 ){
1e220 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b  .        if( pPK
1e230 65 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b  ey2->nField>1 ){
1e240 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d  .          res =
1e250 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e260 72 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69  rdCompareWithSki
1e270 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  p(nKey1, pKey1, 
1e280 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20  pPKey2, 1);.    
1e290 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e2a0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
1e2b0 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20  2->default_rc;. 
1e2c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e2d0 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1e2e0 7b 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20  {.        res = 
1e2f0 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20  pPKey2->r2;.    
1e300 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e310 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
1e320 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1e330 65 6c 73 65 20 69 66 28 20 72 65 73 3e 30 20 29  else if( res>0 )
1e340 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
1e350 4b 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65  Key2->r2;.    }e
1e360 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 73 20 3d  lse{.      res =
1e370 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20   pPKey2->r1;.   
1e380 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
1e390 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  ( vdbeRecordComp
1e3a0 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c 20  areDebug(nKey1, 
1e3b0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 72  pKey1, pPKey2, r
1e3c0 65 73 29 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f  es).       || CO
1e3d0 52 52 55 50 54 5f 44 42 0a 20 20 20 20 20 20 20  RRUPT_DB.       
1e3e0 7c 7c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49  || pPKey2->pKeyI
1e3f0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1e400 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 72 65 74  ailed.  );.  ret
1e410 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  urn res;.}../*.*
1e420 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
1e430 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
1e440 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e450 65 28 29 20 63 6f 6d 70 61 74 69 62 6c 65 20 66  e() compatible f
1e460 75 6e 63 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61  unction.** suita
1e470 62 6c 65 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e  ble for comparin
1e480 67 20 73 65 72 69 61 6c 69 7a 65 64 20 72 65 63  g serialized rec
1e490 6f 72 64 73 20 74 6f 20 74 68 65 20 75 6e 70 61  ords to the unpa
1e4a0 63 6b 65 64 20 72 65 63 6f 72 64 20 70 61 73 73  cked record pass
1e4b0 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c  ed.** as the onl
1e4c0 79 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52  y argument..*/.R
1e4d0 65 63 6f 72 64 43 6f 6d 70 61 72 65 20 73 71 6c  ecordCompare sql
1e4e0 69 74 65 33 56 64 62 65 46 69 6e 64 43 6f 6d 70  ite3VdbeFindComp
1e4f0 61 72 65 28 55 6e 70 61 63 6b 65 64 52 65 63 6f  are(UnpackedReco
1e500 72 64 20 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72  rd *p){.  /* var
1e510 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
1e520 49 6e 74 28 29 20 61 6e 64 20 76 61 72 69 6e 74  Int() and varint
1e530 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
1e540 69 6e 67 28 29 20 62 6f 74 68 20 61 73 73 75 6d  ing() both assum
1e550 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  e.  ** that the 
1e560 73 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76  size-of-header v
1e570 61 72 69 6e 74 20 74 68 61 74 20 6f 63 63 75 72  arint that occur
1e580 73 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  s at the start o
1e590 66 20 65 61 63 68 20 72 65 63 6f 72 64 0a 20 20  f each record.  
1e5a0 2a 2a 20 66 69 74 73 20 69 6e 20 61 20 73 69 6e  ** fits in a sin
1e5b0 67 6c 65 20 62 79 74 65 20 28 69 2e 65 2e 20 69  gle byte (i.e. i
1e5c0 73 20 31 32 37 20 6f 72 20 6c 65 73 73 29 2e 20  s 127 or less). 
1e5d0 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70  varintRecordComp
1e5e0 61 72 65 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c  areInt().  ** al
1e5f0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  so assumes that 
1e600 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 6f 76  it is safe to ov
1e610 65 72 72 65 61 64 20 61 20 62 75 66 66 65 72 20  erread a buffer 
1e620 62 79 20 61 74 20 6c 65 61 73 74 20 74 68 65 20  by at least the 
1e630 0a 20 20 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f  .  ** maximum po
1e640 73 73 69 62 6c 65 20 6c 65 67 61 6c 20 68 65 61  ssible legal hea
1e650 64 65 72 20 73 69 7a 65 20 70 6c 75 73 20 38 20  der size plus 8 
1e660 62 79 74 65 73 2e 20 42 65 63 61 75 73 65 20 74  bytes. Because t
1e670 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 67 75 61  here is.  ** gua
1e680 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 74  ranteed to be at
1e690 20 6c 65 61 73 74 20 37 34 20 28 62 75 74 20 6e   least 74 (but n
1e6a0 6f 74 20 31 33 36 29 20 62 79 74 65 73 20 6f 66  ot 136) bytes of
1e6b0 20 70 61 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69   padding followi
1e6c0 6e 67 20 65 61 63 68 0a 20 20 2a 2a 20 62 75 66  ng each.  ** buf
1e6d0 66 65 72 20 70 61 73 73 65 64 20 74 6f 20 76 61  fer passed to va
1e6e0 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72  rintRecordCompar
1e6f0 65 49 6e 74 28 29 20 74 68 69 73 20 6d 61 6b 65  eInt() this make
1e700 73 20 69 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20  s it convenient 
1e710 74 6f 0a 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68  to.  ** limit th
1e720 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
1e730 61 64 65 72 20 74 6f 20 36 34 20 62 79 74 65 73  ader to 64 bytes
1e740 20 69 6e 20 63 61 73 65 73 20 77 68 65 72 65 20   in cases where 
1e750 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
1e760 20 20 2a 2a 20 69 73 20 61 6e 20 69 6e 74 65 67    ** is an integ
1e770 65 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  er..  **.  ** Th
1e780 65 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f  e easiest way to
1e790 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 6c 69   enforce this li
1e7a0 6d 69 74 20 69 73 20 74 6f 20 63 6f 6e 73 69 64  mit is to consid
1e7b0 65 72 20 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20  er only records 
1e7c0 77 69 74 68 0a 20 20 2a 2a 20 31 33 20 66 69 65  with.  ** 13 fie
1e7d0 6c 64 73 20 6f 72 20 6c 65 73 73 2e 20 49 66 20  lds or less. If 
1e7e0 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1e7f0 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2c 20 74  is an integer, t
1e800 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
1e810 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 73 69 7a  .  ** header siz
1e820 65 20 69 73 20 28 31 32 2a 35 20 2b 20 31 20 2b  e is (12*5 + 1 +
1e830 20 31 29 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20   1) bytes.  */. 
1e840 20 69 66 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66   if( (p->pKeyInf
1e850 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70  o->nField + p->p
1e860 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1e870 29 3c 3d 31 33 20 29 7b 0a 20 20 20 20 69 6e 74  )<=13 ){.    int
1e880 20 66 6c 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d   flags = p->aMem
1e890 5b 30 5d 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69  [0].flags;.    i
1e8a0 66 28 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  f( p->pKeyInfo->
1e8b0 61 53 6f 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b  aSortOrder[0] ){
1e8c0 0a 20 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 31  .      p->r1 = 1
1e8d0 3b 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20  ;.      p->r2 = 
1e8e0 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  -1;.    }else{. 
1e8f0 20 20 20 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b       p->r1 = -1;
1e900 0a 20 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 31  .      p->r2 = 1
1e910 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1e920 28 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74  (flags & MEM_Int
1e930 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
1e940 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  n vdbeRecordComp
1e950 61 72 65 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20  areInt;.    }.  
1e960 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67    testcase( flag
1e970 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a  s & MEM_Real );.
1e980 20 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c      testcase( fl
1e990 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29  ags & MEM_Null )
1e9a0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
1e9b0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62  flags & MEM_Blob
1e9c0 20 29 3b 0a 20 20 20 20 69 66 28 20 28 66 6c 61   );.    if( (fla
1e9d0 67 73 20 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d  gs & (MEM_Real|M
1e9e0 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62  EM_Null|MEM_Blob
1e9f0 29 29 3d 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79  ))==0 && p->pKey
1ea00 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d  Info->aColl[0]==
1ea10 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1ea20 74 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53  t( flags & MEM_S
1ea30 74 72 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  tr );.      retu
1ea40 72 6e 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  rn vdbeRecordCom
1ea50 70 61 72 65 53 74 72 69 6e 67 3b 0a 20 20 20 20  pareString;.    
1ea60 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1ea70 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1ea80 64 43 6f 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a  dCompare;.}../*.
1ea90 2a 2a 20 70 43 75 72 20 70 6f 69 6e 74 73 20 61  ** pCur points a
1eaa0 74 20 61 6e 20 69 6e 64 65 78 20 65 6e 74 72 79  t an index entry
1eab0 20 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74   created using t
1eac0 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  he OP_MakeRecord
1ead0 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64   opcode..** Read
1eae0 20 74 68 65 20 72 6f 77 69 64 20 28 74 68 65 20   the rowid (the 
1eaf0 6c 61 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68  last field in th
1eb00 65 20 72 65 63 6f 72 64 29 20 61 6e 64 20 73 74  e record) and st
1eb10 6f 72 65 20 69 74 20 69 6e 20 2a 72 6f 77 69 64  ore it in *rowid
1eb20 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  ..** Return SQLI
1eb30 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
1eb40 69 6e 67 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e  ing works, or an
1eb50 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 74 68 65   error code othe
1eb60 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75  rwise..**.** pCu
1eb70 72 20 6d 69 67 68 74 20 62 65 20 70 6f 69 6e 74  r might be point
1eb80 69 6e 67 20 74 6f 20 74 65 78 74 20 6f 62 74 61  ing to text obta
1eb90 69 6e 65 64 20 66 72 6f 6d 20 61 20 63 6f 72 72  ined from a corr
1eba0 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
1ebb0 65 2e 0a 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e  e..** So the con
1ebc0 74 65 6e 74 20 63 61 6e 6e 6f 74 20 62 65 20 74  tent cannot be t
1ebd0 72 75 73 74 65 64 2e 20 20 44 6f 20 61 70 70 72  rusted.  Do appr
1ebe0 6f 70 72 69 61 74 65 20 63 68 65 63 6b 73 20 6f  opriate checks o
1ebf0 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a  n the content..*
1ec00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
1ec10 65 49 64 78 52 6f 77 69 64 28 73 71 6c 69 74 65  eIdxRowid(sqlite
1ec20 33 20 2a 64 62 2c 20 42 74 43 75 72 73 6f 72 20  3 *db, BtCursor 
1ec30 2a 70 43 75 72 2c 20 69 36 34 20 2a 72 6f 77 69  *pCur, i64 *rowi
1ec40 64 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b  d){.  i64 nCellK
1ec50 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ey = 0;.  int rc
1ec60 3b 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 20 20  ;.  u32 szHdr;  
1ec70 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
1ec80 20 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20   the header */. 
1ec90 20 75 33 32 20 74 79 70 65 52 6f 77 69 64 3b 20   u32 typeRowid; 
1eca0 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70     /* Serial typ
1ecb0 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20 2a  e of the rowid *
1ecc0 2f 0a 20 20 75 33 32 20 6c 65 6e 52 6f 77 69 64  /.  u32 lenRowid
1ecd0 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
1ece0 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20   the rowid */.  
1ecf0 4d 65 6d 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20  Mem m, v;..  /* 
1ed00 47 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  Get the size of 
1ed10 74 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 2e  the index entry.
1ed20 20 20 4f 6e 6c 79 20 69 6e 64 69 63 65 73 20 65    Only indices e
1ed30 6e 74 72 69 65 73 20 6f 66 20 6c 65 73 73 0a 20  ntries of less. 
1ed40 20 2a 2a 20 74 68 61 6e 20 32 47 69 42 20 61 72   ** than 2GiB ar
1ed50 65 20 73 75 70 70 6f 72 74 20 2d 20 61 6e 79 74  e support - anyt
1ed60 68 69 6e 67 20 6c 61 72 67 65 20 6d 75 73 74 20  hing large must 
1ed70 62 65 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  be database corr
1ed80 75 70 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79  uption..  ** Any
1ed90 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
1eda0 65 74 65 63 74 65 64 20 69 6e 20 73 71 6c 69 74  etected in sqlit
1edb0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
1edc0 50 74 72 28 29 2c 20 74 68 6f 75 67 68 2c 20 73  Ptr(), though, s
1edd0 6f 0a 20 20 2a 2a 20 74 68 69 73 20 63 6f 64 65  o.  ** this code
1ede0 20 63 61 6e 20 73 61 66 65 6c 79 20 61 73 73 75   can safely assu
1edf0 6d 65 20 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79  me that nCellKey
1ee00 20 69 73 20 33 32 2d 62 69 74 73 20 20 0a 20 20   is 32-bits  .  
1ee10 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1ee20 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 49  ite3BtreeCursorI
1ee30 73 56 61 6c 69 64 28 70 43 75 72 29 20 29 3b 0a  sValid(pCur) );.
1ee40 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20 3d 29    VVA_ONLY(rc =)
1ee50 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
1ee60 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43 65 6c  Size(pCur, &nCel
1ee70 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28  lKey);.  assert(
1ee80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ee90 3b 20 20 20 20 20 2f 2a 20 70 43 75 72 20 69 73  ;     /* pCur is
1eea0 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73 6f   always valid so
1eeb0 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74 20   KeySize cannot 
1eec0 66 61 69 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  fail */.  assert
1eed0 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53 51  ( (nCellKey & SQ
1eee0 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d 28  LITE_MAX_U32)==(
1eef0 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  u64)nCellKey );.
1ef00 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68  .  /* Read in th
1ef10 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
1ef20 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nt of the index 
1ef30 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  entry */.  sqlit
1ef40 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
1ef50 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
1ef60 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
1ef70 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
1ef80 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
1ef90 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
1efa0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
1efb0 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  rc;.  }..  /* Th
1efc0 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d 75  e index entry mu
1efd0 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61 20  st begin with a 
1efe0 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a 20  header size */. 
1eff0 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74   (void)getVarint
1f000 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a 48  32((u8*)m.z, szH
1f010 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  dr);.  testcase(
1f020 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20 74   szHdr==3 );.  t
1f030 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d 3d  estcase( szHdr==
1f040 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c  m.n );.  if( unl
1f050 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c 7c  ikely(szHdr<3 ||
1f060 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e 29   (int)szHdr>m.n)
1f070 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
1f080 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
1f090 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  n;.  }..  /* The
1f0a0 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20 74   last field of t
1f0b0 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64 20  he index should 
1f0c0 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20  be an integer - 
1f0d0 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a 20  the ROWID..  ** 
1f0e0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
1f0f0 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c 6c  last entry reall
1f100 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  y is an integer.
1f110 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74 56   */.  (void)getV
1f120 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d 2e  arint32((u8*)&m.
1f130 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70 65  z[szHdr-1], type
1f140 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63 61  Rowid);.  testca
1f150 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 31  se( typeRowid==1
1f160 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f170 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b 0a  typeRowid==2 );.
1f180 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1f190 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74 65  Rowid==3 );.  te
1f1a0 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1f1b0 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63 61  d==4 );.  testca
1f1c0 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d 35  se( typeRowid==5
1f1d0 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
1f1e0 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b 0a  typeRowid==6 );.
1f1f0 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70 65    testcase( type
1f200 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74 65  Rowid==8 );.  te
1f210 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77 69  stcase( typeRowi
1f220 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75 6e  d==9 );.  if( un
1f230 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69 64  likely(typeRowid
1f240 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3e  <1 || typeRowid>
1f250 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d 3d  9 || typeRowid==
1f260 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69  7) ){.    goto i
1f270 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74  dx_rowid_corrupt
1f280 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52 6f  ion;.  }.  lenRo
1f290 77 69 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62  wid = sqlite3Vdb
1f2a0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 74  eSerialTypeLen(t
1f2b0 79 70 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73  ypeRowid);.  tes
1f2c0 74 63 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d  tcase( (u32)m.n=
1f2d0 3d 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20  =szHdr+lenRowid 
1f2e0 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c  );.  if( unlikel
1f2f0 79 28 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72  y((u32)m.n<szHdr
1f300 2b 6c 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20  +lenRowid) ){.  
1f310 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64    goto idx_rowid
1f320 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d  _corruption;.  }
1f330 0a 0a 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65  ..  /* Fetch the
1f340 20 69 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65   integer off the
1f350 20 65 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65   end of the inde
1f360 78 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71  x record */.  sq
1f370 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1f380 65 74 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e  et((u8*)&m.z[m.n
1f390 2d 6c 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65  -lenRowid], type
1f3a0 52 6f 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72  Rowid, &v);.  *r
1f3b0 6f 77 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20  owid = v.u.i;.  
1f3c0 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65  sqlite3VdbeMemRe
1f3d0 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74  lease(&m);.  ret
1f3e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1f3f0 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1f400 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1f410 70 74 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65  ption is detecte
1f420 64 20 61 66 74 65 72 20 6d 20 68 61 73 20 62 65  d after m has be
1f430 65 6e 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65  en.  ** allocate
1f440 64 2e 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f  d.  Free the m o
1f450 62 6a 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e  bject and return
1f460 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e   SQLITE_CORRUPT.
1f470 20 2a 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f   */.idx_rowid_co
1f480 72 72 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74  rruption:.  test
1f490 63 61 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63  case( m.szMalloc
1f4a0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
1f4b0 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1f4c0 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  m);.  return SQL
1f4d0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f4e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61  ;.}../*.** Compa
1f4f0 72 65 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68  re the key of th
1f500 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68  e index entry th
1f510 61 74 20 63 75 72 73 6f 72 20 70 43 20 69 73 20  at cursor pC is 
1f520 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69  pointing to agai
1f530 6e 73 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73  nst.** the key s
1f540 74 72 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b  tring in pUnpack
1f550 65 64 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20  ed.  Write into 
1f560 2a 70 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a  *pRes a number.*
1f570 2a 20 74 68 61 74 20 69 73 20 6e 65 67 61 74 69  * that is negati
1f580 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1f590 69 74 69 76 65 20 69 66 20 70 43 20 69 73 20 6c  itive if pC is l
1f5a0 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1f5b0 74 6f 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65  to,.** or greate
1f5c0 72 20 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64  r than pUnpacked
1f5d0 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1f5e0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  _OK on success..
1f5f0 2a 2a 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20  **.** pUnpacked 
1f600 69 73 20 65 69 74 68 65 72 20 63 72 65 61 74 65  is either create
1f610 64 20 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69  d without a rowi
1f620 64 20 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65  d or is truncate
1f630 64 20 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20  d so that it.** 
1f640 6f 6d 69 74 73 20 74 68 65 20 72 6f 77 69 64 20  omits the rowid 
1f650 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65  at the end.  The
1f660 20 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e   rowid at the en
1f670 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  d of the index e
1f680 6e 74 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72  ntry.** is ignor
1f690 65 64 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e  ed as well.  Hen
1f6a0 63 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ce, this routine
1f6b0 20 6f 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74   only compares t
1f6c0 68 65 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20  he prefixes .** 
1f6d0 6f 66 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f  of the keys prio
1f6e0 72 20 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72  r to the final r
1f6f0 6f 77 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e  owid, not the en
1f700 74 69 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74  tire key..*/.int
1f710 20 73 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b   sqlite3VdbeIdxK
1f720 65 79 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c  eyCompare(.  sql
1f730 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
1f740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f750 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
1f760 74 69 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75  tion */.  VdbeCu
1f770 72 73 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20  rsor *pC,       
1f780 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f790 65 20 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70  e cursor to comp
1f7a0 61 72 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20  are against */. 
1f7b0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1f7c0 2a 70 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20  *pUnpacked,     
1f7d0 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65    /* Unpacked ve
1f7e0 72 73 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a  rsion of key */.
1f7f0 20 20 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20    int *res      
1f800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f810 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
1f820 63 6f 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c  comparison resul
1f830 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  t here */.){.  i
1f840 36 34 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b  64 nCellKey = 0;
1f850 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43  .  int rc;.  BtC
1f860 75 72 73 6f 72 20 2a 70 43 75 72 20 3d 20 70 43  ursor *pCur = pC
1f870 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 4d 65 6d  ->pCursor;.  Mem
1f880 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73   m;..  assert( s
1f890 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
1f8a0 72 49 73 56 61 6c 69 64 28 70 43 75 72 29 20 29  rIsValid(pCur) )
1f8b0 3b 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 72 63 20  ;.  VVA_ONLY(rc 
1f8c0 3d 29 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b  =) sqlite3BtreeK
1f8d0 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 6e 43  eySize(pCur, &nC
1f8e0 65 6c 6c 4b 65 79 29 3b 0a 20 20 61 73 73 65 72  ellKey);.  asser
1f8f0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
1f900 20 29 3b 20 20 20 20 2f 2a 20 70 43 75 72 20 69   );    /* pCur i
1f910 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 20 73  s always valid s
1f920 6f 20 4b 65 79 53 69 7a 65 20 63 61 6e 6e 6f 74  o KeySize cannot
1f930 20 66 61 69 6c 20 2a 2f 0a 20 20 2f 2a 20 6e 43   fail */.  /* nC
1f940 65 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61  ellKey will alwa
1f950 79 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20  ys be between 0 
1f960 61 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62  and 0xffffffff b
1f970 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61  ecause of the wa
1f980 79 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65  y.  ** that btre
1f990 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20  eParseCellPtr() 
1f9a0 61 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61  and sqlite3GetVa
1f9b0 72 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70  rint32() are imp
1f9c0 6c 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66  lemented */.  if
1f9d0 28 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c  ( nCellKey<=0 ||
1f9e0 20 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66   nCellKey>0x7fff
1f9f0 66 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73  ffff ){.    *res
1fa00 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1fa10 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
1fa20 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  BKPT;.  }.  sqli
1fa30 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1fa40 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
1fa50 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
1fa60 46 72 6f 6d 42 74 72 65 65 28 70 43 2d 3e 70 43  FromBtree(pC->pC
1fa70 75 72 73 6f 72 2c 20 30 2c 20 28 75 33 32 29 6e  ursor, 0, (u32)n
1fa80 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
1fa90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1faa0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1fab0 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
1fac0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1fad0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
1fae0 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
1faf0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
1fb00 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
1fb10 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1fb20 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
1fb30 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
1fb40 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
1fb50 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
1fb60 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
1fb70 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
1fb80 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1fb90 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
1fba0 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
1fbb0 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
1fbc0 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
1fbd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1fbe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
1fbf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
1fc00 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
1fc10 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
1fc20 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
1fc30 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
1fc40 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
1fc50 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
1fc60 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
1fc70 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
1fc80 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
1fc90 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1fca0 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
1fcb0 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
1fcc0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
1fcd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
1fce0 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
1fcf0 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
1fd00 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
1fd10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
1fd20 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
1fd30 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
1fd40 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
1fd50 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
1fd60 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
1fd70 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
1fd80 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
1fd90 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
1fda0 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
1fdb0 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
1fdc0 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
1fdd0 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
1fde0 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
1fdf0 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
1fe00 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
1fe10 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
1fe20 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
1fe30 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
1fe40 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
1fe50 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
1fe60 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
1fe70 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
1fe80 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
1fe90 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
1fea0 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
1feb0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
1fec0 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
1fed0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
1fee0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
1fef0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
1ff00 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
1ff10 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1ff20 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
1ff30 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
1ff40 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
1ff50 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
1ff60 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
1ff70 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
1ff80 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
1ff90 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
1ffa0 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
1ffb0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
1ffc0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
1ffd0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
1ffe0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
1fff0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
20000 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
20010 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
20020 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
20030 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
20040 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
20050 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
20060 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
20070 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
20080 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
20090 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
200a0 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
200b0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
200c0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
200d0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
200e0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
200f0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
20100 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
20110 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
20120 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
20130 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
20140 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
20150 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
20160 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
20170 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
20180 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
20190 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
201a0 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
201b0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
201c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
201d0 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
201e0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
201f0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
20200 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
20210 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
20220 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
20230 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
20240 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
20250 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
20260 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
20270 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
20280 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
20290 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
202a0 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
202b0 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
202c0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
202d0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
202e0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
202f0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
20300 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
20310 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
20320 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
20330 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
20340 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
20350 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
20360 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
20370 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
20380 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
20390 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
203a0 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
203b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
203c0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
203d0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
203e0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
203f0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
20400 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
20410 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
20420 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
20430 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
20440 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
20450 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
20460 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
20470 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
20480 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
20490 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
204a0 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
204b0 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
204c0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
204d0 74 61 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  tab){.  sqlite3 
204e0 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 73  *db = p->db;.  s
204f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
20500 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
20510 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  p->zErrMsg = sql
20520 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
20530 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29   pVtab->zErrMsg)
20540 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
20550 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
20560 3b 0a 20 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  ;.  pVtab->zErrM
20570 73 67 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  sg = 0;.}.#endif
20580 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20590 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.