/ Hex Artifact Content
Login

Artifact 2fc9c59009dfb63732c2c89b18aaeb3ca172f7b3:


0000: 2f 2a 0a 2a 2a 20 32 30 30 33 20 53 65 70 74 65  /*.** 2003 Septe
0010: 6d 62 65 72 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65  mber 6.**.** The
0020: 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d   author disclaim
0030: 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74  s copyright to t
0040: 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e  his source code.
0050: 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a    In place of.**
0060: 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c   a legal notice,
0070: 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73 73   here is a bless
0080: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61  ing:.**.**    Ma
0090: 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e  y you do good an
00a0: 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20  d not evil..**  
00b0: 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66    May you find f
00c0: 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79  orgiveness for y
00d0: 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67  ourself and forg
00e0: 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20  ive others..**  
00f0: 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20    May you share 
0100: 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61  freely, never ta
0110: 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79  king more than y
0120: 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a  ou give..**.****
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69  *****.** This fi
0180: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63 6f 64 65  le contains code
0190: 20 75 73 65 64 20 66 6f 72 20 63 72 65 61 74 69   used for creati
01a0: 6e 67 2c 20 64 65 73 74 72 6f 79 69 6e 67 2c 20  ng, destroying, 
01b0: 61 6e 64 20 70 6f 70 75 6c 61 74 69 6e 67 0a 2a  and populating.*
01c0: 2a 20 61 20 56 44 42 45 20 28 6f 72 20 61 6e 20  * a VDBE (or an 
01d0: 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 22 20 61  "sqlite3_stmt" a
01e0: 73 20 69 74 20 69 73 20 6b 6e 6f 77 6e 20 74 6f  s it is known to
01f0: 20 74 68 65 20 6f 75 74 73 69 64 65 20 77 6f 72   the outside wor
0200: 6c 64 2e 29 20 0a 2a 2f 0a 23 69 6e 63 6c 75 64  ld.) .*/.#includ
0210: 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a  e "sqliteInt.h".
0220: 23 69 6e 63 6c 75 64 65 20 22 76 64 62 65 49 6e  #include "vdbeIn
0230: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  t.h"../*.** Crea
0240: 74 65 20 61 20 6e 65 77 20 76 69 72 74 75 61 6c  te a new virtual
0250: 20 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65   database engine
0260: 2e 0a 2a 2f 0a 56 64 62 65 20 2a 73 71 6c 69 74  ..*/.Vdbe *sqlit
0270: 65 33 56 64 62 65 43 72 65 61 74 65 28 50 61 72  e3VdbeCreate(Par
0280: 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 73  se *pParse){.  s
0290: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
02a0: 72 73 65 2d 3e 64 62 3b 0a 20 20 56 64 62 65 20  rse->db;.  Vdbe 
02b0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
02c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
02d0: 2c 20 73 69 7a 65 6f 66 28 56 64 62 65 29 20 29  , sizeof(Vdbe) )
02e0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
02f0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 2d 3e 64 62  eturn 0;.  p->db
0300: 20 3d 20 64 62 3b 0a 20 20 69 66 28 20 64 62 2d   = db;.  if( db-
0310: 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20 64 62  >pVdbe ){.    db
0320: 2d 3e 70 56 64 62 65 2d 3e 70 50 72 65 76 20 3d  ->pVdbe->pPrev =
0330: 20 70 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 4e 65   p;.  }.  p->pNe
0340: 78 74 20 3d 20 64 62 2d 3e 70 56 64 62 65 3b 0a  xt = db->pVdbe;.
0350: 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a    p->pPrev = 0;.
0360: 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 3b    db->pVdbe = p;
0370: 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56 44  .  p->magic = VD
0380: 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a 20  BE_MAGIC_INIT;. 
0390: 20 70 2d 3e 70 50 61 72 73 65 20 3d 20 70 50 61   p->pParse = pPa
03a0: 72 73 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  rse;.  assert( p
03b0: 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 3d 3d 30  Parse->aLabel==0
03c0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
03d0: 61 72 73 65 2d 3e 6e 4c 61 62 65 6c 3d 3d 30 20  arse->nLabel==0 
03e0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
03f0: 72 73 65 2d 3e 6e 4f 70 41 6c 6c 6f 63 3d 3d 30  rse->nOpAlloc==0
0400: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
0410: 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 3d  arse->szOpAlloc=
0420: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  =0 );.  return p
0430: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
0440: 65 20 74 68 65 20 65 72 72 6f 72 20 73 74 72 69  e the error stri
0450: 6e 67 20 73 74 6f 72 65 64 20 69 6e 20 56 64 62  ng stored in Vdb
0460: 65 2e 7a 45 72 72 4d 73 67 0a 2a 2f 0a 76 6f 69  e.zErrMsg.*/.voi
0470: 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72  d sqlite3VdbeErr
0480: 6f 72 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73  or(Vdbe *p, cons
0490: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
04a0: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
04b0: 20 61 70 3b 0a 20 20 73 71 6c 69 74 65 33 44 62   ap;.  sqlite3Db
04c0: 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 7a  Free(p->db, p->z
04d0: 45 72 72 4d 73 67 29 3b 0a 20 20 76 61 5f 73 74  ErrMsg);.  va_st
04e0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
04f0: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
0500: 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66   sqlite3VMPrintf
0510: 28 70 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c  (p->db, zFormat,
0520: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
0530: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d  p);.}../*.** Rem
0540: 65 6d 62 65 72 20 74 68 65 20 53 51 4c 20 73 74  ember the SQL st
0550: 72 69 6e 67 20 66 6f 72 20 61 20 70 72 65 70 61  ring for a prepa
0560: 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
0570: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
0580: 62 65 53 65 74 53 71 6c 28 56 64 62 65 20 2a 70  beSetSql(Vdbe *p
0590: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
05a0: 20 69 6e 74 20 6e 2c 20 69 6e 74 20 69 73 50 72   int n, int isPr
05b0: 65 70 61 72 65 56 32 29 7b 0a 20 20 61 73 73 65  epareV2){.  asse
05c0: 72 74 28 20 69 73 50 72 65 70 61 72 65 56 32 3d  rt( isPrepareV2=
05d0: 3d 31 20 7c 7c 20 69 73 50 72 65 70 61 72 65 56  =1 || isPrepareV
05e0: 32 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 3d  2==0 );.  if( p=
05f0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 23 69 66  =0 ) return;.#if
0600: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
0610: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 21  OMIT_TRACE) && !
0620: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
0630: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 29 0a 20 20  NABLE_SQLLOG).  
0640: 69 66 28 20 21 69 73 50 72 65 70 61 72 65 56 32  if( !isPrepareV2
0650: 20 29 20 72 65 74 75 72 6e 3b 0a 23 65 6e 64 69   ) return;.#endi
0660: 66 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 7a  f.  assert( p->z
0670: 53 71 6c 3d 3d 30 20 29 3b 0a 20 20 70 2d 3e 7a  Sql==0 );.  p->z
0680: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 53  Sql = sqlite3DbS
0690: 74 72 4e 44 75 70 28 70 2d 3e 64 62 2c 20 7a 2c  trNDup(p->db, z,
06a0: 20 6e 29 3b 0a 20 20 70 2d 3e 69 73 50 72 65 70   n);.  p->isPrep
06b0: 61 72 65 56 32 20 3d 20 28 75 38 29 69 73 50 72  areV2 = (u8)isPr
06c0: 65 70 61 72 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a  epareV2;.}../*.*
06d0: 2a 20 53 77 61 70 20 61 6c 6c 20 63 6f 6e 74 65  * Swap all conte
06e0: 6e 74 20 62 65 74 77 65 65 6e 20 74 77 6f 20 56  nt between two V
06f0: 44 42 45 20 73 74 72 75 63 74 75 72 65 73 2e 0a  DBE structures..
0700: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
0710: 64 62 65 53 77 61 70 28 56 64 62 65 20 2a 70 41  dbeSwap(Vdbe *pA
0720: 2c 20 56 64 62 65 20 2a 70 42 29 7b 0a 20 20 56  , Vdbe *pB){.  V
0730: 64 62 65 20 74 6d 70 2c 20 2a 70 54 6d 70 3b 0a  dbe tmp, *pTmp;.
0740: 20 20 63 68 61 72 20 2a 7a 54 6d 70 3b 0a 20 20    char *zTmp;.  
0750: 61 73 73 65 72 74 28 20 70 41 2d 3e 64 62 3d 3d  assert( pA->db==
0760: 70 42 2d 3e 64 62 20 29 3b 0a 20 20 74 6d 70 20  pB->db );.  tmp 
0770: 3d 20 2a 70 41 3b 0a 20 20 2a 70 41 20 3d 20 2a  = *pA;.  *pA = *
0780: 70 42 3b 0a 20 20 2a 70 42 20 3d 20 74 6d 70 3b  pB;.  *pB = tmp;
0790: 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70 4e  .  pTmp = pA->pN
07a0: 65 78 74 3b 0a 20 20 70 41 2d 3e 70 4e 65 78 74  ext;.  pA->pNext
07b0: 20 3d 20 70 42 2d 3e 70 4e 65 78 74 3b 0a 20 20   = pB->pNext;.  
07c0: 70 42 2d 3e 70 4e 65 78 74 20 3d 20 70 54 6d 70  pB->pNext = pTmp
07d0: 3b 0a 20 20 70 54 6d 70 20 3d 20 70 41 2d 3e 70  ;.  pTmp = pA->p
07e0: 50 72 65 76 3b 0a 20 20 70 41 2d 3e 70 50 72 65  Prev;.  pA->pPre
07f0: 76 20 3d 20 70 42 2d 3e 70 50 72 65 76 3b 0a 20  v = pB->pPrev;. 
0800: 20 70 42 2d 3e 70 50 72 65 76 20 3d 20 70 54 6d   pB->pPrev = pTm
0810: 70 3b 0a 20 20 7a 54 6d 70 20 3d 20 70 41 2d 3e  p;.  zTmp = pA->
0820: 7a 53 71 6c 3b 0a 20 20 70 41 2d 3e 7a 53 71 6c  zSql;.  pA->zSql
0830: 20 3d 20 70 42 2d 3e 7a 53 71 6c 3b 0a 20 20 70   = pB->zSql;.  p
0840: 42 2d 3e 7a 53 71 6c 20 3d 20 7a 54 6d 70 3b 0a  B->zSql = zTmp;.
0850: 20 20 70 42 2d 3e 69 73 50 72 65 70 61 72 65 56    pB->isPrepareV
0860: 32 20 3d 20 70 41 2d 3e 69 73 50 72 65 70 61 72  2 = pA->isPrepar
0870: 65 56 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  eV2;.}../*.** Re
0880: 73 69 7a 65 20 74 68 65 20 56 64 62 65 2e 61 4f  size the Vdbe.aO
0890: 70 20 61 72 72 61 79 20 73 6f 20 74 68 61 74 20  p array so that 
08a0: 69 74 20 69 73 20 61 74 20 6c 65 61 73 74 20 6e  it is at least n
08b0: 4f 70 20 65 6c 65 6d 65 6e 74 73 20 6c 61 72 67  Op elements larg
08c0: 65 72 20 0a 2a 2a 20 74 68 61 6e 20 69 74 73 20  er .** than its 
08d0: 63 75 72 72 65 6e 74 20 73 69 7a 65 2e 20 6e 4f  current size. nO
08e0: 70 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  p is guaranteed 
08f0: 74 6f 20 62 65 20 6c 65 73 73 20 74 68 61 6e 20  to be less than 
0900: 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 74 6f 20 31  or equal.** to 1
0910: 30 32 34 2f 73 69 7a 65 6f 66 28 4f 70 29 2e 0a  024/sizeof(Op)..
0920: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 6f 75 74 2d  **.** If an out-
0930: 6f 66 2d 6d 65 6d 6f 72 79 20 65 72 72 6f 72 20  of-memory error 
0940: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 73  occurs while res
0950: 69 7a 69 6e 67 20 74 68 65 20 61 72 72 61 79 2c  izing the array,
0960: 20 72 65 74 75 72 6e 0a 2a 2a 20 53 51 4c 49 54   return.** SQLIT
0970: 45 5f 4e 4f 4d 45 4d 2e 20 49 6e 20 74 68 69 73  E_NOMEM. In this
0980: 20 63 61 73 65 20 56 64 62 65 2e 61 4f 70 20 61   case Vdbe.aOp a
0990: 6e 64 20 50 61 72 73 65 2e 6e 4f 70 41 6c 6c 6f  nd Parse.nOpAllo
09a0: 63 20 72 65 6d 61 69 6e 20 0a 2a 2a 20 75 6e 63  c remain .** unc
09b0: 68 61 6e 67 65 64 20 28 74 68 69 73 20 69 73 20  hanged (this is 
09c0: 73 6f 20 74 68 61 74 20 61 6e 79 20 6f 70 63 6f  so that any opco
09d0: 64 65 73 20 61 6c 72 65 61 64 79 20 61 6c 6c 6f  des already allo
09e0: 63 61 74 65 64 20 63 61 6e 20 62 65 20 0a 2a 2a  cated can be .**
09f0: 20 63 6f 72 72 65 63 74 6c 79 20 64 65 61 6c 6c   correctly deall
0a00: 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
0a10: 68 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68  h the rest of th
0a20: 65 20 56 64 62 65 29 2e 0a 2a 2f 0a 73 74 61 74  e Vdbe)..*/.stat
0a30: 69 63 20 69 6e 74 20 67 72 6f 77 4f 70 41 72 72  ic int growOpArr
0a40: 61 79 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  ay(Vdbe *v, int 
0a50: 6e 4f 70 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a  nOp){.  VdbeOp *
0a60: 70 4e 65 77 3b 0a 20 20 50 61 72 73 65 20 2a 70  pNew;.  Parse *p
0a70: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 0a 20   = v->pParse;.. 
0a80: 20 2f 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 54   /* The SQLITE_T
0a90: 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45  EST_REALLOC_STRE
0aa0: 53 53 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  SS compile-time 
0ab0: 6f 70 74 69 6f 6e 20 69 73 20 64 65 73 69 67 6e  option is design
0ac0: 65 64 20 74 6f 20 66 6f 72 63 65 0a 20 20 2a 2a  ed to force.  **
0ad0: 20 6d 6f 72 65 20 66 72 65 71 75 65 6e 74 20 72   more frequent r
0ae0: 65 61 6c 6c 6f 63 73 20 61 6e 64 20 68 65 6e 63  eallocs and henc
0af0: 65 20 70 72 6f 76 69 64 65 20 6d 6f 72 65 20 6f  e provide more o
0b00: 70 70 6f 72 74 75 6e 69 74 69 65 73 20 66 6f 72  pportunities for
0b10: 20 0a 20 20 2a 2a 20 73 69 6d 75 6c 61 74 65 64   .  ** simulated
0b20: 20 4f 4f 4d 20 66 61 75 6c 74 73 2e 20 20 53 51   OOM faults.  SQ
0b30: 4c 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f  LITE_TEST_REALLO
0b40: 43 5f 53 54 52 45 53 53 20 69 73 20 67 65 6e 65  C_STRESS is gene
0b50: 72 61 6c 6c 79 20 75 73 65 64 0a 20 20 2a 2a 20  rally used.  ** 
0b60: 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67 20 6f  during testing o
0b70: 6e 6c 79 2e 20 20 57 69 74 68 20 53 51 4c 49 54  nly.  With SQLIT
0b80: 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53  E_TEST_REALLOC_S
0b90: 54 52 45 53 53 20 67 72 6f 77 20 74 68 65 20 6f  TRESS grow the o
0ba0: 70 20 61 72 72 61 79 0a 20 20 2a 2a 20 62 79 20  p array.  ** by 
0bb0: 74 68 65 20 6d 69 6e 69 6d 75 6d 2a 20 61 6d 6f  the minimum* amo
0bc0: 75 6e 74 20 72 65 71 75 69 72 65 64 20 75 6e 74  unt required unt
0bd0: 69 6c 20 74 68 65 20 73 69 7a 65 20 72 65 61 63  il the size reac
0be0: 68 65 73 20 35 31 32 2e 20 20 4e 6f 72 6d 61 6c  hes 512.  Normal
0bf0: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
0c00: 28 77 69 74 68 6f 75 74 20 53 51 4c 49 54 45 5f  (without SQLITE_
0c10: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
0c20: 45 53 53 29 20 69 73 20 74 6f 20 64 6f 75 62 6c  ESS) is to doubl
0c30: 65 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 20  e the current.  
0c40: 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6f  ** size of the o
0c50: 70 20 61 72 72 61 79 20 6f 72 20 61 64 64 20 31  p array or add 1
0c60: 4b 42 20 6f 66 20 73 70 61 63 65 2c 20 77 68 69  KB of space, whi
0c70: 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65  chever is smalle
0c80: 72 2e 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  r. */.#ifdef SQL
0c90: 49 54 45 5f 54 45 53 54 5f 52 45 41 4c 4c 4f 43  ITE_TEST_REALLOC
0ca0: 5f 53 54 52 45 53 53 0a 20 20 69 6e 74 20 6e 4e  _STRESS.  int nN
0cb0: 65 77 20 3d 20 28 70 2d 3e 6e 4f 70 41 6c 6c 6f  ew = (p->nOpAllo
0cc0: 63 3e 3d 35 31 32 20 3f 20 70 2d 3e 6e 4f 70 41  c>=512 ? p->nOpA
0cd0: 6c 6c 6f 63 2a 32 20 3a 20 70 2d 3e 6e 4f 70 41  lloc*2 : p->nOpA
0ce0: 6c 6c 6f 63 2b 6e 4f 70 29 3b 0a 23 65 6c 73 65  lloc+nOp);.#else
0cf0: 0a 20 20 69 6e 74 20 6e 4e 65 77 20 3d 20 28 70  .  int nNew = (p
0d00: 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3f 20 70 2d 3e  ->nOpAlloc ? p->
0d10: 6e 4f 70 41 6c 6c 6f 63 2a 32 20 3a 20 28 69 6e  nOpAlloc*2 : (in
0d20: 74 29 28 31 30 32 34 2f 73 69 7a 65 6f 66 28 4f  t)(1024/sizeof(O
0d30: 70 29 29 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  p)));.  UNUSED_P
0d40: 41 52 41 4d 45 54 45 52 28 6e 4f 70 29 3b 0a 23  ARAMETER(nOp);.#
0d50: 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
0d60: 20 6e 4f 70 3c 3d 28 31 30 32 34 2f 73 69 7a 65   nOp<=(1024/size
0d70: 6f 66 28 4f 70 29 29 20 29 3b 0a 20 20 61 73 73  of(Op)) );.  ass
0d80: 65 72 74 28 20 6e 4e 65 77 3e 3d 28 70 2d 3e 6e  ert( nNew>=(p->n
0d90: 4f 70 41 6c 6c 6f 63 2b 6e 4f 70 29 20 29 3b 0a  OpAlloc+nOp) );.
0da0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33    pNew = sqlite3
0db0: 44 62 52 65 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c  DbRealloc(p->db,
0dc0: 20 76 2d 3e 61 4f 70 2c 20 6e 4e 65 77 2a 73 69   v->aOp, nNew*si
0dd0: 7a 65 6f 66 28 4f 70 29 29 3b 0a 20 20 69 66 28  zeof(Op));.  if(
0de0: 20 70 4e 65 77 20 29 7b 0a 20 20 20 20 70 2d 3e   pNew ){.    p->
0df0: 73 7a 4f 70 41 6c 6c 6f 63 20 3d 20 73 71 6c 69  szOpAlloc = sqli
0e00: 74 65 33 44 62 4d 61 6c 6c 6f 63 53 69 7a 65 28  te3DbMallocSize(
0e10: 70 2d 3e 64 62 2c 20 70 4e 65 77 29 3b 0a 20 20  p->db, pNew);.  
0e20: 20 20 70 2d 3e 6e 4f 70 41 6c 6c 6f 63 20 3d 20    p->nOpAlloc = 
0e30: 70 2d 3e 73 7a 4f 70 41 6c 6c 6f 63 2f 73 69 7a  p->szOpAlloc/siz
0e40: 65 6f 66 28 4f 70 29 3b 0a 20 20 20 20 76 2d 3e  eof(Op);.    v->
0e50: 61 4f 70 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 0a  aOp = pNew;.  }.
0e60: 20 20 72 65 74 75 72 6e 20 28 70 4e 65 77 20 3f    return (pNew ?
0e70: 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
0e80: 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 29 3b  ITE_NOMEM_BKPT);
0e90: 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
0ea0: 45 5f 44 45 42 55 47 0a 2f 2a 20 54 68 69 73 20  E_DEBUG./* This 
0eb0: 72 6f 75 74 69 6e 65 20 69 73 20 6a 75 73 74 20  routine is just 
0ec0: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
0ed0: 63 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61  ce to set a brea
0ee0: 6b 70 6f 69 6e 74 20 74 68 61 74 20 77 69 6c 6c  kpoint that will
0ef0: 0a 2a 2a 20 66 69 72 65 20 61 66 74 65 72 20 65  .** fire after e
0f00: 61 63 68 20 6f 70 63 6f 64 65 20 69 73 20 69 6e  ach opcode is in
0f10: 73 65 72 74 65 64 20 61 6e 64 20 64 69 73 70 6c  serted and displ
0f20: 61 79 65 64 20 75 73 69 6e 67 0a 2a 2a 20 22 50  ayed using.** "P
0f30: 52 41 47 4d 41 20 76 64 62 65 5f 61 64 64 6f 70  RAGMA vdbe_addop
0f40: 74 72 61 63 65 3d 6f 6e 22 2e 0a 2a 2f 0a 73 74  trace=on"..*/.st
0f50: 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 61  atic void test_a
0f60: 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e 74 28  ddop_breakpoint(
0f70: 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20  void){.  static 
0f80: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 6e 2b 2b  int n = 0;.  n++
0f90: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
0fa0: 2a 20 41 64 64 20 61 20 6e 65 77 20 69 6e 73 74  * Add a new inst
0fb0: 72 75 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  ruction to the l
0fc0: 69 73 74 20 6f 66 20 69 6e 73 74 72 75 63 74 69  ist of instructi
0fd0: 6f 6e 73 20 63 75 72 72 65 6e 74 20 69 6e 20 74  ons current in t
0fe0: 68 65 0a 2a 2a 20 56 44 42 45 2e 20 20 52 65 74  he.** VDBE.  Ret
0ff0: 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
1000: 6f 66 20 74 68 65 20 6e 65 77 20 69 6e 73 74 72  of the new instr
1010: 75 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 50 61  uction..**.** Pa
1020: 72 61 6d 65 74 65 72 73 3a 0a 2a 2a 0a 2a 2a 20  rameters:.**.** 
1030: 20 20 20 70 20 20 20 20 20 20 20 20 20 20 20 20     p            
1040: 20 20 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68     Pointer to th
1050: 65 20 56 44 42 45 0a 2a 2a 0a 2a 2a 20 20 20 20  e VDBE.**.**    
1060: 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  op              
1070: 54 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 74  The opcode for t
1080: 68 69 73 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  his instruction.
1090: 2a 2a 0a 2a 2a 20 20 20 20 70 31 2c 20 70 32 2c  **.**    p1, p2,
10a0: 20 70 33 20 20 20 20 20 20 4f 70 65 72 61 6e 64   p3      Operand
10b0: 73 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  s.**.** Use the 
10c0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
10d0: 76 65 4c 61 62 65 6c 28 29 20 66 75 6e 63 74 69  veLabel() functi
10e0: 6f 6e 20 74 6f 20 66 69 78 20 61 6e 20 61 64 64  on to fix an add
10f0: 72 65 73 73 20 61 6e 64 0a 2a 2a 20 74 68 65 20  ress and.** the 
1100: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
1110: 65 50 34 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  eP4() function t
1120: 6f 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  o change the val
1130: 75 65 20 6f 66 20 74 68 65 20 50 34 0a 2a 2a 20  ue of the P4.** 
1140: 6f 70 65 72 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  operand..*/.stat
1150: 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1160: 4e 45 20 69 6e 74 20 67 72 6f 77 4f 70 33 28 56  NE int growOp3(V
1170: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1180: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 2c 20  int p1, int p2, 
1190: 69 6e 74 20 70 33 29 7b 0a 20 20 61 73 73 65 72  int p3){.  asser
11a0: 74 28 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f  t( p->pParse->nO
11b0: 70 41 6c 6c 6f 63 3c 3d 70 2d 3e 6e 4f 70 20 29  pAlloc<=p->nOp )
11c0: 3b 0a 20 20 69 66 28 20 67 72 6f 77 4f 70 41 72  ;.  if( growOpAr
11d0: 72 61 79 28 70 2c 20 31 29 20 29 20 72 65 74 75  ray(p, 1) ) retu
11e0: 72 6e 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 1;.  assert( 
11f0: 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c  p->pParse->nOpAl
1200: 6c 6f 63 3e 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20  loc>p->nOp );.  
1210: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1220: 62 65 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20  beAddOp3(p, op, 
1230: 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a 7d 0a 69  p1, p2, p3);.}.i
1240: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  nt sqlite3VdbeAd
1250: 64 4f 70 33 28 56 64 62 65 20 2a 70 2c 20 69 6e  dOp3(Vdbe *p, in
1260: 74 20 6f 70 2c 20 69 6e 74 20 70 31 2c 20 69 6e  t op, int p1, in
1270: 74 20 70 32 2c 20 69 6e 74 20 70 33 29 7b 0a 20  t p2, int p3){. 
1280: 20 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70   int i;.  VdbeOp
1290: 20 2a 70 4f 70 3b 0a 0a 20 20 69 20 3d 20 70 2d   *pOp;..  i = p-
12a0: 3e 6e 4f 70 3b 0a 20 20 61 73 73 65 72 74 28 20  >nOp;.  assert( 
12b0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
12c0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
12d0: 73 73 65 72 74 28 20 6f 70 3e 3d 30 20 26 26 20  ssert( op>=0 && 
12e0: 6f 70 3c 30 78 66 66 20 29 3b 0a 20 20 69 66 28  op<0xff );.  if(
12f0: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
1300: 6c 6c 6f 63 3c 3d 69 20 29 7b 0a 20 20 20 20 72  lloc<=i ){.    r
1310: 65 74 75 72 6e 20 67 72 6f 77 4f 70 33 28 70 2c  eturn growOp3(p,
1320: 20 6f 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29   op, p1, p2, p3)
1330: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 4f 70 2b 2b  ;.  }.  p->nOp++
1340: 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  ;.  pOp = &p->aO
1350: 70 5b 69 5d 3b 0a 20 20 70 4f 70 2d 3e 6f 70 63  p[i];.  pOp->opc
1360: 6f 64 65 20 3d 20 28 75 38 29 6f 70 3b 0a 20 20  ode = (u8)op;.  
1370: 70 4f 70 2d 3e 70 35 20 3d 20 30 3b 0a 20 20 70  pOp->p5 = 0;.  p
1380: 4f 70 2d 3e 70 31 20 3d 20 70 31 3b 0a 20 20 70  Op->p1 = p1;.  p
1390: 4f 70 2d 3e 70 32 20 3d 20 70 32 3b 0a 20 20 70  Op->p2 = p2;.  p
13a0: 4f 70 2d 3e 70 33 20 3d 20 70 33 3b 0a 20 20 70  Op->p3 = p3;.  p
13b0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
13c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34  pOp->p4type = P4
13d0: 5f 4e 4f 54 55 53 45 44 3b 0a 23 69 66 64 65 66  _NOTUSED;.#ifdef
13e0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45   SQLITE_ENABLE_E
13f0: 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a  XPLAIN_COMMENTS.
1400: 20 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20    pOp->zComment 
1410: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64  = 0;.#endif.#ifd
1420: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1430: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 66 6c 61    if( p->db->fla
1440: 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64 62 65  gs & SQLITE_Vdbe
1450: 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a 20 20  AddopTrace ){.  
1460: 20 20 69 6e 74 20 6a 6a 2c 20 6b 6b 3b 0a 20 20    int jj, kk;.  
1470: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20    Parse *pParse 
1480: 3d 20 70 2d 3e 70 50 61 72 73 65 3b 0a 20 20 20  = p->pParse;.   
1490: 20 66 6f 72 28 6a 6a 3d 6b 6b 3d 30 3b 20 6a 6a   for(jj=kk=0; jj
14a0: 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
14b0: 48 45 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  HE; jj++){.     
14c0: 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
14d0: 65 20 2a 78 20 3d 20 70 50 61 72 73 65 2d 3e 61  e *x = pParse->a
14e0: 43 6f 6c 43 61 63 68 65 20 2b 20 6a 6a 3b 0a 20  ColCache + jj;. 
14f0: 20 20 20 20 20 69 66 28 20 78 2d 3e 69 4c 65 76       if( x->iLev
1500: 65 6c 3e 70 50 61 72 73 65 2d 3e 69 43 61 63 68  el>pParse->iCach
1510: 65 4c 65 76 65 6c 20 7c 7c 20 78 2d 3e 69 52 65  eLevel || x->iRe
1520: 67 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  g==0 ) continue;
1530: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 20  .      printf(" 
1540: 72 5b 25 64 5d 3d 7b 25 64 3a 25 64 7d 22 2c 20  r[%d]={%d:%d}", 
1550: 78 2d 3e 69 52 65 67 2c 20 78 2d 3e 69 54 61 62  x->iReg, x->iTab
1560: 6c 65 2c 20 78 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  le, x->iColumn);
1570: 0a 20 20 20 20 20 20 6b 6b 2b 2b 3b 0a 20 20 20  .      kk++;.   
1580: 20 7d 0a 20 20 20 20 69 66 28 20 6b 6b 20 29 20   }.    if( kk ) 
1590: 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 20  printf("\n");.  
15a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 69    sqlite3VdbePri
15b0: 6e 74 4f 70 28 30 2c 20 69 2c 20 26 70 2d 3e 61  ntOp(0, i, &p->a
15c0: 4f 70 5b 69 5d 29 3b 0a 20 20 20 20 74 65 73 74  Op[i]);.    test
15d0: 5f 61 64 64 6f 70 5f 62 72 65 61 6b 70 6f 69 6e  _addop_breakpoin
15e0: 74 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t();.  }.#endif.
15f0: 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f 46  #ifdef VDBE_PROF
1600: 49 4c 45 0a 20 20 70 4f 70 2d 3e 63 79 63 6c 65  ILE.  pOp->cycle
1610: 73 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 63 6e  s = 0;.  pOp->cn
1620: 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  t = 0;.#endif.#i
1630: 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45  fdef SQLITE_VDBE
1640: 5f 43 4f 56 45 52 41 47 45 0a 20 20 70 4f 70 2d  _COVERAGE.  pOp-
1650: 3e 69 53 72 63 4c 69 6e 65 20 3d 20 30 3b 0a 23  >iSrcLine = 0;.#
1660: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 69  endif.  return i
1670: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  ;.}.int sqlite3V
1680: 64 62 65 41 64 64 4f 70 30 28 56 64 62 65 20 2a  dbeAddOp0(Vdbe *
1690: 70 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20 72 65  p, int op){.  re
16a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
16b0: 41 64 64 4f 70 33 28 70 2c 20 6f 70 2c 20 30 2c  AddOp3(p, op, 0,
16c0: 20 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71   0, 0);.}.int sq
16d0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28  lite3VdbeAddOp1(
16e0: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  Vdbe *p, int op,
16f0: 20 69 6e 74 20 70 31 29 7b 0a 20 20 72 65 74 75   int p1){.  retu
1700: 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 41 64  rn sqlite3VdbeAd
1710: 64 4f 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20  dOp3(p, op, p1, 
1720: 30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  0, 0);.}.int sql
1730: 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 56  ite3VdbeAddOp2(V
1740: 64 62 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c 20  dbe *p, int op, 
1750: 69 6e 74 20 70 31 2c 20 69 6e 74 20 70 32 29 7b  int p1, int p2){
1760: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1770: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1780: 70 2c 20 70 31 2c 20 70 32 2c 20 30 29 3b 0a 7d  p, p1, p2, 0);.}
1790: 0a 0a 2f 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  ../* Generate co
17a0: 64 65 20 66 6f 72 20 61 6e 20 75 6e 63 6f 6e 64  de for an uncond
17b0: 69 74 69 6f 6e 61 6c 20 6a 75 6d 70 20 74 6f 20  itional jump to 
17c0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 44 65 73  instruction iDes
17d0: 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  t.*/.int sqlite3
17e0: 56 64 62 65 47 6f 74 6f 28 56 64 62 65 20 2a 70  VdbeGoto(Vdbe *p
17f0: 2c 20 69 6e 74 20 69 44 65 73 74 29 7b 0a 20 20  , int iDest){.  
1800: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
1810: 62 65 41 64 64 4f 70 33 28 70 2c 20 4f 50 5f 47  beAddOp3(p, OP_G
1820: 6f 74 6f 2c 20 30 2c 20 69 44 65 73 74 2c 20 30  oto, 0, iDest, 0
1830: 29 3b 0a 7d 0a 0a 2f 2a 20 47 65 6e 65 72 61 74  );.}../* Generat
1840: 65 20 63 6f 64 65 20 74 6f 20 63 61 75 73 65 20  e code to cause 
1850: 74 68 65 20 73 74 72 69 6e 67 20 7a 53 74 72 20  the string zStr 
1860: 74 6f 20 62 65 20 6c 6f 61 64 65 64 20 69 6e 74  to be loaded int
1870: 6f 0a 2a 2a 20 72 65 67 69 73 74 65 72 20 69 44  o.** register iD
1880: 65 73 74 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  est.*/.int sqlit
1890: 65 33 56 64 62 65 4c 6f 61 64 53 74 72 69 6e 67  e3VdbeLoadString
18a0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44  (Vdbe *p, int iD
18b0: 65 73 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  est, const char 
18c0: 2a 7a 53 74 72 29 7b 0a 20 20 72 65 74 75 72 6e  *zStr){.  return
18d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
18e0: 70 34 28 70 2c 20 4f 50 5f 53 74 72 69 6e 67 38  p4(p, OP_String8
18f0: 2c 20 30 2c 20 69 44 65 73 74 2c 20 30 2c 20 7a  , 0, iDest, 0, z
1900: 53 74 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str, 0);.}../*.*
1910: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1920: 74 68 61 74 20 69 6e 69 74 69 61 6c 69 7a 65 73  that initializes
1930: 20 6d 75 6c 74 69 70 6c 65 20 72 65 67 69 73 74   multiple regist
1940: 65 72 73 20 74 6f 20 73 74 72 69 6e 67 20 6f 72  ers to string or
1950: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 63 6f 6e 73   integer.** cons
1960: 74 61 6e 74 73 2e 20 20 54 68 65 20 72 65 67 69  tants.  The regi
1970: 73 74 65 72 73 20 62 65 67 69 6e 20 77 69 74 68  sters begin with
1980: 20 69 44 65 73 74 20 61 6e 64 20 69 6e 63 72 65   iDest and incre
1990: 61 73 65 20 63 6f 6e 73 65 63 75 74 69 76 65 6c  ase consecutivel
19a0: 79 2e 0a 2a 2a 20 4f 6e 65 20 72 65 67 69 73 74  y..** One regist
19b0: 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  er is initialize
19c0: 64 20 66 6f 72 20 65 61 63 68 20 63 68 61 72 61  d for each chara
19d0: 63 67 74 65 72 20 69 6e 20 7a 54 79 70 65 73 5b  cgter in zTypes[
19e0: 5d 2e 20 20 46 6f 72 20 65 61 63 68 0a 2a 2a 20  ].  For each.** 
19f0: 22 73 22 20 63 68 61 72 61 63 74 65 72 20 69 6e  "s" character in
1a00: 20 7a 54 79 70 65 73 5b 5d 2c 20 74 68 65 20 72   zTypes[], the r
1a10: 65 67 69 73 74 65 72 20 69 73 20 61 20 73 74 72  egister is a str
1a20: 69 6e 67 20 69 66 20 74 68 65 20 61 72 67 75 6d  ing if the argum
1a30: 65 6e 74 20 69 73 0a 2a 2a 20 6e 6f 74 20 4e 55  ent is.** not NU
1a40: 4c 4c 2c 20 6f 72 20 4f 50 5f 4e 75 6c 6c 20 69  LL, or OP_Null i
1a50: 66 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 61  f the value is a
1a60: 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 2e 20 20   null pointer.  
1a70: 46 6f 72 20 65 61 63 68 20 22 69 22 20 63 68 61  For each "i" cha
1a80: 72 61 63 74 65 72 0a 2a 2a 20 69 6e 20 7a 54 79  racter.** in zTy
1a90: 70 65 73 5b 5d 2c 20 74 68 65 20 72 65 67 69 73  pes[], the regis
1aa0: 74 65 72 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ter is initializ
1ab0: 65 64 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  ed to an integer
1ac0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1ad0: 33 56 64 62 65 4d 75 6c 74 69 4c 6f 61 64 28 56  3VdbeMultiLoad(V
1ae0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 69 44 65 73  dbe *p, int iDes
1af0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
1b00: 54 79 70 65 73 2c 20 2e 2e 2e 29 7b 0a 20 20 76  Types, ...){.  v
1b10: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
1b20: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
1b30: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 54 79  va_start(ap, zTy
1b40: 70 65 73 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  pes);.  for(i=0;
1b50: 20 28 63 20 3d 20 7a 54 79 70 65 73 5b 69 5d 29   (c = zTypes[i])
1b60: 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  !=0; i++){.    i
1b70: 66 28 20 63 3d 3d 27 73 27 20 29 7b 0a 20 20 20  f( c=='s' ){.   
1b80: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1b90: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
1ba0: 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
1bb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1bc0: 4f 70 34 28 70 2c 20 7a 3d 3d 30 20 3f 20 4f 50  Op4(p, z==0 ? OP
1bd0: 5f 4e 75 6c 6c 20 3a 20 4f 50 5f 53 74 72 69 6e  _Null : OP_Strin
1be0: 67 38 2c 20 30 2c 20 69 44 65 73 74 2b 2b 2c 20  g8, 0, iDest++, 
1bf0: 30 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 65  0, z, 0);.    }e
1c00: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1c10: 74 28 20 63 3d 3d 27 69 27 20 29 3b 0a 20 20 20  t( c=='i' );.   
1c20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
1c30: 64 4f 70 32 28 70 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(p, OP_Integ
1c40: 65 72 2c 20 76 61 5f 61 72 67 28 61 70 2c 20 69  er, va_arg(ap, i
1c50: 6e 74 29 2c 20 69 44 65 73 74 2b 2b 29 3b 0a 20  nt), iDest++);. 
1c60: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
1c70: 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  d(ap);.}../*.** 
1c80: 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74 68  Add an opcode th
1c90: 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  at includes the 
1ca0: 70 34 20 76 61 6c 75 65 20 61 73 20 61 20 70 6f  p4 value as a po
1cb0: 69 6e 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inter..*/.int sq
1cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
1cd0: 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20  .  Vdbe *p,     
1ce0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
1cf0: 65 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73  e opcode to this
1d00: 20 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c   VM */.  int op,
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d20: 54 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a  The new opcode *
1d30: 2f 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20  /.  int p1,     
1d40: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
1d50: 31 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  1 operand */.  i
1d60: 6e 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20  nt p2,          
1d70: 20 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65     /* The P2 ope
1d80: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33  rand */.  int p3
1d90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
1da0: 20 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20   The P3 operand 
1db0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1dc0: 2a 7a 50 34 2c 20 20 20 20 2f 2a 20 54 68 65 20  *zP4,    /* The 
1dd0: 50 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  P4 operand */.  
1de0: 69 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20  int p4type      
1df0: 20 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e      /* P4 operan
1e00: 64 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 69  d type */.){.  i
1e10: 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65  nt addr = sqlite
1e20: 33 56 64 62 65 41 64 64 4f 70 33 28 70 2c 20 6f  3VdbeAddOp3(p, o
1e30: 70 2c 20 70 31 2c 20 70 32 2c 20 70 33 29 3b 0a  p, p1, p2, p3);.
1e40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
1e50: 6e 67 65 50 34 28 70 2c 20 61 64 64 72 2c 20 7a  ngeP4(p, addr, z
1e60: 50 34 2c 20 70 34 74 79 70 65 29 3b 0a 20 20 72  P4, p4type);.  r
1e70: 65 74 75 72 6e 20 61 64 64 72 3b 0a 7d 0a 0a 2f  eturn addr;.}../
1e80: 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 6f 70 63 6f  *.** Add an opco
1e90: 64 65 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  de that includes
1ea0: 20 74 68 65 20 70 34 20 76 61 6c 75 65 20 77 69   the p4 value wi
1eb0: 74 68 20 61 20 50 34 5f 49 4e 54 36 34 20 6f 72  th a P4_INT64 or
1ec0: 0a 2a 2a 20 50 34 5f 52 45 41 4c 20 74 79 70 65  .** P4_REAL type
1ed0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1ee0: 56 64 62 65 41 64 64 4f 70 34 44 75 70 38 28 0a  VdbeAddOp4Dup8(.
1ef0: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
1f00: 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65        /* Add the
1f10: 20 6f 70 63 6f 64 65 20 74 6f 20 74 68 69 73 20   opcode to this 
1f20: 56 4d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20  VM */.  int op, 
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f40: 68 65 20 6e 65 77 20 6f 70 63 6f 64 65 20 2a 2f  he new opcode */
1f50: 0a 20 20 69 6e 74 20 70 31 2c 20 20 20 20 20 20  .  int p1,      
1f60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50 31         /* The P1
1f70: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1f80: 74 20 70 32 2c 20 20 20 20 20 20 20 20 20 20 20  t p2,           
1f90: 20 20 2f 2a 20 54 68 65 20 50 32 20 6f 70 65 72    /* The P2 oper
1fa0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 33 2c  and */.  int p3,
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1fc0: 54 68 65 20 50 33 20 6f 70 65 72 61 6e 64 20 2a  The P3 operand *
1fd0: 2f 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 7a 50  /.  const u8 *zP
1fe0: 34 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50  4,      /* The P
1ff0: 34 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  4 operand */.  i
2000: 6e 74 20 70 34 74 79 70 65 20 20 20 20 20 20 20  nt p4type       
2010: 20 20 20 2f 2a 20 50 34 20 6f 70 65 72 61 6e 64     /* P4 operand
2020: 20 74 79 70 65 20 2a 2f 0a 29 7b 0a 20 20 63 68   type */.){.  ch
2030: 61 72 20 2a 70 34 63 6f 70 79 20 3d 20 73 71 6c  ar *p4copy = sql
2040: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 4e  ite3DbMallocRawN
2050: 4e 28 73 71 6c 69 74 65 33 56 64 62 65 44 62 28  N(sqlite3VdbeDb(
2060: 70 29 2c 20 38 29 3b 0a 20 20 69 66 28 20 70 34  p), 8);.  if( p4
2070: 63 6f 70 79 20 29 20 6d 65 6d 63 70 79 28 70 34  copy ) memcpy(p4
2080: 63 6f 70 79 2c 20 7a 50 34 2c 20 38 29 3b 0a 20  copy, zP4, 8);. 
2090: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56   return sqlite3V
20a0: 64 62 65 41 64 64 4f 70 34 28 70 2c 20 6f 70 2c  dbeAddOp4(p, op,
20b0: 20 70 31 2c 20 70 32 2c 20 70 33 2c 20 70 34 63   p1, p2, p3, p4c
20c0: 6f 70 79 2c 20 70 34 74 79 70 65 29 3b 0a 7d 0a  opy, p4type);.}.
20d0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 4f 50  ./*.** Add an OP
20e0: 5f 50 61 72 73 65 53 63 68 65 6d 61 20 6f 70 63  _ParseSchema opc
20f0: 6f 64 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ode.  This routi
2100: 6e 65 20 69 73 20 62 72 6f 6b 65 6e 20 6f 75 74  ne is broken out
2110: 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65 33   from.** sqlite3
2120: 56 64 62 65 41 64 64 4f 70 34 28 29 20 73 69 6e  VdbeAddOp4() sin
2130: 63 65 20 69 74 20 6e 65 65 64 73 20 74 6f 20 61  ce it needs to a
2140: 6c 73 6f 20 6e 65 65 64 73 20 74 6f 20 6d 61 72  lso needs to mar
2150: 6b 20 61 6c 6c 20 62 74 72 65 65 73 0a 2a 2a 20  k all btrees.** 
2160: 61 73 20 68 61 76 69 6e 67 20 62 65 65 6e 20 75  as having been u
2170: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  sed..**.** The z
2180: 57 68 65 72 65 20 73 74 72 69 6e 67 20 6d 75 73  Where string mus
2190: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 62 74 61  t have been obta
21a0: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
21b0: 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 54  3_malloc()..** T
21c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
21d0: 20 74 61 6b 65 20 6f 77 6e 65 72 73 68 69 70 20   take ownership 
21e0: 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64  of the allocated
21f0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 76 6f 69 64   memory..*/.void
2200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 50   sqlite3VdbeAddP
2210: 61 72 73 65 53 63 68 65 6d 61 4f 70 28 56 64 62  arseSchemaOp(Vdb
2220: 65 20 2a 70 2c 20 69 6e 74 20 69 44 62 2c 20 63  e *p, int iDb, c
2230: 68 61 72 20 2a 7a 57 68 65 72 65 29 7b 0a 20 20  har *zWhere){.  
2240: 69 6e 74 20 6a 3b 0a 20 20 73 71 6c 69 74 65 33  int j;.  sqlite3
2250: 56 64 62 65 41 64 64 4f 70 34 28 70 2c 20 4f 50  VdbeAddOp4(p, OP
2260: 5f 50 61 72 73 65 53 63 68 65 6d 61 2c 20 69 44  _ParseSchema, iD
2270: 62 2c 20 30 2c 20 30 2c 20 7a 57 68 65 72 65 2c  b, 0, 0, zWhere,
2280: 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a 20 20   P4_DYNAMIC);.  
2290: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d 3e 64 62  for(j=0; j<p->db
22a0: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 20 73 71 6c 69  ->nDb; j++) sqli
22b0: 74 65 33 56 64 62 65 55 73 65 73 42 74 72 65 65  te3VdbeUsesBtree
22c0: 28 70 2c 20 6a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, j);.}../*.**
22d0: 20 41 64 64 20 61 6e 20 6f 70 63 6f 64 65 20 74   Add an opcode t
22e0: 68 61 74 20 69 6e 63 6c 75 64 65 73 20 74 68 65  hat includes the
22f0: 20 70 34 20 76 61 6c 75 65 20 61 73 20 61 6e 20   p4 value as an 
2300: 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20  integer..*/.int 
2310: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
2320: 34 49 6e 74 28 0a 20 20 56 64 62 65 20 2a 70 2c  4Int(.  Vdbe *p,
2330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2340: 64 64 20 74 68 65 20 6f 70 63 6f 64 65 20 74 6f  dd the opcode to
2350: 20 74 68 69 73 20 56 4d 20 2a 2f 0a 20 20 69 6e   this VM */.  in
2360: 74 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20  t op,           
2370: 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 6f 70 63    /* The new opc
2380: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 70 31 2c  ode */.  int p1,
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a0: 54 68 65 20 50 31 20 6f 70 65 72 61 6e 64 20 2a  The P1 operand *
23b0: 2f 0a 20 20 69 6e 74 20 70 32 2c 20 20 20 20 20  /.  int p2,     
23c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 50          /* The P
23d0: 32 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69  2 operand */.  i
23e0: 6e 74 20 70 33 2c 20 20 20 20 20 20 20 20 20 20  nt p3,          
23f0: 20 20 20 2f 2a 20 54 68 65 20 50 33 20 6f 70 65     /* The P3 ope
2400: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 70 34  rand */.  int p4
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2420: 20 54 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20   The P4 operand 
2430: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 2a 2f  as an integer */
2440: 0a 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 20 3d  .){.  int addr =
2450: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
2460: 70 33 28 70 2c 20 6f 70 2c 20 70 31 2c 20 70 32  p3(p, op, p1, p2
2470: 2c 20 70 33 29 3b 0a 20 20 73 71 6c 69 74 65 33  , p3);.  sqlite3
2480: 56 64 62 65 43 68 61 6e 67 65 50 34 28 70 2c 20  VdbeChangeP4(p, 
2490: 61 64 64 72 2c 20 53 51 4c 49 54 45 5f 49 4e 54  addr, SQLITE_INT
24a0: 5f 54 4f 5f 50 54 52 28 70 34 29 2c 20 50 34 5f  _TO_PTR(p4), P4_
24b0: 49 4e 54 33 32 29 3b 0a 20 20 72 65 74 75 72 6e  INT32);.  return
24c0: 20 61 64 64 72 3b 0a 7d 0a 0a 2f 2a 20 49 6e 73   addr;.}../* Ins
24d0: 65 72 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61  ert the end of a
24e0: 20 63 6f 2d 72 6f 75 74 69 6e 65 0a 2a 2f 0a 76   co-routine.*/.v
24f0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45  oid sqlite3VdbeE
2500: 6e 64 43 6f 72 6f 75 74 69 6e 65 28 56 64 62 65  ndCoroutine(Vdbe
2510: 20 2a 76 2c 20 69 6e 74 20 72 65 67 59 69 65 6c   *v, int regYiel
2520: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  d){.  sqlite3Vdb
2530: 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 45 6e  eAddOp1(v, OP_En
2540: 64 43 6f 72 6f 75 74 69 6e 65 2c 20 72 65 67 59  dCoroutine, regY
2550: 69 65 6c 64 29 3b 0a 0a 20 20 2f 2a 20 43 6c 65  ield);..  /* Cle
2560: 61 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  ar the temporary
2570: 20 72 65 67 69 73 74 65 72 20 63 61 63 68 65 2c   register cache,
2580: 20 74 68 65 72 65 62 79 20 65 6e 73 75 72 69 6e   thereby ensurin
2590: 67 20 74 68 61 74 20 65 61 63 68 0a 20 20 2a 2a  g that each.  **
25a0: 20 63 6f 2d 72 6f 75 74 69 6e 65 20 68 61 73 20   co-routine has 
25b0: 69 74 73 20 6f 77 6e 20 69 6e 64 65 70 65 6e 64  its own independ
25c0: 65 6e 74 20 73 65 74 20 6f 66 20 72 65 67 69 73  ent set of regis
25d0: 74 65 72 73 2c 20 62 65 63 61 75 73 65 20 63 6f  ters, because co
25e0: 2d 72 6f 75 74 69 6e 65 73 0a 20 20 2a 2a 20 6d  -routines.  ** m
25f0: 69 67 68 74 20 65 78 70 65 63 74 20 74 68 65 69  ight expect thei
2600: 72 20 72 65 67 69 73 74 65 72 73 20 74 6f 20 62  r registers to b
2610: 65 20 70 72 65 73 65 72 76 65 64 20 61 63 72 6f  e preserved acro
2620: 73 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 2c 20  ss an OP_Yield, 
2630: 61 6e 64 0a 20 20 2a 2a 20 74 68 61 74 20 63 6f  and.  ** that co
2640: 75 6c 64 20 63 61 75 73 65 20 70 72 6f 62 6c 65  uld cause proble
2650: 6d 73 20 69 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ms if two or mor
2660: 65 20 63 6f 2d 72 6f 75 74 69 6e 65 73 20 61 72  e co-routines ar
2670: 65 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  e using the same
2680: 0a 20 20 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  .  ** temporary 
2690: 72 65 67 69 73 74 65 72 2e 0a 20 20 2a 2f 0a 20  register..  */. 
26a0: 20 76 2d 3e 70 50 61 72 73 65 2d 3e 6e 54 65 6d   v->pParse->nTem
26b0: 70 52 65 67 20 3d 20 30 3b 0a 20 20 76 2d 3e 70  pReg = 0;.  v->p
26c0: 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67  Parse->nRangeReg
26d0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
26e0: 72 65 61 74 65 20 61 20 6e 65 77 20 73 79 6d 62  reate a new symb
26f0: 6f 6c 69 63 20 6c 61 62 65 6c 20 66 6f 72 20 61  olic label for a
2700: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
2710: 61 74 20 68 61 73 20 79 65 74 20 74 6f 20 62 65  at has yet to be
2720: 0a 2a 2a 20 63 6f 64 65 64 2e 20 20 54 68 65 20  .** coded.  The 
2730: 73 79 6d 62 6f 6c 69 63 20 6c 61 62 65 6c 20 69  symbolic label i
2740: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 61 20  s really just a 
2750: 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
2760: 20 20 54 68 65 0a 2a 2a 20 6c 61 62 65 6c 20 63    The.** label c
2770: 61 6e 20 62 65 20 75 73 65 64 20 61 73 20 74 68  an be used as th
2780: 65 20 50 32 20 76 61 6c 75 65 20 6f 66 20 61 6e  e P2 value of an
2790: 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4c 61 74   operation.  Lat
27a0: 65 72 2c 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  er, when.** the 
27b0: 6c 61 62 65 6c 20 69 73 20 72 65 73 6f 6c 76 65  label is resolve
27c0: 64 20 74 6f 20 61 20 73 70 65 63 69 66 69 63 20  d to a specific 
27d0: 61 64 64 72 65 73 73 2c 20 74 68 65 20 56 44 42  address, the VDB
27e0: 45 20 77 69 6c 6c 20 73 63 61 6e 0a 2a 2a 20 74  E will scan.** t
27f0: 68 72 6f 75 67 68 20 69 74 73 20 6f 70 65 72 61  hrough its opera
2800: 74 69 6f 6e 20 6c 69 73 74 20 61 6e 64 20 63 68  tion list and ch
2810: 61 6e 67 65 20 61 6c 6c 20 76 61 6c 75 65 73 20  ange all values 
2820: 6f 66 20 50 32 20 77 68 69 63 68 20 6d 61 74 63  of P2 which matc
2830: 68 0a 2a 2a 20 74 68 65 20 6c 61 62 65 6c 20 69  h.** the label i
2840: 6e 74 6f 20 74 68 65 20 72 65 73 6f 6c 76 65 64  nto the resolved
2850: 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20   address..**.** 
2860: 54 68 65 20 56 44 42 45 20 6b 6e 6f 77 73 20 74  The VDBE knows t
2870: 68 61 74 20 61 20 50 32 20 76 61 6c 75 65 20 69  hat a P2 value i
2880: 73 20 61 20 6c 61 62 65 6c 20 62 65 63 61 75 73  s a label becaus
2890: 65 20 6c 61 62 65 6c 73 20 61 72 65 0a 2a 2a 20  e labels are.** 
28a0: 61 6c 77 61 79 73 20 6e 65 67 61 74 69 76 65 20  always negative 
28b0: 61 6e 64 20 50 32 20 76 61 6c 75 65 73 20 61 72  and P2 values ar
28c0: 65 20 73 75 70 70 6f 73 65 20 74 6f 20 62 65 20  e suppose to be 
28d0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2e 0a 2a 2a  non-negative..**
28e0: 20 48 65 6e 63 65 2c 20 61 20 6e 65 67 61 74 69   Hence, a negati
28f0: 76 65 20 50 32 20 76 61 6c 75 65 20 69 73 20 61  ve P2 value is a
2900: 20 6c 61 62 65 6c 20 74 68 61 74 20 68 61 73 20   label that has 
2910: 79 65 74 20 74 6f 20 62 65 20 72 65 73 6f 6c 76  yet to be resolv
2920: 65 64 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ed..**.** Zero i
2930: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 61 20  s returned if a 
2940: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 2e 0a  malloc() fails..
2950: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
2960: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 56 64 62 65  beMakeLabel(Vdbe
2970: 20 2a 76 29 7b 0a 20 20 50 61 72 73 65 20 2a 70   *v){.  Parse *p
2980: 20 3d 20 76 2d 3e 70 50 61 72 73 65 3b 0a 20 20   = v->pParse;.  
2990: 69 6e 74 20 69 20 3d 20 70 2d 3e 6e 4c 61 62 65  int i = p->nLabe
29a0: 6c 2b 2b 3b 0a 20 20 61 73 73 65 72 74 28 20 76  l++;.  assert( v
29b0: 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
29c0: 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66  GIC_INIT );.  if
29d0: 28 20 28 69 20 26 20 28 69 2d 31 29 29 3d 3d 30  ( (i & (i-1))==0
29e0: 20 29 7b 0a 20 20 20 20 70 2d 3e 61 4c 61 62 65   ){.    p->aLabe
29f0: 6c 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  l = sqlite3DbRea
2a00: 6c 6c 6f 63 4f 72 46 72 65 65 28 70 2d 3e 64 62  llocOrFree(p->db
2a10: 2c 20 70 2d 3e 61 4c 61 62 65 6c 2c 20 0a 20 20  , p->aLabel, .  
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 28 69 2a 32 2b 31 29 2a 73 69 7a       (i*2+1)*siz
2a50: 65 6f 66 28 70 2d 3e 61 4c 61 62 65 6c 5b 30 5d  eof(p->aLabel[0]
2a60: 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  ));.  }.  if( p-
2a70: 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20 70  >aLabel ){.    p
2a80: 2d 3e 61 4c 61 62 65 6c 5b 69 5d 20 3d 20 2d 31  ->aLabel[i] = -1
2a90: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 41  ;.  }.  return A
2aa0: 44 44 52 28 69 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  DDR(i);.}../*.**
2ab0: 20 52 65 73 6f 6c 76 65 20 6c 61 62 65 6c 20 22   Resolve label "
2ac0: 78 22 20 74 6f 20 62 65 20 74 68 65 20 61 64 64  x" to be the add
2ad0: 72 65 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74  ress of the next
2ae0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 0a   instruction to.
2af0: 2a 2a 20 62 65 20 69 6e 73 65 72 74 65 64 2e 20  ** be inserted. 
2b00: 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 22   The parameter "
2b10: 78 22 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  x" must have bee
2b20: 6e 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  n obtained from.
2b30: 2a 2a 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  ** a prior call 
2b40: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61  to sqlite3VdbeMa
2b50: 6b 65 4c 61 62 65 6c 28 29 2e 0a 2a 2f 0a 76 6f  keLabel()..*/.vo
2b60: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  id sqlite3VdbeRe
2b70: 73 6f 6c 76 65 4c 61 62 65 6c 28 56 64 62 65 20  solveLabel(Vdbe 
2b80: 2a 76 2c 20 69 6e 74 20 78 29 7b 0a 20 20 50 61  *v, int x){.  Pa
2b90: 72 73 65 20 2a 70 20 3d 20 76 2d 3e 70 50 61 72  rse *p = v->pPar
2ba0: 73 65 3b 0a 20 20 69 6e 74 20 6a 20 3d 20 41 44  se;.  int j = AD
2bb0: 44 52 28 78 29 3b 0a 20 20 61 73 73 65 72 74 28  DR(x);.  assert(
2bc0: 20 76 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   v->magic==VDBE_
2bd0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
2be0: 61 73 73 65 72 74 28 20 6a 3c 70 2d 3e 6e 4c 61  assert( j<p->nLa
2bf0: 62 65 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  bel );.  assert(
2c00: 20 6a 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   j>=0 );.  if( p
2c10: 2d 3e 61 4c 61 62 65 6c 20 29 7b 0a 20 20 20 20  ->aLabel ){.    
2c20: 70 2d 3e 61 4c 61 62 65 6c 5b 6a 5d 20 3d 20 76  p->aLabel[j] = v
2c30: 2d 3e 6e 4f 70 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ->nOp;.  }.}../*
2c40: 0a 2a 2a 20 4d 61 72 6b 20 74 68 65 20 56 44 42  .** Mark the VDB
2c50: 45 20 61 73 20 6f 6e 65 20 74 68 61 74 20 63 61  E as one that ca
2c60: 6e 20 6f 6e 6c 79 20 62 65 20 72 75 6e 20 6f 6e  n only be run on
2c70: 65 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  e time..*/.void 
2c80: 73 71 6c 69 74 65 33 56 64 62 65 52 75 6e 4f 6e  sqlite3VdbeRunOn
2c90: 6c 79 4f 6e 63 65 28 56 64 62 65 20 2a 70 29 7b  lyOnce(Vdbe *p){
2ca0: 0a 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63  .  p->runOnlyOnc
2cb0: 65 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e = 1;.}../*.** 
2cc0: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
2cd0: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
2ce0: 6c 79 20 62 65 20 72 75 6e 20 6d 75 6c 74 69 70  ly be run multip
2cf0: 6c 65 20 74 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69  le times..*/.voi
2d00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 75  d sqlite3VdbeReu
2d10: 73 61 62 6c 65 28 56 64 62 65 20 2a 70 29 7b 0a  sable(Vdbe *p){.
2d20: 20 20 70 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65    p->runOnlyOnce
2d30: 20 3d 20 30 3b 0a 7d 0a 0a 23 69 66 64 65 66 20   = 0;.}..#ifdef 
2d40: 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2f 2a 20  SQLITE_DEBUG /* 
2d50: 73 71 6c 69 74 65 33 41 73 73 65 72 74 4d 61 79  sqlite3AssertMay
2d60: 41 62 6f 72 74 28 29 20 6c 6f 67 69 63 20 2a 2f  Abort() logic */
2d70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2d80: 6f 77 69 6e 67 20 74 79 70 65 20 61 6e 64 20 66  owing type and f
2d90: 75 6e 63 74 69 6f 6e 20 61 72 65 20 75 73 65 64  unction are used
2da0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
2db0: 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64 65 73 0a  ugh all opcodes.
2dc0: 2a 2a 20 69 6e 20 61 20 56 64 62 65 20 6d 61 69  ** in a Vdbe mai
2dd0: 6e 20 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 61  n program and ea
2de0: 63 68 20 6f 66 20 74 68 65 20 73 75 62 2d 70 72  ch of the sub-pr
2df0: 6f 67 72 61 6d 73 20 28 74 72 69 67 67 65 72 73  ograms (triggers
2e00: 29 20 69 74 20 6d 61 79 20 0a 2a 2a 20 69 6e 76  ) it may .** inv
2e10: 6f 6b 65 20 64 69 72 65 63 74 6c 79 20 6f 72 20  oke directly or 
2e20: 69 6e 64 69 72 65 63 74 6c 79 2e 20 49 74 20 73  indirectly. It s
2e30: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 61 73  hould be used as
2e40: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
2e50: 20 20 4f 70 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20    Op *pOp;.**   
2e60: 56 64 62 65 4f 70 49 74 65 72 20 73 49 74 65 72  VdbeOpIter sIter
2e70: 3b 0a 2a 2a 0a 2a 2a 20 20 20 6d 65 6d 73 65 74  ;.**.**   memset
2e80: 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a 65  (&sIter, 0, size
2e90: 6f 66 28 73 49 74 65 72 29 29 3b 0a 2a 2a 20 20  of(sIter));.**  
2ea0: 20 73 49 74 65 72 2e 76 20 3d 20 76 3b 20 20 20   sIter.v = v;   
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ec0: 20 20 20 20 20 20 20 20 20 2f 2f 20 76 20 69 73           // v is
2ed0: 20 6f 66 20 74 79 70 65 20 56 64 62 65 2a 20 0a   of type Vdbe* .
2ee0: 2a 2a 20 20 20 77 68 69 6c 65 28 20 28 70 4f 70  **   while( (pOp
2ef0: 20 3d 20 6f 70 49 74 65 72 4e 65 78 74 28 26 73   = opIterNext(&s
2f00: 49 74 65 72 29 29 20 29 7b 0a 2a 2a 20 20 20 20  Iter)) ){.**    
2f10: 20 2f 2f 20 44 6f 20 73 6f 6d 65 74 68 69 6e 67   // Do something
2f20: 20 77 69 74 68 20 70 4f 70 0a 2a 2a 20 20 20 7d   with pOp.**   }
2f30: 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 44 62 46  .**   sqlite3DbF
2f40: 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72  ree(v->db, sIter
2f50: 2e 61 70 53 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a  .apSub);.** .*/.
2f60: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 56  typedef struct V
2f70: 64 62 65 4f 70 49 74 65 72 20 56 64 62 65 4f 70  dbeOpIter VdbeOp
2f80: 49 74 65 72 3b 0a 73 74 72 75 63 74 20 56 64 62  Iter;.struct Vdb
2f90: 65 4f 70 49 74 65 72 20 7b 0a 20 20 56 64 62 65  eOpIter {.  Vdbe
2fa0: 20 2a 76 3b 20 20 20 20 20 20 20 20 20 20 20 20   *v;            
2fb0: 20 20 20 20 20 20 20 2f 2a 20 56 64 62 65 20 74         /* Vdbe t
2fc0: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
2fd0: 68 20 74 68 65 20 6f 70 63 6f 64 65 73 20 6f 66  h the opcodes of
2fe0: 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61 6d   */.  SubProgram
2ff0: 20 2a 2a 61 70 53 75 62 3b 20 20 20 20 20 20 20   **apSub;       
3000: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 75 62   /* Array of sub
3010: 70 72 6f 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e  programs */.  in
3020: 74 20 6e 53 75 62 3b 20 20 20 20 20 20 20 20 20  t nSub;         
3030: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3040: 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e  er of entries in
3050: 20 61 70 53 75 62 20 2a 2f 0a 20 20 69 6e 74 20   apSub */.  int 
3060: 69 41 64 64 72 3b 20 20 20 20 20 20 20 20 20 20  iAddr;          
3070: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
3080: 73 20 6f 66 20 6e 65 78 74 20 69 6e 73 74 72 75  s of next instru
3090: 63 74 69 6f 6e 20 74 6f 20 72 65 74 75 72 6e 20  ction to return 
30a0: 2a 2f 0a 20 20 69 6e 74 20 69 53 75 62 3b 20 20  */.  int iSub;  
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c0: 2f 2a 20 30 20 3d 20 6d 61 69 6e 20 70 72 6f 67  /* 0 = main prog
30d0: 72 61 6d 2c 20 31 20 3d 20 66 69 72 73 74 20 73  ram, 1 = first s
30e0: 75 62 2d 70 72 6f 67 72 61 6d 20 65 74 63 2e 20  ub-program etc. 
30f0: 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 4f 70 20  */.};.static Op 
3100: 2a 6f 70 49 74 65 72 4e 65 78 74 28 56 64 62 65  *opIterNext(Vdbe
3110: 4f 70 49 74 65 72 20 2a 70 29 7b 0a 20 20 56 64  OpIter *p){.  Vd
3120: 62 65 20 2a 76 20 3d 20 70 2d 3e 76 3b 0a 20 20  be *v = p->v;.  
3130: 4f 70 20 2a 70 52 65 74 20 3d 20 30 3b 0a 20 20  Op *pRet = 0;.  
3140: 4f 70 20 2a 61 4f 70 3b 0a 20 20 69 6e 74 20 6e  Op *aOp;.  int n
3150: 4f 70 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 53  Op;..  if( p->iS
3160: 75 62 3c 3d 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a  ub<=p->nSub ){..
3170: 20 20 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3d      if( p->iSub=
3180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 4f 70 20  =0 ){.      aOp 
3190: 3d 20 76 2d 3e 61 4f 70 3b 0a 20 20 20 20 20 20  = v->aOp;.      
31a0: 6e 4f 70 20 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20  nOp = v->nOp;.  
31b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
31c0: 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b 70 2d  Op = p->apSub[p-
31d0: 3e 69 53 75 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20  >iSub-1]->aOp;. 
31e0: 20 20 20 20 20 6e 4f 70 20 3d 20 70 2d 3e 61 70       nOp = p->ap
31f0: 53 75 62 5b 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e  Sub[p->iSub-1]->
3200: 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  nOp;.    }.    a
3210: 73 73 65 72 74 28 20 70 2d 3e 69 41 64 64 72 3c  ssert( p->iAddr<
3220: 6e 4f 70 20 29 3b 0a 0a 20 20 20 20 70 52 65 74  nOp );..    pRet
3230: 20 3d 20 26 61 4f 70 5b 70 2d 3e 69 41 64 64 72   = &aOp[p->iAddr
3240: 5d 3b 0a 20 20 20 20 70 2d 3e 69 41 64 64 72 2b  ];.    p->iAddr+
3250: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 41  +;.    if( p->iA
3260: 64 64 72 3d 3d 6e 4f 70 20 29 7b 0a 20 20 20 20  ddr==nOp ){.    
3270: 20 20 70 2d 3e 69 53 75 62 2b 2b 3b 0a 20 20 20    p->iSub++;.   
3280: 20 20 20 70 2d 3e 69 41 64 64 72 20 3d 20 30 3b     p->iAddr = 0;
3290: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66  .    }.  .    if
32a0: 28 20 70 52 65 74 2d 3e 70 34 74 79 70 65 3d 3d  ( pRet->p4type==
32b0: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
32c0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 79 74 65  .      int nByte
32d0: 20 3d 20 28 70 2d 3e 6e 53 75 62 2b 31 29 2a 73   = (p->nSub+1)*s
32e0: 69 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d  izeof(SubProgram
32f0: 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  *);.      int j;
3300: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3310: 6a 3c 70 2d 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b  j<p->nSub; j++){
3320: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
3330: 61 70 53 75 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e  apSub[j]==pRet->
3340: 70 34 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72  p4.pProgram ) br
3350: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
3360: 20 20 20 69 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75     if( j==p->nSu
3370: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  b ){.        p->
3380: 61 70 53 75 62 20 3d 20 73 71 6c 69 74 65 33 44  apSub = sqlite3D
3390: 62 52 65 61 6c 6c 6f 63 4f 72 46 72 65 65 28 76  bReallocOrFree(v
33a0: 2d 3e 64 62 2c 20 70 2d 3e 61 70 53 75 62 2c 20  ->db, p->apSub, 
33b0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 20 20 20 20  nByte);.        
33c0: 69 66 28 20 21 70 2d 3e 61 70 53 75 62 20 29 7b  if( !p->apSub ){
33d0: 0a 20 20 20 20 20 20 20 20 20 20 70 52 65 74 20  .          pRet 
33e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
33f0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  se{.          p-
3400: 3e 61 70 53 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b  >apSub[p->nSub++
3410: 5d 20 3d 20 70 52 65 74 2d 3e 70 34 2e 70 50 72  ] = pRet->p4.pPr
3420: 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20 20 7d  ogram;.        }
3430: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
3440: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 70 52 65   }..  return pRe
3450: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  t;.}../*.** Chec
3460: 6b 20 69 66 20 74 68 65 20 70 72 6f 67 72 61 6d  k if the program
3470: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
3480: 4d 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  M associated wit
3490: 68 20 70 50 61 72 73 65 20 6d 61 79 0a 2a 2a 20  h pParse may.** 
34a0: 74 68 72 6f 77 20 61 6e 20 41 42 4f 52 54 20 65  throw an ABORT e
34b0: 78 63 65 70 74 69 6f 6e 20 28 63 61 75 73 69 6e  xception (causin
34c0: 67 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  g the statement,
34d0: 20 62 75 74 20 6e 6f 74 20 65 6e 74 69 72 65 20   but not entire 
34e0: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 74  transaction.** t
34f0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
3500: 29 2e 20 54 68 69 73 20 63 6f 6e 64 69 74 69 6f  ). This conditio
3510: 6e 20 69 73 20 74 72 75 65 20 69 66 20 74 68 65  n is true if the
3520: 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 20 6f 72   main program or
3530: 20 61 6e 79 0a 2a 2a 20 73 75 62 2d 70 72 6f 67   any.** sub-prog
3540: 72 61 6d 73 20 63 6f 6e 74 61 69 6e 73 20 61 6e  rams contains an
3550: 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
3560: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f  ng:.**.**   *  O
3570: 50 5f 48 61 6c 74 20 77 69 74 68 20 50 31 3d 53  P_Halt with P1=S
3580: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
3590: 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74   and P2=OE_Abort
35a0: 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61 6c  ..**   *  OP_Hal
35b0: 74 49 66 4e 75 6c 6c 20 77 69 74 68 20 50 31 3d  tIfNull with P1=
35c0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
35d0: 54 20 61 6e 64 20 50 32 3d 4f 45 5f 41 62 6f 72  T and P2=OE_Abor
35e0: 74 2e 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 44 65  t..**   *  OP_De
35f0: 73 74 72 6f 79 0a 2a 2a 20 20 20 2a 20 20 4f 50  stroy.**   *  OP
3600: 5f 56 55 70 64 61 74 65 0a 2a 2a 20 20 20 2a 20  _VUpdate.**   * 
3610: 20 4f 50 5f 56 52 65 6e 61 6d 65 0a 2a 2a 20 20   OP_VRename.**  
3620: 20 2a 20 20 4f 50 5f 46 6b 43 6f 75 6e 74 65 72   *  OP_FkCounter
3630: 20 77 69 74 68 20 50 32 3d 3d 30 20 28 69 6d 6d   with P2==0 (imm
3640: 65 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b  ediate foreign k
3650: 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 29 0a 2a  ey constraint).*
3660: 2a 20 20 20 2a 20 20 4f 50 5f 43 72 65 61 74 65  *   *  OP_Create
3670: 54 61 62 6c 65 20 61 6e 64 20 4f 50 5f 49 6e 69  Table and OP_Ini
3680: 74 43 6f 72 6f 75 74 69 6e 65 20 28 66 6f 72 20  tCoroutine (for 
3690: 43 52 45 41 54 45 20 54 41 42 4c 45 20 41 53 20  CREATE TABLE AS 
36a0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
36b0: 2a 20 54 68 65 6e 20 63 68 65 63 6b 20 74 68 61  * Then check tha
36c0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50  t the value of P
36d0: 61 72 73 65 2e 6d 61 79 41 62 6f 72 74 20 69 73  arse.mayAbort is
36e0: 20 74 72 75 65 20 69 66 20 61 6e 0a 2a 2a 20 41   true if an.** A
36f0: 42 4f 52 54 20 6d 61 79 20 62 65 20 74 68 72 6f  BORT may be thro
3700: 77 6e 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68  wn, or false oth
3710: 65 72 77 69 73 65 2e 20 52 65 74 75 72 6e 20 74  erwise. Return t
3720: 72 75 65 20 69 66 20 69 74 20 64 6f 65 73 0a 2a  rue if it does.*
3730: 2a 20 6d 61 74 63 68 2c 20 6f 72 20 66 61 6c 73  * match, or fals
3740: 65 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 69  e otherwise. Thi
3750: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
3760: 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65  tended to be use
3770: 64 20 61 73 0a 2a 2a 20 70 61 72 74 20 6f 66 20  d as.** part of 
3780: 61 6e 20 61 73 73 65 72 74 20 73 74 61 74 65 6d  an assert statem
3790: 65 6e 74 20 69 6e 20 74 68 65 20 63 6f 6d 70 69  ent in the compi
37a0: 6c 65 72 2e 20 53 69 6d 69 6c 61 72 20 74 6f 3a  ler. Similar to:
37b0: 0a 2a 2a 0a 2a 2a 20 20 20 61 73 73 65 72 74 28  .**.**   assert(
37c0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73 65   sqlite3VdbeAsse
37d0: 72 74 4d 61 79 41 62 6f 72 74 28 70 50 61 72 73  rtMayAbort(pPars
37e0: 65 2d 3e 70 56 64 62 65 2c 20 70 50 61 72 73 65  e->pVdbe, pParse
37f0: 2d 3e 6d 61 79 41 62 6f 72 74 29 20 29 3b 0a 2a  ->mayAbort) );.*
3800: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
3810: 65 41 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28  eAssertMayAbort(
3820: 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 6d 61 79  Vdbe *v, int may
3830: 41 62 6f 72 74 29 7b 0a 20 20 69 6e 74 20 68 61  Abort){.  int ha
3840: 73 41 62 6f 72 74 20 3d 20 30 3b 0a 20 20 69 6e  sAbort = 0;.  in
3850: 74 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d  t hasFkCounter =
3860: 20 30 3b 0a 20 20 69 6e 74 20 68 61 73 43 72 65   0;.  int hasCre
3870: 61 74 65 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  ateTable = 0;.  
3880: 69 6e 74 20 68 61 73 49 6e 69 74 43 6f 72 6f 75  int hasInitCorou
3890: 74 69 6e 65 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  tine = 0;.  Op *
38a0: 70 4f 70 3b 0a 20 20 56 64 62 65 4f 70 49 74 65  pOp;.  VdbeOpIte
38b0: 72 20 73 49 74 65 72 3b 0a 20 20 6d 65 6d 73 65  r sIter;.  memse
38c0: 74 28 26 73 49 74 65 72 2c 20 30 2c 20 73 69 7a  t(&sIter, 0, siz
38d0: 65 6f 66 28 73 49 74 65 72 29 29 3b 0a 20 20 73  eof(sIter));.  s
38e0: 49 74 65 72 2e 76 20 3d 20 76 3b 0a 0a 20 20 77  Iter.v = v;..  w
38f0: 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f 70 49  hile( (pOp = opI
3900: 74 65 72 4e 65 78 74 28 26 73 49 74 65 72 29 29  terNext(&sIter))
3910: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f  !=0 ){.    int o
3920: 70 63 6f 64 65 20 3d 20 70 4f 70 2d 3e 6f 70 63  pcode = pOp->opc
3930: 6f 64 65 3b 0a 20 20 20 20 69 66 28 20 6f 70 63  ode;.    if( opc
3940: 6f 64 65 3d 3d 4f 50 5f 44 65 73 74 72 6f 79 20  ode==OP_Destroy 
3950: 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f 56 55  || opcode==OP_VU
3960: 70 64 61 74 65 20 7c 7c 20 6f 70 63 6f 64 65 3d  pdate || opcode=
3970: 3d 4f 50 5f 56 52 65 6e 61 6d 65 20 0a 20 20 20  =OP_VRename .   
3980: 20 20 7c 7c 20 28 28 6f 70 63 6f 64 65 3d 3d 4f    || ((opcode==O
3990: 50 5f 48 61 6c 74 20 7c 7c 20 6f 70 63 6f 64 65  P_Halt || opcode
39a0: 3d 3d 4f 50 5f 48 61 6c 74 49 66 4e 75 6c 6c 29  ==OP_HaltIfNull)
39b0: 20 0a 20 20 20 20 20 20 26 26 20 28 28 70 4f 70   .      && ((pOp
39c0: 2d 3e 70 31 26 30 78 66 66 29 3d 3d 53 51 4c 49  ->p1&0xff)==SQLI
39d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 26 26  TE_CONSTRAINT &&
39e0: 20 70 4f 70 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f   pOp->p2==OE_Abo
39f0: 72 74 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  rt)).    ){.    
3a00: 20 20 68 61 73 41 62 6f 72 74 20 3d 20 31 3b 0a    hasAbort = 1;.
3a10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3a20: 20 7d 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64   }.    if( opcod
3a30: 65 3d 3d 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  e==OP_CreateTabl
3a40: 65 20 29 20 68 61 73 43 72 65 61 74 65 54 61 62  e ) hasCreateTab
3a50: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  le = 1;.    if( 
3a60: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69 74 43  opcode==OP_InitC
3a70: 6f 72 6f 75 74 69 6e 65 20 29 20 68 61 73 49 6e  oroutine ) hasIn
3a80: 69 74 43 6f 72 6f 75 74 69 6e 65 20 3d 20 31 3b  itCoroutine = 1;
3a90: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
3aa0: 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
3ab0: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3ac0: 3d 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 26 26  =OP_FkCounter &&
3ad0: 20 70 4f 70 2d 3e 70 31 3d 3d 30 20 26 26 20 70   pOp->p1==0 && p
3ae0: 4f 70 2d 3e 70 32 3d 3d 31 20 29 7b 0a 20 20 20  Op->p2==1 ){.   
3af0: 20 20 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 20     hasFkCounter 
3b00: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
3b10: 66 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  f.  }.  sqlite3D
3b20: 62 46 72 65 65 28 76 2d 3e 64 62 2c 20 73 49 74  bFree(v->db, sIt
3b30: 65 72 2e 61 70 53 75 62 29 3b 0a 0a 20 20 2f 2a  er.apSub);..  /*
3b40: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
3b50: 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f  hasAbort==mayAbo
3b60: 72 74 2e 20 4f 72 20 69 66 20 61 20 6d 61 6c 6c  rt. Or if a mall
3b70: 6f 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  oc failure occur
3b80: 72 65 64 2e 0a 20 20 2a 2a 20 49 66 20 6d 61 6c  red..  ** If mal
3b90: 6c 6f 63 20 66 61 69 6c 65 64 2c 20 74 68 65 6e  loc failed, then
3ba0: 20 74 68 65 20 77 68 69 6c 65 28 29 20 6c 6f 6f   the while() loo
3bb0: 70 20 61 62 6f 76 65 20 6d 61 79 20 6e 6f 74 20  p above may not 
3bc0: 68 61 76 65 20 69 74 65 72 61 74 65 64 0a 20 20  have iterated.  
3bd0: 2a 2a 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 6f  ** through all o
3be0: 70 63 6f 64 65 73 20 61 6e 64 20 68 61 73 41 62  pcodes and hasAb
3bf0: 6f 72 74 20 6d 61 79 20 62 65 20 73 65 74 20 69  ort may be set i
3c00: 6e 63 6f 72 72 65 63 74 6c 79 2e 20 52 65 74 75  ncorrectly. Retu
3c10: 72 6e 0a 20 20 2a 2a 20 74 72 75 65 20 66 6f 72  rn.  ** true for
3c20: 20 74 68 69 73 20 63 61 73 65 20 74 6f 20 70 72   this case to pr
3c30: 65 76 65 6e 74 20 74 68 65 20 61 73 73 65 72 74  event the assert
3c40: 28 29 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  () in the caller
3c50: 73 20 66 72 61 6d 65 0a 20 20 2a 2a 20 66 72 6f  s frame.  ** fro
3c60: 6d 20 66 61 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20  m failing.  */. 
3c70: 20 72 65 74 75 72 6e 20 28 20 76 2d 3e 64 62 2d   return ( v->db-
3c80: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c 7c  >mallocFailed ||
3c90: 20 68 61 73 41 62 6f 72 74 3d 3d 6d 61 79 41 62   hasAbort==mayAb
3ca0: 6f 72 74 20 7c 7c 20 68 61 73 46 6b 43 6f 75 6e  ort || hasFkCoun
3cb0: 74 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  ter.            
3cc0: 20 20 7c 7c 20 28 68 61 73 43 72 65 61 74 65 54    || (hasCreateT
3cd0: 61 62 6c 65 20 26 26 20 68 61 73 49 6e 69 74 43  able && hasInitC
3ce0: 6f 72 6f 75 74 69 6e 65 29 20 29 3b 0a 7d 0a 23  oroutine) );.}.#
3cf0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
3d00: 44 45 42 55 47 20 2d 20 74 68 65 20 73 71 6c 69  DEBUG - the sqli
3d10: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
3d20: 74 28 29 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  t() function */.
3d30: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
3d40: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66  ine is called af
3d50: 74 65 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ter all opcodes 
3d60: 68 61 76 65 20 62 65 65 6e 20 69 6e 73 65 72 74  have been insert
3d70: 65 64 2e 20 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a  ed.  It loops.**
3d80: 20 74 68 72 6f 75 67 68 20 61 6c 6c 20 74 68 65   through all the
3d90: 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 66 69 78   opcodes and fix
3da0: 65 73 20 75 70 20 73 6f 6d 65 20 64 65 74 61 69  es up some detai
3db0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f  ls..**.** (1) Fo
3dc0: 72 20 65 61 63 68 20 6a 75 6d 70 20 69 6e 73 74  r each jump inst
3dd0: 72 75 63 74 69 6f 6e 20 77 69 74 68 20 61 20 6e  ruction with a n
3de0: 65 67 61 74 69 76 65 20 50 32 20 76 61 6c 75 65  egative P2 value
3df0: 20 28 61 20 6c 61 62 65 6c 29 0a 2a 2a 20 20 20   (a label).**   
3e00: 20 20 72 65 73 6f 6c 76 65 20 74 68 65 20 50 32    resolve the P2
3e10: 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 61 63 74   value to an act
3e20: 75 61 6c 20 61 64 64 72 65 73 73 2e 0a 2a 2a 0a  ual address..**.
3e30: 2a 2a 20 28 32 29 20 43 6f 6d 70 75 74 65 20 74  ** (2) Compute t
3e40: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
3e50: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75  r of arguments u
3e60: 73 65 64 20 62 79 20 61 6e 79 20 53 51 4c 20 66  sed by any SQL f
3e70: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 61  unction.**     a
3e80: 6e 64 20 73 74 6f 72 65 20 74 68 61 74 20 76 61  nd store that va
3e90: 6c 75 65 20 69 6e 20 2a 70 4d 61 78 46 75 6e 63  lue in *pMaxFunc
3ea0: 41 72 67 73 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20  Args..**.** (3) 
3eb0: 55 70 64 61 74 65 20 74 68 65 20 56 64 62 65 2e  Update the Vdbe.
3ec0: 72 65 61 64 4f 6e 6c 79 20 61 6e 64 20 56 64 62  readOnly and Vdb
3ed0: 65 2e 62 49 73 52 65 61 64 65 72 20 66 6c 61 67  e.bIsReader flag
3ee0: 73 20 74 6f 20 61 63 63 75 72 61 74 65 6c 79 0a  s to accurately.
3ef0: 2a 2a 20 20 20 20 20 69 6e 64 69 63 61 74 65 20  **     indicate 
3f00: 77 68 61 74 20 74 68 65 20 70 72 65 70 61 72 65  what the prepare
3f10: 64 20 73 74 61 74 65 6d 65 6e 74 20 61 63 74 75  d statement actu
3f20: 61 6c 6c 79 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a  ally does..**.**
3f30: 20 28 34 29 20 49 6e 69 74 69 61 6c 69 7a 65 20   (4) Initialize 
3f40: 74 68 65 20 70 34 2e 78 41 64 76 61 6e 63 65 20  the p4.xAdvance 
3f50: 70 6f 69 6e 74 65 72 20 6f 6e 20 6f 70 63 6f 64  pointer on opcod
3f60: 65 73 20 74 68 61 74 20 75 73 65 20 69 74 2e 0a  es that use it..
3f70: 2a 2a 0a 2a 2a 20 28 35 29 20 52 65 63 6c 61 69  **.** (5) Reclai
3f80: 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  m the memory all
3f90: 6f 63 61 74 65 64 20 66 6f 72 20 73 74 6f 72 69  ocated for stori
3fa0: 6e 67 20 6c 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a  ng labels..**.**
3fb0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
3fc0: 6c 6c 20 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e  ll only function
3fd0: 20 63 6f 72 72 65 63 74 6c 79 20 69 66 20 74 68   correctly if th
3fe0: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  e mkopcodeh.tcl 
3ff0: 67 65 6e 65 72 61 74 6f 72 0a 2a 2a 20 73 63 72  generator.** scr
4000: 69 70 74 20 6e 75 6d 62 65 72 73 20 74 68 65 20  ipt numbers the 
4010: 6f 70 63 6f 64 65 73 20 63 6f 72 72 65 63 74 6c  opcodes correctl
4020: 79 2e 20 20 43 68 61 6e 67 65 73 20 74 6f 20 74  y.  Changes to t
4030: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
4040: 20 62 65 0a 2a 2a 20 63 6f 6f 72 64 69 6e 61 74   be.** coordinat
4050: 65 64 20 77 69 74 68 20 63 68 61 6e 67 65 73 20  ed with changes 
4060: 74 6f 20 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c  to mkopcodeh.tcl
4070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
4080: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
4090: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70  (Vdbe *p, int *p
40a0: 4d 61 78 46 75 6e 63 41 72 67 73 29 7b 0a 20 20  MaxFuncArgs){.  
40b0: 69 6e 74 20 6e 4d 61 78 41 72 67 73 20 3d 20 2a  int nMaxArgs = *
40c0: 70 4d 61 78 46 75 6e 63 41 72 67 73 3b 0a 20 20  pMaxFuncArgs;.  
40d0: 4f 70 20 2a 70 4f 70 3b 0a 20 20 50 61 72 73 65  Op *pOp;.  Parse
40e0: 20 2a 70 50 61 72 73 65 20 3d 20 70 2d 3e 70 50   *pParse = p->pP
40f0: 61 72 73 65 3b 0a 20 20 69 6e 74 20 2a 61 4c 61  arse;.  int *aLa
4100: 62 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e 61 4c  bel = pParse->aL
4110: 61 62 65 6c 3b 0a 20 20 70 2d 3e 72 65 61 64 4f  abel;.  p->readO
4120: 6e 6c 79 20 3d 20 31 3b 0a 20 20 70 2d 3e 62 49  nly = 1;.  p->bI
4130: 73 52 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 70  sReader = 0;.  p
4140: 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  Op = &p->aOp[p->
4150: 6e 4f 70 2d 31 5d 3b 0a 20 20 77 68 69 6c 65 28  nOp-1];.  while(
4160: 31 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79  1){..    /* Only
4170: 20 4a 55 4d 50 20 6f 70 63 6f 64 65 73 20 61 6e   JUMP opcodes an
4180: 64 20 74 68 65 20 73 68 6f 72 74 20 6c 69 73 74  d the short list
4190: 20 6f 66 20 73 70 65 63 69 61 6c 20 6f 70 63 6f   of special opco
41a0: 64 65 73 20 69 6e 20 74 68 65 20 73 77 69 74 63  des in the switc
41b0: 68 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 20 6e  h.    ** below n
41c0: 65 65 64 20 74 6f 20 62 65 20 63 6f 6e 73 69 64  eed to be consid
41d0: 65 72 65 64 2e 20 20 54 68 65 20 6d 6b 6f 70 63  ered.  The mkopc
41e0: 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65 72 61 74  odeh.tcl generat
41f0: 6f 72 20 73 63 72 69 70 74 20 67 72 6f 75 70 73  or script groups
4200: 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 74 68 65 73  .    ** all thes
4210: 65 20 6f 70 63 6f 64 65 73 20 74 6f 67 65 74 68  e opcodes togeth
4220: 65 72 20 6e 65 61 72 20 74 68 65 20 66 72 6f 6e  er near the fron
4230: 74 20 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20  t of the opcode 
4240: 6c 69 73 74 2e 20 20 53 6b 69 70 0a 20 20 20 20  list.  Skip.    
4250: 2a 2a 20 61 6e 79 20 6f 70 63 6f 64 65 20 74 68  ** any opcode th
4260: 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
4270: 20 70 72 6f 63 65 73 73 69 6e 67 20 62 79 20 76   processing by v
4280: 69 72 74 75 61 6c 20 6f 66 20 74 68 65 20 66 61  irtual of the fa
4290: 63 74 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  ct that.    ** i
42a0: 74 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  t is larger than
42b0: 20 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f   SQLITE_MX_JUMP_
42c0: 4f 50 43 4f 44 45 2c 20 61 73 20 61 20 70 65 72  OPCODE, as a per
42d0: 66 6f 72 6d 61 6e 63 65 20 6f 70 74 69 6d 69 7a  formance optimiz
42e0: 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
42f0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
4300: 65 3c 3d 53 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d  e<=SQLITE_MX_JUM
4310: 50 5f 4f 50 43 4f 44 45 20 29 7b 0a 20 20 20 20  P_OPCODE ){.    
4320: 20 20 2f 2a 20 4e 4f 54 45 3a 20 42 65 20 73 75    /* NOTE: Be su
4330: 72 65 20 74 6f 20 75 70 64 61 74 65 20 6d 6b 6f  re to update mko
4340: 70 63 6f 64 65 68 2e 74 63 6c 20 77 68 65 6e 20  pcodeh.tcl when 
4350: 61 64 64 69 6e 67 20 6f 72 20 72 65 6d 6f 76 69  adding or removi
4360: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 63 61 73 65  ng.      ** case
4370: 73 20 66 72 6f 6d 20 74 68 69 73 20 73 77 69 74  s from this swit
4380: 63 68 21 20 2a 2f 0a 20 20 20 20 20 20 73 77 69  ch! */.      swi
4390: 74 63 68 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65  tch( pOp->opcode
43a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65   ){.        case
43b0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 3a   OP_Transaction:
43c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
43d0: 20 70 4f 70 2d 3e 70 32 21 3d 30 20 29 20 70 2d   pOp->p2!=0 ) p-
43e0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20  >readOnly = 0;. 
43f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 66 61 6c 6c           /* fall
4400: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 20 20 20   thru */.       
4410: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
4420: 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20  OP_AutoCommit:. 
4430: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
4440: 61 76 65 70 6f 69 6e 74 3a 20 7b 0a 20 20 20 20  avepoint: {.    
4450: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4460: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4480: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4490: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 20 20 20  E_OMIT_WAL.     
44a0: 20 20 20 63 61 73 65 20 4f 50 5f 43 68 65 63 6b     case OP_Check
44b0: 70 6f 69 6e 74 3a 0a 23 65 6e 64 69 66 0a 20 20  point:.#endif.  
44c0: 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56 61        case OP_Va
44d0: 63 75 75 6d 3a 0a 20 20 20 20 20 20 20 20 63 61  cuum:.        ca
44e0: 73 65 20 4f 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64  se OP_JournalMod
44f0: 65 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 70  e: {.          p
4500: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a  ->readOnly = 0;.
4510: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 49 73            p->bIs
4520: 52 65 61 64 65 72 20 3d 20 31 3b 0a 20 20 20 20  Reader = 1;.    
4530: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4540: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
4550: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
4560: 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
4570: 63 61 73 65 20 4f 50 5f 56 55 70 64 61 74 65 3a  case OP_VUpdate:
4580: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   {.          if(
4590: 20 70 4f 70 2d 3e 70 32 3e 6e 4d 61 78 41 72 67   pOp->p2>nMaxArg
45a0: 73 20 29 20 6e 4d 61 78 41 72 67 73 20 3d 20 70  s ) nMaxArgs = p
45b0: 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 20 20 20 20  Op->p2;.        
45c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
45d0: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
45e0: 4f 50 5f 56 46 69 6c 74 65 72 3a 20 7b 0a 20 20  OP_VFilter: {.  
45f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
4600: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
4610: 20 28 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 20   (pOp - p->aOp) 
4620: 3e 3d 20 33 20 29 3b 0a 20 20 20 20 20 20 20 20  >= 3 );.        
4630: 20 20 61 73 73 65 72 74 28 20 70 4f 70 5b 2d 31    assert( pOp[-1
4640: 5d 2e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74  ].opcode==OP_Int
4650: 65 67 65 72 20 29 3b 0a 20 20 20 20 20 20 20 20  eger );.        
4660: 20 20 6e 20 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31    n = pOp[-1].p1
4670: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
4680: 6e 3e 6e 4d 61 78 41 72 67 73 20 29 20 6e 4d 61  n>nMaxArgs ) nMa
4690: 78 41 72 67 73 20 3d 20 6e 3b 0a 20 20 20 20 20  xArgs = n;.     
46a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
46b0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
46c0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e 65 78       case OP_Nex
46d0: 74 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  t:.        case 
46e0: 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 3a 0a 20  OP_NextIfOpen:. 
46f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 53         case OP_S
4700: 6f 72 74 65 72 4e 65 78 74 3a 20 7b 0a 20 20 20  orterNext: {.   
4710: 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78         pOp->p4.x
4720: 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65  Advance = sqlite
4730: 33 42 74 72 65 65 4e 65 78 74 3b 0a 20 20 20 20  3BtreeNext;.    
4740: 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74 79 70        pOp->p4typ
4750: 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45 3b 0a  e = P4_ADVANCE;.
4760: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
4770: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4780: 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65 76 3a     case OP_Prev:
4790: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50  .        case OP
47a0: 5f 50 72 65 76 49 66 4f 70 65 6e 3a 20 7b 0a 20  _PrevIfOpen: {. 
47b0: 20 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34           pOp->p4
47c0: 2e 78 41 64 76 61 6e 63 65 20 3d 20 73 71 6c 69  .xAdvance = sqli
47d0: 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
47e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 70 2d  ;.          pOp-
47f0: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 41 44 56  >p4type = P4_ADV
4800: 41 4e 43 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ANCE;.          
4810: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4820: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
4830: 66 28 20 28 73 71 6c 69 74 65 33 4f 70 63 6f 64  f( (sqlite3Opcod
4840: 65 50 72 6f 70 65 72 74 79 5b 70 4f 70 2d 3e 6f  eProperty[pOp->o
4850: 70 63 6f 64 65 5d 20 26 20 4f 50 46 4c 47 5f 4a  pcode] & OPFLG_J
4860: 55 4d 50 29 21 3d 30 20 26 26 20 70 4f 70 2d 3e  UMP)!=0 && pOp->
4870: 70 32 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p2<0 ){.        
4880: 61 73 73 65 72 74 28 20 41 44 44 52 28 70 4f 70  assert( ADDR(pOp
4890: 2d 3e 70 32 29 3c 70 50 61 72 73 65 2d 3e 6e 4c  ->p2)<pParse->nL
48a0: 61 62 65 6c 20 29 3b 0a 20 20 20 20 20 20 20 20  abel );.        
48b0: 70 4f 70 2d 3e 70 32 20 3d 20 61 4c 61 62 65 6c  pOp->p2 = aLabel
48c0: 5b 41 44 44 52 28 70 4f 70 2d 3e 70 32 29 5d 3b  [ADDR(pOp->p2)];
48d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
48e0: 20 20 20 69 66 28 20 70 4f 70 3d 3d 70 2d 3e 61     if( pOp==p->a
48f0: 4f 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  Op ) break;.    
4900: 70 4f 70 2d 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c  pOp--;.  }.  sql
4910: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64 62  ite3DbFree(p->db
4920: 2c 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  , pParse->aLabel
4930: 29 3b 0a 20 20 70 50 61 72 73 65 2d 3e 61 4c 61  );.  pParse->aLa
4940: 62 65 6c 20 3d 20 30 3b 0a 20 20 70 50 61 72 73  bel = 0;.  pPars
4950: 65 2d 3e 6e 4c 61 62 65 6c 20 3d 20 30 3b 0a 20  e->nLabel = 0;. 
4960: 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73 20 3d   *pMaxFuncArgs =
4970: 20 6e 4d 61 78 41 72 67 73 3b 0a 20 20 61 73 73   nMaxArgs;.  ass
4980: 65 72 74 28 20 70 2d 3e 62 49 73 52 65 61 64 65  ert( p->bIsReade
4990: 72 21 3d 30 20 7c 7c 20 44 62 4d 61 73 6b 41 6c  r!=0 || DbMaskAl
49a0: 6c 5a 65 72 6f 28 70 2d 3e 62 74 72 65 65 4d 61  lZero(p->btreeMa
49b0: 73 6b 29 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sk) );.}../*.** 
49c0: 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65  Return the addre
49d0: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
49e0: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
49f0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e   inserted..*/.in
4a00: 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  t sqlite3VdbeCur
4a10: 72 65 6e 74 41 64 64 72 28 56 64 62 65 20 2a 70  rentAddr(Vdbe *p
4a20: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
4a30: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
4a40: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 72 65 74 75  C_INIT );.  retu
4a50: 72 6e 20 70 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a  rn p->nOp;.}../*
4a60: 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74 20  .** Verify that 
4a70: 61 74 20 6c 65 61 73 74 20 4e 20 6f 70 63 6f 64  at least N opcod
4a80: 65 20 73 6c 6f 74 73 20 61 72 65 20 61 76 61 69  e slots are avai
4a90: 6c 61 62 6c 65 20 69 6e 20 70 20 77 69 74 68 6f  lable in p witho
4aa0: 75 74 0a 2a 2a 20 68 61 76 69 6e 67 20 74 6f 20  ut.** having to 
4ab0: 6d 61 6c 6c 6f 63 20 66 6f 72 20 6d 6f 72 65 20  malloc for more 
4ac0: 73 70 61 63 65 20 28 65 78 63 65 70 74 20 77 68  space (except wh
4ad0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e  en compiled usin
4ae0: 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54  g.** SQLITE_TEST
4af0: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
4b00: 2e 20 20 54 68 69 73 20 69 6e 74 65 72 66 61 63  .  This interfac
4b10: 65 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  e is used during
4b20: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 74 6f 20 76   testing.** to v
4b30: 65 72 69 66 79 20 74 68 61 74 20 63 65 72 74 61  erify that certa
4b40: 69 6e 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  in calls to sqli
4b50: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
4b60: 28 29 20 63 61 6e 20 6e 65 76 65 72 0a 2a 2a 20  () can never.** 
4b70: 66 61 69 6c 20 64 75 65 20 74 6f 20 61 20 4f 4f  fail due to a OO
4b80: 4d 20 66 61 75 6c 74 20 61 6e 64 20 68 65 6e 63  M fault and henc
4b90: 65 20 74 68 61 74 20 74 68 65 20 72 65 74 75 72  e that the retur
4ba0: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  n value from.** 
4bb0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
4bc0: 4c 69 73 74 28 29 20 77 69 6c 6c 20 61 6c 77 61  List() will alwa
4bd0: 79 73 20 62 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a  ys be non-NULL..
4be0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
4bf0: 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
4c00: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
4c10: 54 45 53 54 5f 52 45 41 4c 4c 4f 43 5f 53 54 52  TEST_REALLOC_STR
4c20: 45 53 53 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  ESS).void sqlite
4c30: 33 56 64 62 65 56 65 72 69 66 79 4e 6f 4d 61 6c  3VdbeVerifyNoMal
4c40: 6c 6f 63 52 65 71 75 69 72 65 64 28 56 64 62 65  locRequired(Vdbe
4c50: 20 2a 70 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 61   *p, int N){.  a
4c60: 73 73 65 72 74 28 20 70 2d 3e 6e 4f 70 20 2b 20  ssert( p->nOp + 
4c70: 4e 20 3c 3d 20 70 2d 3e 70 50 61 72 73 65 2d 3e  N <= p->pParse->
4c80: 6e 4f 70 41 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65  nOpAlloc );.}.#e
4c90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
4ca0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4cb0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
4cc0: 68 65 20 61 72 72 61 79 20 6f 66 20 6f 70 63 6f  he array of opco
4cd0: 64 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  des associated w
4ce0: 69 74 68 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  ith.** the Vdbe 
4cf0: 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
4d00: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 49 74  rst argument. It
4d10: 20 69 73 20 74 68 65 20 63 61 6c 6c 65 72 73 20   is the callers 
4d20: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 0a 2a  responsibility.*
4d30: 2a 20 74 6f 20 61 72 72 61 6e 67 65 20 66 6f 72  * to arrange for
4d40: 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 61 72   the returned ar
4d50: 72 61 79 20 74 6f 20 62 65 20 65 76 65 6e 74 75  ray to be eventu
4d60: 61 6c 6c 79 20 66 72 65 65 64 20 75 73 69 6e 67  ally freed using
4d70: 20 74 68 65 20 0a 2a 2a 20 76 64 62 65 46 72 65   the .** vdbeFre
4d80: 65 4f 70 41 72 72 61 79 28 29 20 66 75 6e 63 74  eOpArray() funct
4d90: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72  ion..**.** Befor
4da0: 65 20 72 65 74 75 72 6e 69 6e 67 2c 20 2a 70 6e  e returning, *pn
4db0: 4f 70 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  Op is set to the
4dc0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
4dd0: 65 73 20 69 6e 20 74 68 65 20 72 65 74 75 72 6e  es in the return
4de0: 65 64 0a 2a 2a 20 61 72 72 61 79 2e 20 41 6c 73  ed.** array. Als
4df0: 6f 2c 20 2a 70 6e 4d 61 78 41 72 67 20 69 73 20  o, *pnMaxArg is 
4e00: 73 65 74 20 74 6f 20 74 68 65 20 6c 61 72 67 65  set to the large
4e10: 72 20 6f 66 20 69 74 73 20 63 75 72 72 65 6e 74  r of its current
4e20: 20 76 61 6c 75 65 20 61 6e 64 20 0a 2a 2a 20 74   value and .** t
4e30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
4e40: 72 69 65 73 20 69 6e 20 74 68 65 20 56 64 62 65  ries in the Vdbe
4e50: 2e 61 70 41 72 67 5b 5d 20 61 72 72 61 79 20 72  .apArg[] array r
4e60: 65 71 75 69 72 65 64 20 74 6f 20 65 78 65 63 75  equired to execu
4e70: 74 65 20 74 68 65 20 0a 2a 2a 20 72 65 74 75 72  te the .** retur
4e80: 6e 65 64 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a  ned program..*/.
4e90: 56 64 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56  VdbeOp *sqlite3V
4ea0: 64 62 65 54 61 6b 65 4f 70 41 72 72 61 79 28 56  dbeTakeOpArray(V
4eb0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f  dbe *p, int *pnO
4ec0: 70 2c 20 69 6e 74 20 2a 70 6e 4d 61 78 41 72 67  p, int *pnMaxArg
4ed0: 29 7b 0a 20 20 56 64 62 65 4f 70 20 2a 61 4f 70  ){.  VdbeOp *aOp
4ee0: 20 3d 20 70 2d 3e 61 4f 70 3b 0a 20 20 61 73 73   = p->aOp;.  ass
4ef0: 65 72 74 28 20 61 4f 70 20 26 26 20 21 70 2d 3e  ert( aOp && !p->
4f00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
4f10: 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
4f20: 74 68 61 74 20 73 71 6c 69 74 65 33 56 64 62 65  that sqlite3Vdbe
4f30: 55 73 65 73 42 74 72 65 65 28 29 20 77 61 73 20  UsesBtree() was 
4f40: 6e 6f 74 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  not called on th
4f50: 69 73 20 56 4d 20 2a 2f 0a 20 20 61 73 73 65 72  is VM */.  asser
4f60: 74 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  t( DbMaskAllZero
4f70: 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20 29  (p->btreeMask) )
4f80: 3b 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  ;..  resolveP2Va
4f90: 6c 75 65 73 28 70 2c 20 70 6e 4d 61 78 41 72 67  lues(p, pnMaxArg
4fa0: 29 3b 0a 20 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e  );.  *pnOp = p->
4fb0: 6e 4f 70 3b 0a 20 20 70 2d 3e 61 4f 70 20 3d 20  nOp;.  p->aOp = 
4fc0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 61 4f 70 3b  0;.  return aOp;
4fd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
4fe0: 77 68 6f 6c 65 20 6c 69 73 74 20 6f 66 20 6f 70  whole list of op
4ff0: 65 72 61 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  erations to the 
5000: 6f 70 65 72 61 74 69 6f 6e 20 73 74 61 63 6b 2e  operation stack.
5010: 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f    Return a.** po
5020: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 69 72  inter to the fir
5030: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73  st operation ins
5040: 65 72 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e  erted..**.** Non
5050: 2d 7a 65 72 6f 20 50 32 20 61 72 67 75 6d 65 6e  -zero P2 argumen
5060: 74 73 20 74 6f 20 6a 75 6d 70 20 69 6e 73 74 72  ts to jump instr
5070: 75 63 74 69 6f 6e 73 20 61 72 65 20 61 75 74 6f  uctions are auto
5080: 6d 61 74 69 63 61 6c 6c 79 20 61 64 6a 75 73 74  matically adjust
5090: 65 64 0a 2a 2a 20 73 6f 20 74 68 61 74 20 74 68  ed.** so that th
50a0: 65 20 6a 75 6d 70 20 74 61 72 67 65 74 20 69 73  e jump target is
50b0: 20 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65   relative to the
50c0: 20 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f 6e   first operation
50d0: 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 56 64   inserted..*/.Vd
50e0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
50f0: 65 41 64 64 4f 70 4c 69 73 74 28 0a 20 20 56 64  eAddOpList(.  Vd
5100: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
5110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
5120: 64 20 6f 70 63 6f 64 65 73 20 74 6f 20 74 68 65  d opcodes to the
5130: 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
5140: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70  ent */.  int nOp
5150: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
5160: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5170: 6f 66 20 6f 70 63 6f 64 65 73 20 74 6f 20 61 64  of opcodes to ad
5180: 64 20 2a 2f 0a 20 20 56 64 62 65 4f 70 4c 69 73  d */.  VdbeOpLis
5190: 74 20 63 6f 6e 73 74 20 2a 61 4f 70 2c 20 20 20  t const *aOp,   
51a0: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
51b0: 65 73 20 74 6f 20 62 65 20 61 64 64 65 64 20 2a  es to be added *
51c0: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 6e 6f 20  /.  int iLineno 
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51e0: 20 2f 2a 20 53 6f 75 72 63 65 2d 66 69 6c 65 20   /* Source-file 
51f0: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 6f 66 20 66  line number of f
5200: 69 72 73 74 20 6f 70 63 6f 64 65 20 2a 2f 0a 29  irst opcode */.)
5210: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 56 64 62  {.  int i;.  Vdb
5220: 65 4f 70 20 2a 70 4f 75 74 2c 20 2a 70 46 69 72  eOp *pOut, *pFir
5230: 73 74 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f  st;.  assert( nO
5240: 70 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  p>0 );.  assert(
5250: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
5260: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
5270: 69 66 28 20 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70  if( p->nOp + nOp
5280: 20 3e 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f   > p->pParse->nO
5290: 70 41 6c 6c 6f 63 20 26 26 20 67 72 6f 77 4f 70  pAlloc && growOp
52a0: 41 72 72 61 79 28 70 2c 20 6e 4f 70 29 20 29 7b  Array(p, nOp) ){
52b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
52c0: 20 7d 0a 20 20 70 46 69 72 73 74 20 3d 20 70 4f   }.  pFirst = pO
52d0: 75 74 20 3d 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e  ut = &p->aOp[p->
52e0: 6e 4f 70 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nOp];.  for(i=0;
52f0: 20 69 3c 6e 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70   i<nOp; i++, aOp
5300: 2b 2b 2c 20 70 4f 75 74 2b 2b 29 7b 0a 20 20 20  ++, pOut++){.   
5310: 20 70 4f 75 74 2d 3e 6f 70 63 6f 64 65 20 3d 20   pOut->opcode = 
5320: 61 4f 70 2d 3e 6f 70 63 6f 64 65 3b 0a 20 20 20  aOp->opcode;.   
5330: 20 70 4f 75 74 2d 3e 70 31 20 3d 20 61 4f 70 2d   pOut->p1 = aOp-
5340: 3e 70 31 3b 0a 20 20 20 20 70 4f 75 74 2d 3e 70  >p1;.    pOut->p
5350: 32 20 3d 20 61 4f 70 2d 3e 70 32 3b 0a 20 20 20  2 = aOp->p2;.   
5360: 20 61 73 73 65 72 74 28 20 61 4f 70 2d 3e 70 32   assert( aOp->p2
5370: 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 28  >=0 );.    if( (
5380: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
5390: 70 65 72 74 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64  perty[aOp->opcod
53a0: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
53b0: 21 3d 30 20 26 26 20 61 4f 70 2d 3e 70 32 3e 30  !=0 && aOp->p2>0
53c0: 20 29 7b 0a 20 20 20 20 20 20 70 4f 75 74 2d 3e   ){.      pOut->
53d0: 70 32 20 2b 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20  p2 += p->nOp;.  
53e0: 20 20 7d 0a 20 20 20 20 70 4f 75 74 2d 3e 70 33    }.    pOut->p3
53f0: 20 3d 20 61 4f 70 2d 3e 70 33 3b 0a 20 20 20 20   = aOp->p3;.    
5400: 70 4f 75 74 2d 3e 70 34 74 79 70 65 20 3d 20 50  pOut->p4type = P
5410: 34 5f 4e 4f 54 55 53 45 44 3b 0a 20 20 20 20 70  4_NOTUSED;.    p
5420: 4f 75 74 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20  Out->p4.p = 0;. 
5430: 20 20 20 70 4f 75 74 2d 3e 70 35 20 3d 20 30 3b     pOut->p5 = 0;
5440: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5450: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
5460: 4d 4d 45 4e 54 53 0a 20 20 20 20 70 4f 75 74 2d  MMENTS.    pOut-
5470: 3e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23  >zComment = 0;.#
5480: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
5490: 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41 47  ITE_VDBE_COVERAG
54a0: 45 0a 20 20 20 20 70 4f 75 74 2d 3e 69 53 72 63  E.    pOut->iSrc
54b0: 4c 69 6e 65 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69  Line = iLineno+i
54c0: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 28 76 6f 69  ;.#else.    (voi
54d0: 64 29 69 4c 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69  d)iLineno;.#endi
54e0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
54f0: 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 70 2d  DEBUG.    if( p-
5500: 3e 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  >db->flags & SQL
5510: 49 54 45 5f 56 64 62 65 41 64 64 6f 70 54 72 61  ITE_VdbeAddopTra
5520: 63 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ce ){.      sqli
5530: 74 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 30  te3VdbePrintOp(0
5540: 2c 20 69 2b 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e  , i+p->nOp, &p->
5550: 61 4f 70 5b 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a  aOp[i+p->nOp]);.
5560: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d      }.#endif.  }
5570: 0a 20 20 70 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70  .  p->nOp += nOp
5580: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 72 73  ;.  return pFirs
5590: 74 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65  t;.}..#if define
55a0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
55b0: 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 29  STMT_SCANSTATUS)
55c0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 6e 20 65 6e  ./*.** Add an en
55d0: 74 72 79 20 74 6f 20 74 68 65 20 61 72 72 61 79  try to the array
55e0: 20 6f 66 20 63 6f 75 6e 74 65 72 73 20 6d 61 6e   of counters man
55f0: 61 67 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  aged by sqlite3_
5600: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
5610: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
5620: 65 33 56 64 62 65 53 63 61 6e 53 74 61 74 75 73  e3VdbeScanStatus
5630: 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20  (.  Vdbe *p,    
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 2f 2a 20 56 4d 20 74 6f 20 61 64 64      /* VM to add
5660: 20 73 63 61 6e 73 74 61 74 75 73 28 29 20 74 6f   scanstatus() to
5670: 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 45 78   */.  int addrEx
5680: 70 6c 61 69 6e 2c 20 20 20 20 20 20 20 20 20 20  plain,          
5690: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
56a0: 20 6f 66 20 4f 50 5f 45 78 70 6c 61 69 6e 20 28   of OP_Explain (
56b0: 6f 72 20 30 29 20 2a 2f 0a 20 20 69 6e 74 20 61  or 0) */.  int a
56c0: 64 64 72 4c 6f 6f 70 2c 20 20 20 20 20 20 20 20  ddrLoop,        
56d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
56e0: 64 72 65 73 73 20 6f 66 20 6c 6f 6f 70 20 63 6f  dress of loop co
56f0: 75 6e 74 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20  unter */ .  int 
5700: 61 64 64 72 56 69 73 69 74 2c 20 20 20 20 20 20  addrVisit,      
5710: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
5720: 64 64 72 65 73 73 20 6f 66 20 72 6f 77 73 20 76  ddress of rows v
5730: 69 73 69 74 65 64 20 63 6f 75 6e 74 65 72 20 2a  isited counter *
5740: 2f 0a 20 20 4c 6f 67 45 73 74 20 6e 45 73 74 2c  /.  LogEst nEst,
5750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5760: 20 20 20 20 2f 2a 20 45 73 74 69 6d 61 74 65 64      /* Estimated
5770: 20 6e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70 75   number of outpu
5780: 74 20 72 6f 77 73 20 2a 2f 0a 20 20 63 6f 6e 73  t rows */.  cons
5790: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
57a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
57b0: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 6f 72 20  ame of table or 
57c0: 69 6e 64 65 78 20 62 65 69 6e 67 20 73 63 61 6e  index being scan
57d0: 6e 65 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ned */.){.  int 
57e0: 6e 42 79 74 65 20 3d 20 28 70 2d 3e 6e 53 63 61  nByte = (p->nSca
57f0: 6e 2b 31 29 20 2a 20 73 69 7a 65 6f 66 28 53 63  n+1) * sizeof(Sc
5800: 61 6e 53 74 61 74 75 73 29 3b 0a 20 20 53 63 61  anStatus);.  Sca
5810: 6e 53 74 61 74 75 73 20 2a 61 4e 65 77 3b 0a 20  nStatus *aNew;. 
5820: 20 61 4e 65 77 20 3d 20 28 53 63 61 6e 53 74 61   aNew = (ScanSta
5830: 74 75 73 2a 29 73 71 6c 69 74 65 33 44 62 52 65  tus*)sqlite3DbRe
5840: 61 6c 6c 6f 63 28 70 2d 3e 64 62 2c 20 70 2d 3e  alloc(p->db, p->
5850: 61 53 63 61 6e 2c 20 6e 42 79 74 65 29 3b 0a 20  aScan, nByte);. 
5860: 20 69 66 28 20 61 4e 65 77 20 29 7b 0a 20 20 20   if( aNew ){.   
5870: 20 53 63 61 6e 53 74 61 74 75 73 20 2a 70 4e 65   ScanStatus *pNe
5880: 77 20 3d 20 26 61 4e 65 77 5b 70 2d 3e 6e 53 63  w = &aNew[p->nSc
5890: 61 6e 2b 2b 5d 3b 0a 20 20 20 20 70 4e 65 77 2d  an++];.    pNew-
58a0: 3e 61 64 64 72 45 78 70 6c 61 69 6e 20 3d 20 61  >addrExplain = a
58b0: 64 64 72 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  ddrExplain;.    
58c0: 70 4e 65 77 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d  pNew->addrLoop =
58d0: 20 61 64 64 72 4c 6f 6f 70 3b 0a 20 20 20 20 70   addrLoop;.    p
58e0: 4e 65 77 2d 3e 61 64 64 72 56 69 73 69 74 20 3d  New->addrVisit =
58f0: 20 61 64 64 72 56 69 73 69 74 3b 0a 20 20 20 20   addrVisit;.    
5900: 70 4e 65 77 2d 3e 6e 45 73 74 20 3d 20 6e 45 73  pNew->nEst = nEs
5910: 74 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 7a 4e 61  t;.    pNew->zNa
5920: 6d 65 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  me = sqlite3DbSt
5930: 72 44 75 70 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d  rDup(p->db, zNam
5940: 65 29 3b 0a 20 20 20 20 70 2d 3e 61 53 63 61 6e  e);.    p->aScan
5950: 20 3d 20 61 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23   = aNew;.  }.}.#
5960: 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
5970: 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
5980: 66 20 74 68 65 20 6f 70 63 6f 64 65 2c 20 6f 72  f the opcode, or
5990: 20 50 31 2c 20 50 32 2c 20 50 33 2c 20 6f 72 20   P1, P2, P3, or 
59a0: 50 35 20 6f 70 65 72 61 6e 64 73 0a 2a 2a 20 66  P5 operands.** f
59b0: 6f 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e  or a specific in
59c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
59d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68  id sqlite3VdbeCh
59e0: 61 6e 67 65 4f 70 63 6f 64 65 28 56 64 62 65 20  angeOpcode(Vdbe 
59f0: 2a 70 2c 20 75 33 32 20 61 64 64 72 2c 20 75 38  *p, u32 addr, u8
5a00: 20 69 4e 65 77 4f 70 63 6f 64 65 29 7b 0a 20 20   iNewOpcode){.  
5a10: 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70  sqlite3VdbeGetOp
5a20: 28 70 2c 61 64 64 72 29 2d 3e 6f 70 63 6f 64 65  (p,addr)->opcode
5a30: 20 3d 20 69 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d   = iNewOpcode;.}
5a40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
5a50: 65 43 68 61 6e 67 65 50 31 28 56 64 62 65 20 2a  eChangeP1(Vdbe *
5a60: 70 2c 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74  p, u32 addr, int
5a70: 20 76 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33   val){.  sqlite3
5a80: 56 64 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72  VdbeGetOp(p,addr
5a90: 29 2d 3e 70 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76  )->p1 = val;.}.v
5aa0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
5ab0: 68 61 6e 67 65 50 32 28 56 64 62 65 20 2a 70 2c  hangeP2(Vdbe *p,
5ac0: 20 75 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76   u32 addr, int v
5ad0: 61 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64  al){.  sqlite3Vd
5ae0: 62 65 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d  beGetOp(p,addr)-
5af0: 3e 70 32 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69  >p2 = val;.}.voi
5b00: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
5b10: 6e 67 65 50 33 28 56 64 62 65 20 2a 70 2c 20 75  ngeP3(Vdbe *p, u
5b20: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
5b30: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5b40: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5b50: 33 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  3 = val;.}.void 
5b60: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5b70: 65 50 35 28 56 64 62 65 20 2a 70 2c 20 75 38 20  eP5(Vdbe *p, u8 
5b80: 70 35 29 7b 0a 20 20 69 66 28 20 21 70 2d 3e 64  p5){.  if( !p->d
5b90: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
5ba0: 29 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d  ) p->aOp[p->nOp-
5bb0: 31 5d 2e 70 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f  1].p5 = p5;.}../
5bc0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
5bd0: 50 32 20 6f 70 65 72 61 6e 64 20 6f 66 20 69 6e  P2 operand of in
5be0: 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 20 73  struction addr s
5bf0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
5c00: 20 74 6f 0a 2a 2a 20 74 68 65 20 61 64 64 72 65   to.** the addre
5c10: 73 73 20 6f 66 20 74 68 65 20 6e 65 78 74 20 69  ss of the next i
5c20: 6e 73 74 72 75 63 74 69 6f 6e 20 74 6f 20 62 65  nstruction to be
5c30: 20 63 6f 64 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20   coded..*/.void 
5c40: 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70 48  sqlite3VdbeJumpH
5c50: 65 72 65 28 56 64 62 65 20 2a 70 2c 20 69 6e 74  ere(Vdbe *p, int
5c60: 20 61 64 64 72 29 7b 0a 20 20 73 71 6c 69 74 65   addr){.  sqlite
5c70: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
5c80: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
5c90: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5ca0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
5cb0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
5cc0: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
5cd0: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
5ce0: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
5cf0: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
5d00: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
5d10: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
5d20: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
5d30: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
5d40: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
5d50: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
5d60: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5d70: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
5d80: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5d90: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
5da0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
5db0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5dc0: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
5dd0: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
5de0: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
5df0: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
5e00: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
5e10: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
5e20: 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62  4Mem(sqlite3 *db
5e30: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
5e40: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
5e50: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5e60: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
5e70: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5e80: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53  , p);.}.static S
5e90: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
5ea0: 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74  oid freeP4FuncCt
5eb0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  x(sqlite3 *db, s
5ec0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5ed0: 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65  p){.  freeEpheme
5ee0: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
5ef0: 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 73 71 6c  p->pFunc);.  sql
5f00: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5f10: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
5f20: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
5f30: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
5f40: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73   void *p4){.  as
5f50: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77  sert( db );.  sw
5f60: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
5f70: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
5f80: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  CTX: {.      fre
5f90: 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28  eP4FuncCtx(db, (
5fa0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
5fb0: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
5fc0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5fd0: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63  e P4_REAL:.    c
5fe0: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
5ff0: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
6000: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  C:.    case P4_I
6010: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
6020: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6030: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72  b, p4);.      br
6040: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6050: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
6060: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
6070: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
6080: 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ) sqlite3KeyInfo
6090: 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29  Unref((KeyInfo*)
60a0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
60b0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
60c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
60d0: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
60e0: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
60f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6100: 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a  elete(db, (Expr*
6110: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6120: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6130: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49      case P4_MPRI
6140: 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NTF: {.      if(
6150: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
6160: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  d==0 ) sqlite3_f
6170: 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 62  ree(p4);.      b
6180: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6190: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
61a0: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68   {.      freeEph
61b0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
61c0: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
61d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
61e0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
61f0: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66  _MEM: {.      if
6200: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6210: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
6220: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
6230: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
6240: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  *)p4);.      }el
6250: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  se{.        free
6260: 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29  P4Mem(db, (Mem*)
6270: 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p4);.      }.   
6280: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6290: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
62a0: 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64   : {.      if( d
62b0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
62c0: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
62d0: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
62e0: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
62f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
6300: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
6310: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
6320: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
6330: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
6340: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
6350: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
6360: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
6370: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
6380: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
6390: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
63a0: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
63b0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
63c0: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
63d0: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
63e0: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
63f0: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
6400: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
6410: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
6420: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
6430: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66   pOp->p4type ) f
6440: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
6450: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
6460: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
6470: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
6480: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73  COMMENTS.      s
6490: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
64a0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
64b0: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
64c0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
64d0: 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b  DbFree(db, aOp);
64e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74  .}../*.** Link t
64f0: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62  he SubProgram ob
6500: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
6510: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6520: 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  nt into the link
6530: 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64  ed.** list at Vd
6540: 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20  be.pSubProgram. 
6550: 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65  This list is use
6560: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
6570: 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f  sub-program.** o
6580: 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20  bjects when the 
6590: 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  VM is no longer 
65a0: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69  required..*/.voi
65b0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e  d sqlite3VdbeLin
65c0: 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65  kSubProgram(Vdbe
65d0: 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67   *pVdbe, SubProg
65e0: 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e  ram *p){.  p->pN
65f0: 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72  ext = pVdbe->pPr
6600: 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e  ogram;.  pVdbe->
6610: 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a  pProgram = p;.}.
6620: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6630: 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72  e opcode at addr
6640: 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f   into OP_Noop.*/
6650: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
6660: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
6670: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
6680: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
6690: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
66a0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
66b0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
66c0: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
66d0: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20  p->nOp );.  pOp 
66e0: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
66f0: 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c  .  freeP4(p->db,
6700: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
6710: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
6720: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
6730: 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  USED;.  pOp->p4.
6740: 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70  z = 0;.  pOp->op
6750: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
6760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
6770: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74  *.** If the last
6780: 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20   opcode is "op" 
6790: 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20  and it is not a 
67a0: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
67b0: 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65  ,.** then remove
67c0: 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75   it.  Return tru
67d0: 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  e if and only if
67e0: 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72   an opcode was r
67f0: 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
6800: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
6810: 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65  PriorOpcode(Vdbe
6820: 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69   *p, u8 op){.  i
6830: 66 28 20 70 2d 3e 6e 4f 70 3e 30 20 26 26 20 70  f( p->nOp>0 && p
6840: 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e  ->aOp[p->nOp-1].
6850: 6f 70 63 6f 64 65 3d 3d 6f 70 20 29 7b 0a 20 20  opcode==op ){.  
6860: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6870: 56 64 62 65 43 68 61 6e 67 65 54 6f 4e 6f 6f 70  VdbeChangeToNoop
6880: 28 70 2c 20 70 2d 3e 6e 4f 70 2d 31 29 3b 0a 20  (p, p->nOp-1);. 
6890: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
68a0: 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 0;.  }.}../*.
68b0: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61  ** Change the va
68c0: 6c 75 65 20 6f 66 20 74 68 65 20 50 34 20 6f 70  lue of the P4 op
68d0: 65 72 61 6e 64 20 66 6f 72 20 61 20 73 70 65 63  erand for a spec
68e0: 69 66 69 63 20 69 6e 73 74 72 75 63 74 69 6f 6e  ific instruction
68f0: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
6900: 65 20 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e  e is useful when
6910: 20 61 20 6c 61 72 67 65 20 70 72 6f 67 72 61 6d   a large program
6920: 20 69 73 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20   is loaded from 
6930: 61 0a 2a 2a 20 73 74 61 74 69 63 20 61 72 72 61  a.** static arra
6940: 79 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 56  y using sqlite3V
6950: 64 62 65 41 64 64 4f 70 4c 69 73 74 20 62 75 74  dbeAddOpList but
6960: 20 77 65 20 77 61 6e 74 20 74 6f 20 6d 61 6b 65   we want to make
6970: 20 61 0a 2a 2a 20 66 65 77 20 6d 69 6e 6f 72 20   a.** few minor 
6980: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 70  changes to the p
6990: 72 6f 67 72 61 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66  rogram..**.** If
69a0: 20 6e 3e 3d 30 20 74 68 65 6e 20 74 68 65 20 50   n>=0 then the P
69b0: 34 20 6f 70 65 72 61 6e 64 20 69 73 20 64 79 6e  4 operand is dyn
69c0: 61 6d 69 63 2c 20 6d 65 61 6e 69 6e 67 20 74 68  amic, meaning th
69d0: 61 74 20 61 20 63 6f 70 79 20 6f 66 0a 2a 2a 20  at a copy of.** 
69e0: 74 68 65 20 73 74 72 69 6e 67 20 69 73 20 6d 61  the string is ma
69f0: 64 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  de into memory o
6a00: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
6a10: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a  ite3_malloc()..*
6a20: 2a 20 41 20 76 61 6c 75 65 20 6f 66 20 6e 3d 3d  * A value of n==
6a30: 30 20 6d 65 61 6e 73 20 63 6f 70 79 20 62 79 74  0 means copy byt
6a40: 65 73 20 6f 66 20 7a 50 34 20 75 70 20 74 6f 20  es of zP4 up to 
6a50: 61 6e 64 20 69 6e 63 6c 75 64 69 6e 67 20 74 68  and including th
6a60: 65 0a 2a 2a 20 66 69 72 73 74 20 6e 75 6c 6c 20  e.** first null 
6a70: 62 79 74 65 2e 20 20 49 66 20 6e 3e 30 20 74 68  byte.  If n>0 th
6a80: 65 6e 20 63 6f 70 79 20 6e 2b 31 20 62 79 74 65  en copy n+1 byte
6a90: 73 20 6f 66 20 7a 50 34 2e 0a 2a 2a 20 0a 2a 2a  s of zP4..** .**
6aa0: 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 6f 66   Other values of
6ab0: 20 6e 20 28 50 34 5f 53 54 41 54 49 43 2c 20 50   n (P4_STATIC, P
6ac0: 34 5f 43 4f 4c 4c 53 45 51 20 65 74 63 2e 29 20  4_COLLSEQ etc.) 
6ad0: 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 7a 50  indicate that zP
6ae0: 34 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20 61  4 points.** to a
6af0: 20 73 74 72 69 6e 67 20 6f 72 20 73 74 72 75 63   string or struc
6b00: 74 75 72 65 20 74 68 61 74 20 69 73 20 67 75 61  ture that is gua
6b10: 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74  ranteed to exist
6b20: 20 66 6f 72 20 74 68 65 20 6c 69 66 65 74 69 6d   for the lifetim
6b30: 65 20 6f 66 0a 2a 2a 20 74 68 65 20 56 64 62 65  e of.** the Vdbe
6b40: 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73  . In these cases
6b50: 20 77 65 20 63 61 6e 20 6a 75 73 74 20 63 6f 70   we can just cop
6b60: 79 20 74 68 65 20 70 6f 69 6e 74 65 72 2e 0a 2a  y the pointer..*
6b70: 2a 0a 2a 2a 20 49 66 20 61 64 64 72 3c 30 20 74  *.** If addr<0 t
6b80: 68 65 6e 20 63 68 61 6e 67 65 20 50 34 20 6f 6e  hen change P4 on
6b90: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
6ba0: 6c 79 20 69 6e 73 65 72 74 65 64 20 69 6e 73 74  ly inserted inst
6bb0: 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruction..*/.stat
6bc0: 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 4e  ic void SQLITE_N
6bd0: 4f 49 4e 4c 49 4e 45 20 76 64 62 65 43 68 61 6e  OINLINE vdbeChan
6be0: 67 65 50 34 46 75 6c 6c 28 0a 20 20 56 64 62 65  geP4Full(.  Vdbe
6bf0: 20 2a 70 2c 0a 20 20 4f 70 20 2a 70 4f 70 2c 0a   *p,.  Op *pOp,.
6c00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
6c10: 34 2c 0a 20 20 69 6e 74 20 6e 0a 29 7b 0a 20 20  4,.  int n.){.  
6c20: 69 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 20  if( pOp->p4type 
6c30: 29 7b 0a 20 20 20 20 66 72 65 65 50 34 28 70 2d  ){.    freeP4(p-
6c40: 3e 64 62 2c 20 70 4f 70 2d 3e 70 34 74 79 70 65  >db, pOp->p4type
6c50: 2c 20 70 4f 70 2d 3e 70 34 2e 70 29 3b 0a 20 20  , pOp->p4.p);.  
6c60: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
6c70: 30 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70  0;.    pOp->p4.p
6c80: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
6c90: 6e 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  n<0 ){.    sqlit
6ca0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28 70  e3VdbeChangeP4(p
6cb0: 2c 20 28 69 6e 74 29 28 70 4f 70 20 2d 20 70 2d  , (int)(pOp - p-
6cc0: 3e 61 4f 70 29 2c 20 7a 50 34 2c 20 6e 29 3b 0a  >aOp), zP4, n);.
6cd0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
6ce0: 20 6e 3d 3d 30 20 29 20 6e 20 3d 20 73 71 6c 69   n==0 ) n = sqli
6cf0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 34 29  te3Strlen30(zP4)
6d00: 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 7a 20  ;.    pOp->p4.z 
6d10: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
6d20: 75 70 28 70 2d 3e 64 62 2c 20 7a 50 34 2c 20 6e  up(p->db, zP4, n
6d30: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
6d40: 70 65 20 3d 20 50 34 5f 44 59 4e 41 4d 49 43 3b  pe = P4_DYNAMIC;
6d50: 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  .  }.}.void sqli
6d60: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
6d70: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
6d80: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
6d90: 50 34 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 4f 70  P4, int n){.  Op
6da0: 20 2a 70 4f 70 3b 0a 20 20 73 71 6c 69 74 65 33   *pOp;.  sqlite3
6db0: 20 2a 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20   *db;.  assert( 
6dc0: 70 21 3d 30 20 29 3b 0a 20 20 64 62 20 3d 20 70  p!=0 );.  db = p
6dd0: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
6de0: 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
6df0: 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20 61  AGIC_INIT );.  a
6e00: 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 21 3d 30  ssert( p->aOp!=0
6e10: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
6e20: 69 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62  iled );.  if( db
6e30: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
6e40: 7b 0a 20 20 20 20 69 66 28 20 6e 21 3d 50 34 5f  {.    if( n!=P4_
6e50: 56 54 41 42 20 29 20 66 72 65 65 50 34 28 64 62  VTAB ) freeP4(db
6e60: 2c 20 6e 2c 20 28 76 6f 69 64 2a 29 2a 28 63 68  , n, (void*)*(ch
6e70: 61 72 2a 2a 29 26 7a 50 34 29 3b 0a 20 20 20 20  ar**)&zP4);.    
6e80: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73  return;.  }.  as
6e90: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
6ea0: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 64 64 72  ;.  assert( addr
6eb0: 3c 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 69 66 28  <p->nOp );.  if(
6ec0: 20 61 64 64 72 3c 30 20 29 7b 0a 20 20 20 20 61   addr<0 ){.    a
6ed0: 64 64 72 20 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31  ddr = p->nOp - 1
6ee0: 3b 0a 20 20 7d 0a 20 20 70 4f 70 20 3d 20 26 70  ;.  }.  pOp = &p
6ef0: 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 69  ->aOp[addr];.  i
6f00: 66 28 20 6e 3e 3d 30 20 7c 7c 20 70 4f 70 2d 3e  f( n>=0 || pOp->
6f10: 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 76 64  p4type ){.    vd
6f20: 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c 28 70  beChangeP4Full(p
6f30: 2c 20 70 4f 70 2c 20 7a 50 34 2c 20 6e 29 3b 0a  , pOp, zP4, n);.
6f40: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
6f50: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 49 4e 54 33    if( n==P4_INT3
6f60: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 74 65  2 ){.    /* Note
6f70: 3a 20 74 68 69 73 20 63 61 73 74 20 69 73 20 73  : this cast is s
6f80: 61 66 65 2c 20 62 65 63 61 75 73 65 20 74 68 65  afe, because the
6f90: 20 6f 72 69 67 69 6e 20 64 61 74 61 20 70 6f 69   origin data poi
6fa0: 6e 74 20 77 61 73 20 61 6e 20 69 6e 74 0a 20 20  nt was an int.  
6fb0: 20 20 2a 2a 20 74 68 61 74 20 77 61 73 20 63 61    ** that was ca
6fc0: 73 74 20 74 6f 20 61 20 28 63 6f 6e 73 74 20 63  st to a (const c
6fd0: 68 61 72 20 2a 29 2e 20 2a 2f 0a 20 20 20 20 70  har *). */.    p
6fe0: 4f 70 2d 3e 70 34 2e 69 20 3d 20 53 51 4c 49 54  Op->p4.i = SQLIT
6ff0: 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 7a 50 34  E_PTR_TO_INT(zP4
7000: 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74 79  );.    pOp->p4ty
7010: 70 65 20 3d 20 50 34 5f 49 4e 54 33 32 3b 0a 20  pe = P4_INT32;. 
7020: 20 7d 65 6c 73 65 20 69 66 28 20 7a 50 34 21 3d   }else if( zP4!=
7030: 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
7040: 20 6e 3c 30 20 29 3b 0a 20 20 20 20 70 4f 70 2d   n<0 );.    pOp-
7050: 3e 70 34 2e 70 20 3d 20 28 76 6f 69 64 2a 29 7a  >p4.p = (void*)z
7060: 50 34 3b 0a 20 20 20 20 70 4f 70 2d 3e 70 34 74  P4;.    pOp->p4t
7070: 79 70 65 20 3d 20 28 73 69 67 6e 65 64 20 63 68  ype = (signed ch
7080: 61 72 29 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3d  ar)n;.    if( n=
7090: 3d 50 34 5f 56 54 41 42 20 29 20 73 71 6c 69 74  =P4_VTAB ) sqlit
70a0: 65 33 56 74 61 62 4c 6f 63 6b 28 28 56 54 61 62  e3VtabLock((VTab
70b0: 6c 65 2a 29 7a 50 34 29 3b 0a 20 20 7d 0a 7d 0a  le*)zP4);.  }.}.
70c0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 50  ./*.** Set the P
70d0: 34 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  4 on the most re
70e0: 63 65 6e 74 6c 79 20 61 64 64 65 64 20 6f 70 63  cently added opc
70f0: 6f 64 65 20 74 6f 20 74 68 65 20 4b 65 79 49 6e  ode to the KeyIn
7100: 66 6f 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e  fo for the.** in
7110: 64 65 78 20 67 69 76 65 6e 2e 0a 2a 2f 0a 76 6f  dex given..*/.vo
7120: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
7130: 74 50 34 4b 65 79 49 6e 66 6f 28 50 61 72 73 65  tP4KeyInfo(Parse
7140: 20 2a 70 50 61 72 73 65 2c 20 49 6e 64 65 78 20   *pParse, Index 
7150: 2a 70 49 64 78 29 7b 0a 20 20 56 64 62 65 20 2a  *pIdx){.  Vdbe *
7160: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
7170: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 76 21 3d  e;.  assert( v!=
7180: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
7190: 49 64 78 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Idx!=0 );.  sqli
71a0: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 34 28  te3VdbeChangeP4(
71b0: 76 2c 20 2d 31 2c 20 28 63 68 61 72 2a 29 73 71  v, -1, (char*)sq
71c0: 6c 69 74 65 33 4b 65 79 49 6e 66 6f 4f 66 49 6e  lite3KeyInfoOfIn
71d0: 64 65 78 28 70 50 61 72 73 65 2c 20 70 49 64 78  dex(pParse, pIdx
71e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
71f0: 20 20 20 20 20 20 20 20 20 50 34 5f 4b 45 59 49           P4_KEYI
7200: 4e 46 4f 29 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  NFO);.}..#ifdef 
7210: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58  SQLITE_ENABLE_EX
7220: 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 2f  PLAIN_COMMENTS./
7230: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
7240: 63 6f 6d 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6d  comment on the m
7250: 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 63 6f 64  ost recently cod
7260: 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e 20  ed instruction. 
7270: 20 4f 72 0a 2a 2a 20 69 6e 73 65 72 74 20 61 20   Or.** insert a 
7280: 4e 6f 2d 6f 70 20 61 6e 64 20 61 64 64 20 74 68  No-op and add th
7290: 65 20 63 6f 6d 6d 65 6e 74 20 74 6f 20 74 68 61  e comment to tha
72a0: 74 20 6e 65 77 20 69 6e 73 74 72 75 63 74 69 6f  t new instructio
72b0: 6e 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 61 6b 65  n.  This.** make
72c0: 73 20 74 68 65 20 63 6f 64 65 20 65 61 73 69 65  s the code easie
72d0: 72 20 74 6f 20 72 65 61 64 20 64 75 72 69 6e 67  r to read during
72e0: 20 64 65 62 75 67 67 69 6e 67 2e 20 20 4e 6f 6e   debugging.  Non
72f0: 65 20 6f 66 20 74 68 69 73 20 68 61 70 70 65 6e  e of this happen
7300: 73 0a 2a 2a 20 69 6e 20 61 20 70 72 6f 64 75 63  s.** in a produc
7310: 74 69 6f 6e 20 62 75 69 6c 64 2e 0a 2a 2f 0a 73  tion build..*/.s
7320: 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 56  tatic void vdbeV
7330: 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c  Comment(Vdbe *p,
7340: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
7350: 72 6d 61 74 2c 20 76 61 5f 6c 69 73 74 20 61 70  rmat, va_list ap
7360: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
7370: 6e 4f 70 3e 30 20 7c 7c 20 70 2d 3e 61 4f 70 3d  nOp>0 || p->aOp=
7380: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
7390: 70 2d 3e 61 4f 70 3d 3d 30 20 7c 7c 20 70 2d 3e  p->aOp==0 || p->
73a0: 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43  aOp[p->nOp-1].zC
73b0: 6f 6d 6d 65 6e 74 3d 3d 30 20 7c 7c 20 70 2d 3e  omment==0 || p->
73c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
73d0: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 4f 70   );.  if( p->nOp
73e0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
73f0: 70 2d 3e 61 4f 70 20 29 3b 0a 20 20 20 20 73 71  p->aOp );.    sq
7400: 6c 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 64  lite3DbFree(p->d
7410: 62 2c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70  b, p->aOp[p->nOp
7420: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  -1].zComment);. 
7430: 20 20 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70     p->aOp[p->nOp
7440: 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 20 3d 20 73  -1].zComment = s
7450: 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 70  qlite3VMPrintf(p
7460: 2d 3e 64 62 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  ->db, zFormat, a
7470: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
7480: 71 6c 69 74 65 33 56 64 62 65 43 6f 6d 6d 65 6e  qlite3VdbeCommen
7490: 74 28 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74  t(Vdbe *p, const
74a0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
74b0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
74c0: 61 70 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ap;.  if( p ){. 
74d0: 20 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20     va_start(ap, 
74e0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64  zFormat);.    vd
74f0: 62 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46  beVComment(p, zF
7500: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20  ormat, ap);.    
7510: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a  va_end(ap);.  }.
7520: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
7530: 62 65 4e 6f 6f 70 43 6f 6d 6d 65 6e 74 28 56 64  beNoopComment(Vd
7540: 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  be *p, const cha
7550: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
7560: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
7570: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 73    if( p ){.    s
7580: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 30  qlite3VdbeAddOp0
7590: 28 70 2c 20 4f 50 5f 4e 6f 6f 70 29 3b 0a 20 20  (p, OP_Noop);.  
75a0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
75b0: 46 6f 72 6d 61 74 29 3b 0a 20 20 20 20 76 64 62  Format);.    vdb
75c0: 65 56 43 6f 6d 6d 65 6e 74 28 70 2c 20 7a 46 6f  eVComment(p, zFo
75d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 20 20 76  rmat, ap);.    v
75e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 7d 0a 7d  a_end(ap);.  }.}
75f0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 4e 44 45 42  .#endif  /* NDEB
7600: 55 47 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  UG */..#ifdef SQ
7610: 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
7620: 47 45 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  GE./*.** Set the
7630: 20 76 61 6c 75 65 20 69 66 20 74 68 65 20 69 53   value if the iS
7640: 72 63 4c 69 6e 65 20 66 69 65 6c 64 20 66 6f 72  rcLine field for
7650: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
7660: 63 6f 64 65 64 20 69 6e 73 74 72 75 63 74 69 6f  coded instructio
7670: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7680: 65 33 56 64 62 65 53 65 74 4c 69 6e 65 4e 75 6d  e3VdbeSetLineNum
7690: 62 65 72 28 56 64 62 65 20 2a 76 2c 20 69 6e 74  ber(Vdbe *v, int
76a0: 20 69 4c 69 6e 65 29 7b 0a 20 20 73 71 6c 69 74   iLine){.  sqlit
76b0: 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c 2d 31  e3VdbeGetOp(v,-1
76c0: 29 2d 3e 69 53 72 63 4c 69 6e 65 20 3d 20 69 4c  )->iSrcLine = iL
76d0: 69 6e 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ine;.}.#endif /*
76e0: 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56   SQLITE_VDBE_COV
76f0: 45 52 41 47 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ERAGE */../*.** 
7700: 52 65 74 75 72 6e 20 74 68 65 20 6f 70 63 6f 64  Return the opcod
7710: 65 20 66 6f 72 20 61 20 67 69 76 65 6e 20 61 64  e for a given ad
7720: 64 72 65 73 73 2e 20 20 49 66 20 74 68 65 20 61  dress.  If the a
7730: 64 64 72 65 73 73 20 69 73 20 2d 31 2c 20 74 68  ddress is -1, th
7740: 65 6e 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65  en.** return the
7750: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 69   most recently i
7760: 6e 73 65 72 74 65 64 20 6f 70 63 6f 64 65 2e 0a  nserted opcode..
7770: 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
7780: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
7790: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20  or has occurred 
77a0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 63 61 6c  prior to the cal
77b0: 6c 69 6e 67 20 6f 66 20 74 68 69 73 0a 2a 2a 20  ling of this.** 
77c0: 72 6f 75 74 69 6e 65 2c 20 74 68 65 6e 20 61 20  routine, then a 
77d0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 64 75 6d  pointer to a dum
77e0: 6d 79 20 56 64 62 65 4f 70 20 77 69 6c 6c 20 62  my VdbeOp will b
77f0: 65 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 61  e returned.  Tha
7800: 74 20 6f 70 63 6f 64 65 0a 2a 2a 20 69 73 20 72  t opcode.** is r
7810: 65 61 64 61 62 6c 65 20 62 75 74 20 6e 6f 74 20  eadable but not 
7820: 77 72 69 74 61 62 6c 65 2c 20 74 68 6f 75 67 68  writable, though
7830: 20 69 74 20 69 73 20 63 61 73 74 20 74 6f 20 61   it is cast to a
7840: 20 77 72 69 74 61 62 6c 65 20 76 61 6c 75 65 2e   writable value.
7850: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 6f  .** The return o
7860: 66 20 61 20 64 75 6d 6d 79 20 6f 70 63 6f 64 65  f a dummy opcode
7870: 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 61 6c 6c   allows the call
7880: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 66 75 6e   to continue fun
7890: 63 74 69 6f 6e 69 6e 67 0a 2a 2a 20 61 66 74 65  ctioning.** afte
78a0: 72 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74 20 77  r an OOM fault w
78b0: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
78c0: 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
78d0: 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d   the return from
78e0: 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e   .** this routin
78f0: 65 20 69 73 20 61 20 76 61 6c 69 64 20 70 6f 69  e is a valid poi
7900: 6e 74 65 72 2e 20 20 42 75 74 20 62 65 63 61 75  nter.  But becau
7910: 73 65 20 74 68 65 20 64 75 6d 6d 79 2e 6f 70 63  se the dummy.opc
7920: 6f 64 65 20 69 73 20 30 2c 0a 2a 2a 20 64 75 6d  ode is 0,.** dum
7930: 6d 79 20 77 69 6c 6c 20 6e 65 76 65 72 20 62 65  my will never be
7940: 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 20 54 68   written to.  Th
7950: 69 73 20 69 73 20 76 65 72 69 66 69 65 64 20 62  is is verified b
7960: 79 20 63 6f 64 65 20 69 6e 73 70 65 63 74 69 6f  y code inspectio
7970: 6e 20 61 6e 64 0a 2a 2a 20 62 79 20 72 75 6e 6e  n and.** by runn
7980: 69 6e 67 20 77 69 74 68 20 56 61 6c 67 72 69 6e  ing with Valgrin
7990: 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70 20 2a 73 71  d..*/.VdbeOp *sq
79a0: 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 56  lite3VdbeGetOp(V
79b0: 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72  dbe *p, int addr
79c0: 29 7b 0a 20 20 2f 2a 20 43 38 39 20 73 70 65 63  ){.  /* C89 spec
79d0: 69 66 69 65 73 20 74 68 61 74 20 74 68 65 20 63  ifies that the c
79e0: 6f 6e 73 74 61 6e 74 20 22 64 75 6d 6d 79 22 20  onstant "dummy" 
79f0: 77 69 6c 6c 20 62 65 20 69 6e 69 74 69 61 6c 69  will be initiali
7a00: 7a 65 64 20 74 6f 20 61 6c 6c 0a 20 20 2a 2a 20  zed to all.  ** 
7a10: 7a 65 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  zeros, which is 
7a20: 63 6f 72 72 65 63 74 2e 20 20 4d 53 56 43 20 67  correct.  MSVC g
7a30: 65 6e 65 72 61 74 65 73 20 61 20 77 61 72 6e 69  enerates a warni
7a40: 6e 67 2c 20 6e 65 76 65 72 74 68 65 6c 65 73 73  ng, nevertheless
7a50: 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 56 64  . */.  static Vd
7a60: 62 65 4f 70 20 64 75 6d 6d 79 3b 20 20 2f 2a 20  beOp dummy;  /* 
7a70: 49 67 6e 6f 72 65 20 74 68 65 20 4d 53 56 43 20  Ignore the MSVC 
7a80: 77 61 72 6e 69 6e 67 20 61 62 6f 75 74 20 6e 6f  warning about no
7a90: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 2a 2f 0a   initializer */.
7aa0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67    assert( p->mag
7ab0: 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49  ic==VDBE_MAGIC_I
7ac0: 4e 49 54 20 29 3b 0a 20 20 69 66 28 20 61 64 64  NIT );.  if( add
7ad0: 72 3c 30 20 29 7b 0a 20 20 20 20 61 64 64 72 20  r<0 ){.    addr 
7ae0: 3d 20 70 2d 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20  = p->nOp - 1;.  
7af0: 7d 0a 20 20 61 73 73 65 72 74 28 20 28 61 64 64  }.  assert( (add
7b00: 72 3e 3d 30 20 26 26 20 61 64 64 72 3c 70 2d 3e  r>=0 && addr<p->
7b10: 6e 4f 70 29 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d  nOp) || p->db->m
7b20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
7b30: 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c   if( p->db->mall
7b40: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
7b50: 72 65 74 75 72 6e 20 28 56 64 62 65 4f 70 2a 29  return (VdbeOp*)
7b60: 26 64 75 6d 6d 79 3b 0a 20 20 7d 65 6c 73 65 7b  &dummy;.  }else{
7b70: 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 2d 3e  .    return &p->
7b80: 61 4f 70 5b 61 64 64 72 5d 3b 0a 20 20 7d 0a 7d  aOp[addr];.  }.}
7b90: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
7ba0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c  LITE_ENABLE_EXPL
7bb0: 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 29 0a 2f 2a  AIN_COMMENTS)./*
7bc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 69 6e  .** Return an in
7bd0: 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20  teger value for 
7be0: 6f 6e 65 20 6f 66 20 74 68 65 20 70 61 72 61 6d  one of the param
7bf0: 65 74 65 72 73 20 74 6f 20 74 68 65 20 6f 70 63  eters to the opc
7c00: 6f 64 65 20 70 4f 70 0a 2a 2a 20 64 65 74 65 72  ode pOp.** deter
7c10: 6d 69 6e 65 64 20 62 79 20 63 68 61 72 61 63 74  mined by charact
7c20: 65 72 20 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er c..*/.static 
7c30: 69 6e 74 20 74 72 61 6e 73 6c 61 74 65 50 28 63  int translateP(c
7c40: 68 61 72 20 63 2c 20 63 6f 6e 73 74 20 4f 70 20  har c, const Op 
7c50: 2a 70 4f 70 29 7b 0a 20 20 69 66 28 20 63 3d 3d  *pOp){.  if( c==
7c60: 27 31 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70  '1' ) return pOp
7c70: 2d 3e 70 31 3b 0a 20 20 69 66 28 20 63 3d 3d 27  ->p1;.  if( c=='
7c80: 32 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d  2' ) return pOp-
7c90: 3e 70 32 3b 0a 20 20 69 66 28 20 63 3d 3d 27 33  >p2;.  if( c=='3
7ca0: 27 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e  ' ) return pOp->
7cb0: 70 33 3b 0a 20 20 69 66 28 20 63 3d 3d 27 34 27  p3;.  if( c=='4'
7cc0: 20 29 20 72 65 74 75 72 6e 20 70 4f 70 2d 3e 70   ) return pOp->p
7cd0: 34 2e 69 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  4.i;.  return pO
7ce0: 70 2d 3e 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p->p5;.}../*.** 
7cf0: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
7d00: 20 66 6f 72 20 74 68 65 20 22 63 6f 6d 6d 65 6e   for the "commen
7d10: 74 22 20 66 69 65 6c 64 20 6f 66 20 61 20 56 44  t" field of a VD
7d20: 42 45 20 6f 70 63 6f 64 65 20 6c 69 73 74 69 6e  BE opcode listin
7d30: 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 79 6e  g..**.** The Syn
7d40: 6f 70 73 69 73 3a 20 66 69 65 6c 64 20 69 6e 20  opsis: field in 
7d50: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  comments in the 
7d60: 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66 69  vdbe.c source fi
7d70: 6c 65 20 67 65 74 73 20 63 6f 6e 76 65 72 74 65  le gets converte
7d80: 64 0a 2a 2a 20 74 6f 20 61 6e 20 65 78 74 72 61  d.** to an extra
7d90: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
7da0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
7db0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
7dc0: 65 28 29 2e 20 20 49 6e 20 74 68 65 0a 2a 2a 20  e().  In the.** 
7dd0: 61 62 73 65 6e 63 65 20 6f 66 20 6f 74 68 65 72  absence of other
7de0: 20 63 6f 6d 6d 65 6e 74 73 2c 20 74 68 69 73 20   comments, this 
7df0: 73 79 6e 6f 70 73 69 73 20 62 65 63 6f 6d 65 73  synopsis becomes
7e00: 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20 6f 6e 20   the comment on 
7e10: 74 68 65 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 53  the opcode..** S
7e20: 6f 6d 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20  ome translation 
7e30: 6f 63 63 75 72 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  occurs:.**.**   
7e40: 20 20 20 20 22 50 58 22 20 20 20 20 20 20 2d 3e      "PX"      ->
7e50: 20 20 22 72 5b 58 5d 22 0a 2a 2a 20 20 20 20 20    "r[X]".**     
7e60: 20 20 22 50 58 40 50 59 22 20 20 20 2d 3e 20 20    "PX@PY"   ->  
7e70: 22 72 5b 58 2e 2e 58 2b 59 2d 31 5d 22 20 20 6f  "r[X..X+Y-1]"  o
7e80: 72 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73  r "r[x]" if y is
7e90: 20 30 20 6f 72 20 31 0a 2a 2a 20 20 20 20 20 20   0 or 1.**      
7ea0: 20 22 50 58 40 50 59 2b 31 22 20 2d 3e 20 20 22   "PX@PY+1" ->  "
7eb0: 72 5b 58 2e 2e 58 2b 59 5d 22 20 20 20 20 6f 72  r[X..X+Y]"    or
7ec0: 20 22 72 5b 78 5d 22 20 69 66 20 79 20 69 73 20   "r[x]" if y is 
7ed0: 30 0a 2a 2a 20 20 20 20 20 20 20 22 50 59 2e 2e  0.**       "PY..
7ee0: 50 59 22 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 59  PY"  ->  "r[X..Y
7ef0: 5d 22 20 20 20 20 20 20 6f 72 20 22 72 5b 78 5d  ]"      or "r[x]
7f00: 22 20 69 66 20 79 3c 3d 78 0a 2a 2f 0a 73 74 61  " if y<=x.*/.sta
7f10: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 43  tic int displayC
7f20: 6f 6d 6d 65 6e 74 28 0a 20 20 63 6f 6e 73 74 20  omment(.  const 
7f30: 4f 70 20 2a 70 4f 70 2c 20 20 20 20 20 2f 2a 20  Op *pOp,     /* 
7f40: 54 68 65 20 6f 70 63 6f 64 65 20 74 6f 20 62 65  The opcode to be
7f50: 20 63 6f 6d 6d 65 6e 74 65 64 20 2a 2f 0a 20 20   commented */.  
7f60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 34 2c  const char *zP4,
7f70: 20 20 20 2f 2a 20 50 72 65 76 69 6f 75 73 6c 79     /* Previously
7f80: 20 6f 62 74 61 69 6e 65 64 20 76 61 6c 75 65 20   obtained value 
7f90: 66 6f 72 20 50 34 20 2a 2f 0a 20 20 63 68 61 72  for P4 */.  char
7fa0: 20 2a 7a 54 65 6d 70 2c 20 20 20 20 20 20 20 2f   *zTemp,       /
7fb0: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 20 68  * Write result h
7fc0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65  ere */.  int nTe
7fd0: 6d 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  mp          /* S
7fe0: 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 69  pace available i
7ff0: 6e 20 7a 54 65 6d 70 5b 5d 20 2a 2f 0a 29 7b 0a  n zTemp[] */.){.
8000: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f    const char *zO
8010: 70 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  pName;.  const c
8020: 68 61 72 20 2a 7a 53 79 6e 6f 70 73 69 73 3b 0a  har *zSynopsis;.
8030: 20 20 69 6e 74 20 6e 4f 70 4e 61 6d 65 3b 0a 20    int nOpName;. 
8040: 20 69 6e 74 20 69 69 2c 20 6a 6a 3b 0a 20 20 63   int ii, jj;.  c
8050: 68 61 72 20 7a 41 6c 74 5b 35 30 5d 3b 0a 20 20  har zAlt[50];.  
8060: 7a 4f 70 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  zOpName = sqlite
8070: 33 4f 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d  3OpcodeName(pOp-
8080: 3e 6f 70 63 6f 64 65 29 3b 0a 20 20 6e 4f 70 4e  >opcode);.  nOpN
8090: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
80a0: 6c 65 6e 33 30 28 7a 4f 70 4e 61 6d 65 29 3b 0a  len30(zOpName);.
80b0: 20 20 69 66 28 20 7a 4f 70 4e 61 6d 65 5b 6e 4f    if( zOpName[nO
80c0: 70 4e 61 6d 65 2b 31 5d 20 29 7b 0a 20 20 20 20  pName+1] ){.    
80d0: 69 6e 74 20 73 65 65 6e 43 6f 6d 20 3d 20 30 3b  int seenCom = 0;
80e0: 0a 20 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20  .    char c;.   
80f0: 20 7a 53 79 6e 6f 70 73 69 73 20 3d 20 7a 4f 70   zSynopsis = zOp
8100: 4e 61 6d 65 20 2b 3d 20 6e 4f 70 4e 61 6d 65 20  Name += nOpName 
8110: 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 73 74 72  + 1;.    if( str
8120: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2c 22  ncmp(zSynopsis,"
8130: 49 46 20 22 2c 33 29 3d 3d 30 20 29 7b 0a 20 20  IF ",3)==0 ){.  
8140: 20 20 20 20 69 66 28 20 70 4f 70 2d 3e 70 35 20      if( pOp->p5 
8150: 26 20 53 51 4c 49 54 45 5f 53 54 4f 52 45 50 32  & SQLITE_STOREP2
8160: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8170: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
8180: 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c  eof(zAlt), zAlt,
8190: 20 22 72 5b 50 32 5d 20 3d 20 28 25 73 29 22 2c   "r[P2] = (%s)",
81a0: 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a 20   zSynopsis+3);. 
81b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
81c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
81d0: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 41 6c 74  intf(sizeof(zAlt
81e0: 29 2c 20 7a 41 6c 74 2c 20 22 69 66 20 25 73 20  ), zAlt, "if %s 
81f0: 67 6f 74 6f 20 50 32 22 2c 20 7a 53 79 6e 6f 70  goto P2", zSynop
8200: 73 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 0a  sis+3);.      }.
8210: 20 20 20 20 20 20 7a 53 79 6e 6f 70 73 69 73 20        zSynopsis 
8220: 3d 20 7a 41 6c 74 3b 0a 20 20 20 20 7d 0a 20 20  = zAlt;.    }.  
8230: 20 20 66 6f 72 28 69 69 3d 6a 6a 3d 30 3b 20 6a    for(ii=jj=0; j
8240: 6a 3c 6e 54 65 6d 70 2d 31 20 26 26 20 28 63 20  j<nTemp-1 && (c 
8250: 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d 29  = zSynopsis[ii])
8260: 21 3d 30 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  !=0; ii++){.    
8270: 20 20 69 66 28 20 63 3d 3d 27 50 27 20 29 7b 0a    if( c=='P' ){.
8280: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 53 79 6e          c = zSyn
8290: 6f 70 73 69 73 5b 2b 2b 69 69 5d 3b 0a 20 20 20  opsis[++ii];.   
82a0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 34 27 20       if( c=='4' 
82b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
82c0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
82d0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
82e0: 2c 20 22 25 73 22 2c 20 7a 50 34 29 3b 0a 20 20  , "%s", zP4);.  
82f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8300: 63 3d 3d 27 58 27 20 29 7b 0a 20 20 20 20 20 20  c=='X' ){.      
8310: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8320: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8330: 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20 70  Temp+jj, "%s", p
8340: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
8350: 20 20 20 20 20 20 20 20 20 73 65 65 6e 43 6f 6d           seenCom
8360: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
8370: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69  lse{.          i
8380: 6e 74 20 76 31 20 3d 20 74 72 61 6e 73 6c 61 74  nt v1 = translat
8390: 65 50 28 63 2c 20 70 4f 70 29 3b 0a 20 20 20 20  eP(c, pOp);.    
83a0: 20 20 20 20 20 20 69 6e 74 20 76 32 3b 0a 20 20        int v2;.  
83b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
83c0: 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a  snprintf(nTemp-j
83d0: 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 64  j, zTemp+jj, "%d
83e0: 22 2c 20 76 31 29 3b 0a 20 20 20 20 20 20 20 20  ", v1);.        
83f0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53    if( strncmp(zS
8400: 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 40  ynopsis+ii+1, "@
8410: 50 22 2c 20 32 29 3d 3d 30 20 29 7b 0a 20 20 20  P", 2)==0 ){.   
8420: 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 33           ii += 3
8430: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a 6a  ;.            jj
8440: 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
8450: 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a 20  n30(zTemp+jj);. 
8460: 20 20 20 20 20 20 20 20 20 20 20 76 32 20 3d 20             v2 = 
8470: 74 72 61 6e 73 6c 61 74 65 50 28 7a 53 79 6e 6f  translateP(zSyno
8480: 70 73 69 73 5b 69 69 5d 2c 20 70 4f 70 29 3b 0a  psis[ii], pOp);.
8490: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
84a0: 73 74 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69  strncmp(zSynopsi
84b0: 73 2b 69 69 2b 31 2c 22 2b 31 22 2c 32 29 3d 3d  s+ii+1,"+1",2)==
84c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
84d0: 20 20 20 69 69 20 2b 3d 20 32 3b 0a 20 20 20 20     ii += 2;.    
84e0: 20 20 20 20 20 20 20 20 20 20 76 32 2b 2b 3b 0a            v2++;.
84f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8500: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 76 32            if( v2
8510: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >1 ){.          
8520: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
8530: 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a  intf(nTemp-jj, z
8540: 54 65 6d 70 2b 6a 6a 2c 20 22 2e 2e 25 64 22 2c  Temp+jj, "..%d",
8550: 20 76 31 2b 76 32 2d 31 29 3b 0a 20 20 20 20 20   v1+v2-1);.     
8560: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
8570: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
8580: 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b 69  ncmp(zSynopsis+i
8590: 69 2b 31 2c 20 22 2e 2e 50 33 22 2c 20 34 29 3d  i+1, "..P3", 4)=
85a0: 3d 30 20 26 26 20 70 4f 70 2d 3e 70 33 3d 3d 30  =0 && pOp->p3==0
85b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
85c0: 69 69 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ii += 4;.       
85d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
85e0: 20 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c         jj += sql
85f0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65  ite3Strlen30(zTe
8600: 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 7d 65  mp+jj);.      }e
8610: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 65  lse{.        zTe
8620: 6d 70 5b 6a 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20  mp[jj++] = c;.  
8630: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
8640: 69 66 28 20 21 73 65 65 6e 43 6f 6d 20 26 26 20  if( !seenCom && 
8650: 6a 6a 3c 6e 54 65 6d 70 2d 35 20 26 26 20 70 4f  jj<nTemp-5 && pO
8660: 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20  p->zComment ){. 
8670: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8680: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
8690: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 3b 20 25 73 22  zTemp+jj, "; %s"
86a0: 2c 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29  , pOp->zComment)
86b0: 3b 0a 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71  ;.      jj += sq
86c0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54  lite3Strlen30(zT
86d0: 65 6d 70 2b 6a 6a 29 3b 0a 20 20 20 20 7d 0a 20  emp+jj);.    }. 
86e0: 20 20 20 69 66 28 20 6a 6a 3c 6e 54 65 6d 70 20     if( jj<nTemp 
86f0: 29 20 7a 54 65 6d 70 5b 6a 6a 5d 20 3d 20 30 3b  ) zTemp[jj] = 0;
8700: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4f 70  .  }else if( pOp
8710: 2d 3e 7a 43 6f 6d 6d 65 6e 74 20 29 7b 0a 20 20  ->zComment ){.  
8720: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8730: 74 66 28 6e 54 65 6d 70 2c 20 7a 54 65 6d 70 2c  tf(nTemp, zTemp,
8740: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
8750: 6d 65 6e 74 29 3b 0a 20 20 20 20 6a 6a 20 3d 20  ment);.    jj = 
8760: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
8770: 7a 54 65 6d 70 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTemp);.  }else{
8780: 0a 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20  .    zTemp[0] = 
8790: 30 3b 0a 20 20 20 20 6a 6a 20 3d 20 30 3b 0a 20  0;.    jj = 0;. 
87a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6a 6a 3b 0a   }.  return jj;.
87b0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
87c0: 54 45 5f 44 45 42 55 47 20 2a 2f 0a 0a 23 69 66  TE_DEBUG */..#if
87d0: 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34   VDBE_DISPLAY_P4
87e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
87f0: 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53 4f 52  TE_ENABLE_CURSOR
8800: 5f 48 49 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 54 72  _HINTS)./*.** Tr
8810: 61 6e 73 6c 61 74 65 20 74 68 65 20 50 34 2e 70  anslate the P4.p
8820: 45 78 70 72 20 76 61 6c 75 65 20 66 6f 72 20 61  Expr value for a
8830: 6e 20 4f 50 5f 43 75 72 73 6f 72 48 69 6e 74 20  n OP_CursorHint 
8840: 6f 70 63 6f 64 65 20 69 6e 74 6f 20 74 65 78 74  opcode into text
8850: 0a 2a 2a 20 74 68 61 74 20 63 61 6e 20 62 65 20  .** that can be 
8860: 64 69 73 70 6c 61 79 65 64 20 69 6e 20 74 68 65  displayed in the
8870: 20 50 34 20 63 6f 6c 75 6d 6e 20 6f 66 20 45 58   P4 column of EX
8880: 50 4c 41 49 4e 20 6f 75 74 70 75 74 2e 0a 2a 2f  PLAIN output..*/
8890: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
88a0: 70 6c 61 79 50 34 45 78 70 72 28 53 74 72 41 63  playP4Expr(StrAc
88b0: 63 75 6d 20 2a 70 2c 20 45 78 70 72 20 2a 70 45  cum *p, Expr *pE
88c0: 78 70 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  xpr){.  const ch
88d0: 61 72 20 2a 7a 4f 70 20 3d 20 30 3b 0a 20 20 73  ar *zOp = 0;.  s
88e0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
88f0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
8900: 53 54 52 49 4e 47 3a 0a 20 20 20 20 20 20 73 71  STRING:.      sq
8910: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20  lite3XPrintf(p, 
8920: 22 25 51 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  "%Q", pExpr->u.z
8930: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
8940: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8950: 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20  _INTEGER:.      
8960: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8970: 2c 20 22 25 64 22 2c 20 70 45 78 70 72 2d 3e 75  , "%d", pExpr->u
8980: 2e 69 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  .iValue);.      
8990: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
89a0: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 73  TK_NULL:.      s
89b0: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
89c0: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20   "NULL");.      
89d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
89e0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
89f0: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
8a00: 6e 74 66 28 70 2c 20 22 72 5b 25 64 5d 22 2c 20  ntf(p, "r[%d]", 
8a10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a  pExpr->iTable);.
8a20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
8a40: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
8a50: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
8a60: 6e 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  n<0 ){.        s
8a70: 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c  qlite3XPrintf(p,
8a80: 20 22 72 6f 77 69 64 22 29 3b 0a 20 20 20 20 20   "rowid");.     
8a90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8aa0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8ab0: 2c 20 22 63 25 64 22 2c 20 28 69 6e 74 29 70 45  , "c%d", (int)pE
8ac0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20  xpr->iColumn);. 
8ad0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
8ae0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8af0: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 7a  se TK_LT:      z
8b00: 4f 70 20 3d 20 22 4c 54 22 3b 20 20 20 20 20 20  Op = "LT";      
8b10: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8b20: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 7a 4f 70 20  TK_LE:      zOp 
8b30: 3d 20 22 4c 45 22 3b 20 20 20 20 20 20 62 72 65  = "LE";      bre
8b40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8b50: 47 54 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22  GT:      zOp = "
8b60: 47 54 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  GT";      break;
8b70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
8b80: 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 47 45 22        zOp = "GE"
8b90: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8ba0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20    case TK_NE:   
8bb0: 20 20 20 7a 4f 70 20 3d 20 22 4e 45 22 3b 20 20     zOp = "NE";  
8bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8bd0: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
8be0: 7a 4f 70 20 3d 20 22 45 51 22 3b 20 20 20 20 20  zOp = "EQ";     
8bf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8c00: 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 4f 70   TK_IS:      zOp
8c10: 20 3d 20 22 49 53 22 3b 20 20 20 20 20 20 62 72   = "IS";      br
8c20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8c30: 5f 49 53 4e 4f 54 3a 20 20 20 7a 4f 70 20 3d 20  _ISNOT:   zOp = 
8c40: 22 49 53 4e 4f 54 22 3b 20 20 20 62 72 65 61 6b  "ISNOT";   break
8c50: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  ;.    case TK_AN
8c60: 44 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 41 4e  D:     zOp = "AN
8c70: 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  D";     break;. 
8c80: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
8c90: 20 20 20 20 7a 4f 70 20 3d 20 22 4f 52 22 3b 20      zOp = "OR"; 
8ca0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8cb0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
8cc0: 20 7a 4f 70 20 3d 20 22 41 44 44 22 3b 20 20 20   zOp = "ADD";   
8cd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8ce0: 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 7a 4f  e TK_STAR:    zO
8cf0: 70 20 3d 20 22 4d 55 4c 22 3b 20 20 20 20 20 62  p = "MUL";     b
8d00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8d10: 4b 5f 4d 49 4e 55 53 3a 20 20 20 7a 4f 70 20 3d  K_MINUS:   zOp =
8d20: 20 22 53 55 42 22 3b 20 20 20 20 20 62 72 65 61   "SUB";     brea
8d30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8d40: 45 4d 3a 20 20 20 20 20 7a 4f 70 20 3d 20 22 52  EM:     zOp = "R
8d50: 45 4d 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EM";     break;.
8d60: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
8d70: 4e 44 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 41  ND:  zOp = "BITA
8d80: 4e 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ND";  break;.   
8d90: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
8da0: 20 20 7a 4f 70 20 3d 20 22 42 49 54 4f 52 22 3b    zOp = "BITOR";
8db0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8dc0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 7a  se TK_SLASH:   z
8dd0: 4f 70 20 3d 20 22 44 49 56 22 3b 20 20 20 20 20  Op = "DIV";     
8de0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8df0: 54 4b 5f 4c 53 48 49 46 54 3a 20 20 7a 4f 70 20  TK_LSHIFT:  zOp 
8e00: 3d 20 22 4c 53 48 49 46 54 22 3b 20 20 62 72 65  = "LSHIFT";  bre
8e10: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8e20: 52 53 48 49 46 54 3a 20 20 7a 4f 70 20 3d 20 22  RSHIFT:  zOp = "
8e30: 52 53 48 49 46 54 22 3b 20 20 62 72 65 61 6b 3b  RSHIFT";  break;
8e40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e  .    case TK_CON
8e50: 43 41 54 3a 20 20 7a 4f 70 20 3d 20 22 43 4f 4e  CAT:  zOp = "CON
8e60: 43 41 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  CAT";  break;.  
8e70: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
8e80: 3a 20 20 7a 4f 70 20 3d 20 22 4d 49 4e 55 53 22  :  zOp = "MINUS"
8e90: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8ea0: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
8eb0: 7a 4f 70 20 3d 20 22 50 4c 55 53 22 3b 20 20 20  zOp = "PLUS";   
8ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8ed0: 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a 4f 70   TK_BITNOT:  zOp
8ee0: 20 3d 20 22 42 49 54 4e 4f 54 22 3b 20 20 62 72   = "BITNOT";  br
8ef0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f00: 5f 4e 4f 54 3a 20 20 20 20 20 7a 4f 70 20 3d 20  _NOT:     zOp = 
8f10: 22 4e 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  "NOT";     break
8f20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
8f30: 4e 55 4c 4c 3a 20 20 7a 4f 70 20 3d 20 22 49 53  NULL:  zOp = "IS
8f40: 4e 55 4c 4c 22 3b 20 20 62 72 65 61 6b 3b 0a 20  NULL";  break;. 
8f50: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
8f60: 4c 4c 3a 20 7a 4f 70 20 3d 20 22 4e 4f 54 4e 55  LL: zOp = "NOTNU
8f70: 4c 4c 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20  LL"; break;..   
8f80: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
8f90: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 70  sqlite3XPrintf(p
8fa0: 2c 20 22 25 73 22 2c 20 22 65 78 70 72 22 29 3b  , "%s", "expr");
8fb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8fc0: 7d 0a 0a 20 20 69 66 28 20 7a 4f 70 20 29 7b 0a  }..  if( zOp ){.
8fd0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
8fe0: 74 66 28 70 2c 20 22 25 73 28 22 2c 20 7a 4f 70  tf(p, "%s(", zOp
8ff0: 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 50 34  );.    displayP4
9000: 45 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70  Expr(p, pExpr->p
9010: 4c 65 66 74 29 3b 0a 20 20 20 20 69 66 28 20 70  Left);.    if( p
9020: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 74 72        sqlite3Str
9040: 41 63 63 75 6d 41 70 70 65 6e 64 28 70 2c 20 22  AccumAppend(p, "
9050: 2c 22 2c 20 31 29 3b 0a 20 20 20 20 20 20 64 69  ,", 1);.      di
9060: 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20 70  splayP4Expr(p, p
9070: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9080: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
9090: 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 70  StrAccumAppend(p
90a0: 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20 7d 0a 7d  , ")", 1);.  }.}
90b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 56 44 42 45 5f  .#endif /* VDBE_
90c0: 44 49 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65  DISPLAY_P4 && de
90d0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
90e0: 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53  BLE_CURSOR_HINTS
90f0: 29 20 2a 2f 0a 0a 0a 23 69 66 20 56 44 42 45 5f  ) */...#if VDBE_
9100: 44 49 53 50 4c 41 59 5f 50 34 0a 2f 2a 0a 2a 2a  DISPLAY_P4./*.**
9110: 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e   Compute a strin
9120: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
9130: 20 74 68 65 20 50 34 20 70 61 72 61 6d 65 74 65   the P4 paramete
9140: 72 20 66 6f 72 20 61 6e 20 6f 70 63 6f 64 65 2e  r for an opcode.
9150: 0a 2a 2a 20 55 73 65 20 7a 54 65 6d 70 20 66 6f  .** Use zTemp fo
9160: 72 20 61 6e 79 20 72 65 71 75 69 72 65 64 20 74  r any required t
9170: 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
9180: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
9190: 20 63 68 61 72 20 2a 64 69 73 70 6c 61 79 50 34   char *displayP4
91a0: 28 4f 70 20 2a 70 4f 70 2c 20 63 68 61 72 20 2a  (Op *pOp, char *
91b0: 7a 54 65 6d 70 2c 20 69 6e 74 20 6e 54 65 6d 70  zTemp, int nTemp
91c0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 20 3d  ){.  char *zP4 =
91d0: 20 7a 54 65 6d 70 3b 0a 20 20 53 74 72 41 63 63   zTemp;.  StrAcc
91e0: 75 6d 20 78 3b 0a 20 20 61 73 73 65 72 74 28 20  um x;.  assert( 
91f0: 6e 54 65 6d 70 3e 3d 32 30 20 29 3b 0a 20 20 73  nTemp>=20 );.  s
9200: 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49 6e  qlite3StrAccumIn
9210: 69 74 28 26 78 2c 20 30 2c 20 7a 54 65 6d 70 2c  it(&x, 0, zTemp,
9220: 20 6e 54 65 6d 70 2c 20 30 29 3b 0a 20 20 73 77   nTemp, 0);.  sw
9230: 69 74 63 68 28 20 70 4f 70 2d 3e 70 34 74 79 70  itch( pOp->p4typ
9240: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 34  e ){.    case P4
9250: 5f 4b 45 59 49 4e 46 4f 3a 20 7b 0a 20 20 20 20  _KEYINFO: {.    
9260: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 4b    int j;.      K
9270: 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
9280: 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 4b 65 79 49   = pOp->p4.pKeyI
9290: 6e 66 6f 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nfo;.      asser
92a0: 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
92b0: 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
92c0: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
92d0: 74 66 28 26 78 2c 20 22 6b 28 25 64 22 2c 20 70  tf(&x, "k(%d", p
92e0: 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 29  KeyInfo->nField)
92f0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
9300: 20 6a 3c 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69   j<pKeyInfo->nFi
9310: 65 6c 64 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  eld; j++){.     
9320: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c     CollSeq *pCol
9330: 6c 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43  l = pKeyInfo->aC
9340: 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20  oll[j];.        
9350: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
9360: 6c 20 3d 20 70 43 6f 6c 6c 20 3f 20 70 43 6f 6c  l = pColl ? pCol
9370: 6c 2d 3e 7a 4e 61 6d 65 20 3a 20 22 22 3b 0a 20  l->zName : "";. 
9380: 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
9390: 70 28 7a 43 6f 6c 6c 2c 20 22 42 49 4e 41 52 59  p(zColl, "BINARY
93a0: 22 29 3d 3d 30 20 29 20 7a 43 6f 6c 6c 20 3d 20  ")==0 ) zColl = 
93b0: 22 42 22 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  "B";.        sql
93c0: 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20  ite3XPrintf(&x, 
93d0: 22 2c 25 73 25 73 22 2c 20 70 4b 65 79 49 6e 66  ",%s%s", pKeyInf
93e0: 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 6a 5d  o->aSortOrder[j]
93f0: 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a 43 6f   ? "-" : "", zCo
9400: 6c 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ll);.      }.   
9410: 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63     sqlite3StrAcc
9420: 75 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 29 22  umAppend(&x, ")"
9430: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
9440: 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20  k;.    }.#ifdef 
9450: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55  SQLITE_ENABLE_CU
9460: 52 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63  RSOR_HINTS.    c
9470: 61 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20  ase P4_EXPR: {. 
9480: 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45 78       displayP4Ex
9490: 70 72 28 26 78 2c 20 70 4f 70 2d 3e 70 34 2e 70  pr(&x, pOp->p4.p
94a0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 62 72 65  Expr);.      bre
94b0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
94c0: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 43 4f 4c  .    case P4_COL
94d0: 4c 53 45 51 3a 20 7b 0a 20 20 20 20 20 20 43 6f  LSEQ: {.      Co
94e0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70  llSeq *pColl = p
94f0: 4f 70 2d 3e 70 34 2e 70 43 6f 6c 6c 3b 0a 20 20  Op->p4.pColl;.  
9500: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9510: 74 66 28 26 78 2c 20 22 28 25 2e 32 30 73 29 22  tf(&x, "(%.20s)"
9520: 2c 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65 29 3b  , pColl->zName);
9530: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9540: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f    }.    case P4_
9550: 46 55 4e 43 44 45 46 3a 20 7b 0a 20 20 20 20 20  FUNCDEF: {.     
9560: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
9570: 20 70 4f 70 2d 3e 70 34 2e 70 46 75 6e 63 3b 0a   pOp->p4.pFunc;.
9580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
9590: 69 6e 74 66 28 26 78 2c 20 22 25 73 28 25 64 29  intf(&x, "%s(%d)
95a0: 22 2c 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20  ", pDef->zName, 
95b0: 70 44 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20  pDef->nArg);.   
95c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
95d0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
95e0: 42 55 47 0a 20 20 20 20 63 61 73 65 20 50 34 5f  BUG.    case P4_
95f0: 46 55 4e 43 43 54 58 3a 20 7b 0a 20 20 20 20 20  FUNCCTX: {.     
9600: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 20 3d   FuncDef *pDef =
9610: 20 70 4f 70 2d 3e 70 34 2e 70 43 74 78 2d 3e 70   pOp->p4.pCtx->p
9620: 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  Func;.      sqli
9630: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9640: 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d 3e 7a  %s(%d)", pDef->z
9650: 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41 72 67  Name, pDef->nArg
9660: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9670: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
9680: 20 63 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 20   case P4_INT64: 
9690: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
96a0: 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c 64  Printf(&x, "%lld
96b0: 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e 70 49 36 34  ", *pOp->p4.pI64
96c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
96d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50      }.    case P
96e0: 34 5f 49 4e 54 33 32 3a 20 7b 0a 20 20 20 20 20  4_INT32: {.     
96f0: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9700: 26 78 2c 20 22 25 64 22 2c 20 70 4f 70 2d 3e 70  &x, "%d", pOp->p
9710: 34 2e 69 29 3b 0a 20 20 20 20 20 20 62 72 65 61  4.i);.      brea
9720: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9730: 65 20 50 34 5f 52 45 41 4c 3a 20 7b 0a 20 20 20  e P4_REAL: {.   
9740: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9750: 66 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 2a  f(&x, "%.16g", *
9760: 70 4f 70 2d 3e 70 34 2e 70 52 65 61 6c 29 3b 0a  pOp->p4.pReal);.
9770: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9780: 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 4d   }.    case P4_M
9790: 45 4d 3a 20 7b 0a 20 20 20 20 20 20 4d 65 6d 20  EM: {.      Mem 
97a0: 2a 70 4d 65 6d 20 3d 20 70 4f 70 2d 3e 70 34 2e  *pMem = pOp->p4.
97b0: 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
97c0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
97d0: 4d 5f 53 74 72 20 29 7b 0a 20 20 20 20 20 20 20  M_Str ){.       
97e0: 20 7a 50 34 20 3d 20 70 4d 65 6d 2d 3e 7a 3b 0a   zP4 = pMem->z;.
97f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
9800: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
9810: 4d 5f 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  M_Int ){.       
9820: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9830: 26 78 2c 20 22 25 6c 6c 64 22 2c 20 70 4d 65 6d  &x, "%lld", pMem
9840: 2d 3e 75 2e 69 29 3b 0a 20 20 20 20 20 20 7d 65  ->u.i);.      }e
9850: 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c  lse if( pMem->fl
9860: 61 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29  ags & MEM_Real )
9870: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9880: 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 2e  3XPrintf(&x, "%.
9890: 31 36 67 22 2c 20 70 4d 65 6d 2d 3e 75 2e 72 29  16g", pMem->u.r)
98a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
98b0: 28 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20  ( pMem->flags & 
98c0: 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20  MEM_Null ){.    
98d0: 20 20 20 20 7a 50 34 20 3d 20 22 4e 55 4c 4c 22      zP4 = "NULL"
98e0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
98f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9900: 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  Mem->flags & MEM
9910: 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 20  _Blob );.       
9920: 20 7a 50 34 20 3d 20 22 28 62 6c 6f 62 29 22 3b   zP4 = "(blob)";
9930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9940: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  reak;.    }.#ifn
9950: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9960: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20  VIRTUALTABLE.   
9970: 20 63 61 73 65 20 50 34 5f 56 54 41 42 3a 20 7b   case P4_VTAB: {
9980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
9990: 74 61 62 20 2a 70 56 74 61 62 20 3d 20 70 4f 70  tab *pVtab = pOp
99a0: 2d 3e 70 34 2e 70 56 74 61 62 2d 3e 70 56 74 61  ->p4.pVtab->pVta
99b0: 62 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  b;.      sqlite3
99c0: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 76 74 61  XPrintf(&x, "vta
99d0: 62 3a 25 70 22 2c 20 70 56 74 61 62 29 3b 0a 20  b:%p", pVtab);. 
99e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
99f0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
9a00: 65 20 50 34 5f 49 4e 54 41 52 52 41 59 3a 20 7b  e P4_INTARRAY: {
9a10: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
9a20: 20 20 20 20 69 6e 74 20 2a 61 69 20 3d 20 70 4f      int *ai = pO
9a30: 70 2d 3e 70 34 2e 61 69 3b 0a 20 20 20 20 20 20  p->p4.ai;.      
9a40: 69 6e 74 20 6e 20 3d 20 61 69 5b 30 5d 3b 20 20  int n = ai[0];  
9a50: 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 65 6c   /* The first el
9a60: 65 6d 65 6e 74 20 6f 66 20 61 6e 20 49 4e 54 41  ement of an INTA
9a70: 52 52 41 59 20 69 73 20 61 6c 77 61 79 73 20 74  RRAY is always t
9a80: 68 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  he.             
9a90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 75            ** cou
9aa0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
9ab0: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 74 6f 20   of elements to 
9ac0: 66 6f 6c 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20  follow */.      
9ad0: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b  for(i=1; i<n; i+
9ae0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  +){.        sqli
9af0: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9b00: 2c 25 64 22 2c 20 61 69 5b 69 5d 29 3b 0a 20 20  ,%d", ai[i]);.  
9b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 54 65 6d      }.      zTem
9b20: 70 5b 30 5d 20 3d 20 27 5b 27 3b 0a 20 20 20 20  p[0] = '[';.    
9b30: 20 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75    sqlite3StrAccu
9b40: 6d 41 70 70 65 6e 64 28 26 78 2c 20 22 5d 22 2c  mAppend(&x, "]",
9b50: 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   1);.      break
9b60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9b70: 20 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 3a 20   P4_SUBPROGRAM: 
9b80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  {.      sqlite3X
9b90: 50 72 69 6e 74 66 28 26 78 2c 20 22 70 72 6f 67  Printf(&x, "prog
9ba0: 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ram");.      bre
9bb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9bc0: 73 65 20 50 34 5f 41 44 56 41 4e 43 45 3a 20 7b  se P4_ADVANCE: {
9bd0: 0a 20 20 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20  .      zTemp[0] 
9be0: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
9bf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9c00: 20 50 34 5f 54 41 42 4c 45 3a 20 7b 0a 20 20 20   P4_TABLE: {.   
9c10: 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74     sqlite3XPrint
9c20: 66 28 26 78 2c 20 22 25 73 22 2c 20 70 4f 70 2d  f(&x, "%s", pOp-
9c30: 3e 70 34 2e 70 54 61 62 2d 3e 7a 4e 61 6d 65 29  >p4.pTab->zName)
9c40: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9c50: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
9c60: 3a 20 7b 0a 20 20 20 20 20 20 7a 50 34 20 3d 20  : {.      zP4 = 
9c70: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
9c80: 20 69 66 28 20 7a 50 34 3d 3d 30 20 29 7b 0a 20   if( zP4==0 ){. 
9c90: 20 20 20 20 20 20 20 7a 50 34 20 3d 20 7a 54 65         zP4 = zTe
9ca0: 6d 70 3b 0a 20 20 20 20 20 20 20 20 7a 54 65 6d  mp;.        zTem
9cb0: 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  p[0] = 0;.      
9cc0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
9cd0: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e  lite3StrAccumFin
9ce0: 69 73 68 28 26 78 29 3b 0a 20 20 61 73 73 65 72  ish(&x);.  asser
9cf0: 74 28 20 7a 50 34 21 3d 30 20 29 3b 0a 20 20 72  t( zP4!=0 );.  r
9d00: 65 74 75 72 6e 20 7a 50 34 3b 0a 7d 0a 23 65 6e  eturn zP4;.}.#en
9d10: 64 69 66 20 2f 2a 20 56 44 42 45 5f 44 49 53 50  dif /* VDBE_DISP
9d20: 4c 41 59 5f 50 34 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  LAY_P4 */../*.**
9d30: 20 44 65 63 6c 61 72 65 20 74 6f 20 74 68 65 20   Declare to the 
9d40: 56 64 62 65 20 74 68 61 74 20 74 68 65 20 42 54  Vdbe that the BT
9d50: 72 65 65 20 6f 62 6a 65 63 74 20 61 74 20 64 62  ree object at db
9d60: 2d 3e 61 44 62 5b 69 5d 20 69 73 20 75 73 65 64  ->aDb[i] is used
9d70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 70  ..**.** The prep
9d80: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
9d90: 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 6e 20  need to know in 
9da0: 61 64 76 61 6e 63 65 20 74 68 65 20 63 6f 6d 70  advance the comp
9db0: 6c 65 74 65 20 73 65 74 20 6f 66 0a 2a 2a 20 61  lete set of.** a
9dc0: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
9dd0: 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 75  s that will be u
9de0: 73 65 2e 20 20 41 20 6d 61 73 6b 20 6f 66 20 74  se.  A mask of t
9df0: 68 65 73 65 20 64 61 74 61 62 61 73 65 73 0a 2a  hese databases.*
9e00: 2a 20 69 73 20 6d 61 69 6e 74 61 69 6e 65 64 20  * is maintained 
9e10: 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2e  in p->btreeMask.
9e20: 20 20 54 68 65 20 70 2d 3e 6c 6f 63 6b 4d 61 73    The p->lockMas
9e30: 6b 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73  k value is the s
9e40: 75 62 73 65 74 20 6f 66 0a 2a 2a 20 70 2d 3e 62  ubset of.** p->b
9e50: 74 72 65 65 4d 61 73 6b 20 6f 66 20 64 61 74 61  treeMask of data
9e60: 62 61 73 65 73 20 74 68 61 74 20 77 69 6c 6c 20  bases that will 
9e70: 72 65 71 75 69 72 65 20 61 20 6c 6f 63 6b 2e 0a  require a lock..
9e80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
9e90: 64 62 65 55 73 65 73 42 74 72 65 65 28 56 64 62  dbeUsesBtree(Vdb
9ea0: 65 20 2a 70 2c 20 69 6e 74 20 69 29 7b 0a 20 20  e *p, int i){.  
9eb0: 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
9ec0: 69 3c 70 2d 3e 64 62 2d 3e 6e 44 62 20 26 26 20  i<p->db->nDb && 
9ed0: 69 3c 28 69 6e 74 29 73 69 7a 65 6f 66 28 79 44  i<(int)sizeof(yD
9ee0: 62 4d 61 73 6b 29 2a 38 20 29 3b 0a 20 20 61 73  bMask)*8 );.  as
9ef0: 73 65 72 74 28 20 69 3c 28 69 6e 74 29 73 69 7a  sert( i<(int)siz
9f00: 65 6f 66 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b  eof(p->btreeMask
9f10: 29 2a 38 20 29 3b 0a 20 20 44 62 4d 61 73 6b 53  )*8 );.  DbMaskS
9f20: 65 74 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 2c  et(p->btreeMask,
9f30: 20 69 29 3b 0a 20 20 69 66 28 20 69 21 3d 31 20   i);.  if( i!=1 
9f40: 26 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  && sqlite3BtreeS
9f50: 68 61 72 61 62 6c 65 28 70 2d 3e 64 62 2d 3e 61  harable(p->db->a
9f60: 44 62 5b 69 5d 2e 70 42 74 29 20 29 7b 0a 20 20  Db[i].pBt) ){.  
9f70: 20 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 6c    DbMaskSet(p->l
9f80: 6f 63 6b 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 7d  ockMask, i);.  }
9f90: 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .}..#if !defined
9fa0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9fb0: 52 45 44 5f 43 41 43 48 45 29 0a 2f 2a 0a 2a 2a  RED_CACHE)./*.**
9fc0: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f   If SQLite is co
9fd0: 6d 70 69 6c 65 64 20 74 6f 20 73 75 70 70 6f 72  mpiled to suppor
9fe0: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
9ff0: 6f 64 65 20 61 6e 64 20 74 6f 20 62 65 20 74 68  ode and to be th
a000: 72 65 61 64 73 61 66 65 2c 0a 2a 2a 20 74 68 69  readsafe,.** thi
a010: 73 20 72 6f 75 74 69 6e 65 20 6f 62 74 61 69 6e  s routine obtain
a020: 73 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  s the mutex asso
a030: 63 69 61 74 65 64 20 77 69 74 68 20 65 61 63 68  ciated with each
a040: 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63 74   BtShared struct
a050: 75 72 65 0a 2a 2a 20 74 68 61 74 20 6d 61 79 20  ure.** that may 
a060: 62 65 20 61 63 63 65 73 73 65 64 20 62 79 20 74  be accessed by t
a070: 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
a080: 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 6e 20  an argument. In 
a090: 64 6f 69 6e 67 20 73 6f 20 69 74 20 61 6c 73 6f  doing so it also
a0a0: 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 42 74 53  .** sets the BtS
a0b0: 68 61 72 65 64 2e 64 62 20 6d 65 6d 62 65 72 20  hared.db member 
a0c0: 6f 66 20 65 61 63 68 20 6f 66 20 74 68 65 20 42  of each of the B
a0d0: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
a0e0: 65 73 2c 20 65 6e 73 75 72 69 6e 67 0a 2a 2a 20  es, ensuring.** 
a0f0: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
a100: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61   busy-handler ca
a110: 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65  llback is invoke
a120: 64 20 69 66 20 72 65 71 75 69 72 65 64 2e 0a 2a  d if required..*
a130: 2a 0a 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69  *.** If SQLite i
a140: 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65  s not threadsafe
a150: 20 62 75 74 20 64 6f 65 73 20 73 75 70 70 6f 72   but does suppor
a160: 74 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 6d  t shared-cache m
a170: 6f 64 65 2c 20 74 68 65 6e 0a 2a 2a 20 73 71 6c  ode, then.** sql
a180: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 29  ite3BtreeEnter()
a190: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73   is invoked to s
a1a0: 65 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  et the BtShared.
a1b0: 64 62 20 76 61 72 69 61 62 6c 65 73 0a 2a 2a 20  db variables.** 
a1c0: 6f 66 20 61 6c 6c 20 6f 66 20 42 74 53 68 61 72  of all of BtShar
a1d0: 65 64 20 73 74 72 75 63 74 75 72 65 73 20 61 63  ed structures ac
a1e0: 63 65 73 73 69 62 6c 65 20 76 69 61 20 74 68 65  cessible via the
a1f0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
a200: 20 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20   .** associated 
a210: 77 69 74 68 20 74 68 65 20 56 4d 2e 0a 2a 2a 0a  with the VM..**.
a220: 2a 2a 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  ** If SQLite is 
a230: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 20 61  not threadsafe a
a240: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 73 75 70 70  nd does not supp
a250: 6f 72 74 20 73 68 61 72 65 64 2d 63 61 63 68 65  ort shared-cache
a260: 20 6d 6f 64 65 2c 20 74 68 69 73 0a 2a 2a 20 66   mode, this.** f
a270: 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
a280: 6f 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 2d  op..**.** The p-
a290: 3e 62 74 72 65 65 4d 61 73 6b 20 66 69 65 6c 64  >btreeMask field
a2a0: 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66   is a bitmask of
a2b0: 20 61 6c 6c 20 62 74 72 65 65 73 20 74 68 61 74   all btrees that
a2c0: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 0a 2a   the prepared .*
a2d0: 2a 20 73 74 61 74 65 6d 65 6e 74 20 70 20 77 69  * statement p wi
a2e0: 6c 6c 20 65 76 65 72 20 75 73 65 2e 20 20 4c 65  ll ever use.  Le
a2f0: 74 20 4e 20 62 65 20 74 68 65 20 6e 75 6d 62 65  t N be the numbe
a300: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 70 2d 3e  r of bits in p->
a310: 62 74 72 65 65 4d 61 73 6b 0a 2a 2a 20 63 6f 72  btreeMask.** cor
a320: 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 62 74  responding to bt
a330: 72 65 65 73 20 74 68 61 74 20 75 73 65 20 73 68  rees that use sh
a340: 61 72 65 64 20 63 61 63 68 65 2e 20 20 54 68 65  ared cache.  The
a350: 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 6f 66  n the runtime of
a360: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
a370: 20 69 73 20 4e 2a 4e 2e 20 20 42 75 74 20 61 73   is N*N.  But as
a380: 20 4e 20 69 73 20 72 61 72 65 6c 79 20 6d 6f 72   N is rarely mor
a390: 65 20 74 68 61 6e 20 31 2c 20 74 68 69 73 20 73  e than 1, this s
a3a0: 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 62 65 20  hould not.** be 
a3b0: 61 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f  a problem..*/.vo
a3c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e  id sqlite3VdbeEn
a3d0: 74 65 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20  ter(Vdbe *p){.  
a3e0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
a3f0: 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44 62 3b   *db;.  Db *aDb;
a400: 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20 69 66  .  int nDb;.  if
a410: 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28  ( DbMaskAllZero(
a420: 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20 72  p->lockMask) ) r
a430: 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20 63  eturn;  /* The c
a440: 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20 20  ommon case */.  
a450: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
a460: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
a470: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
a480: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
a490: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
a4a0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
a4b0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
a4c0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
a4d0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
a4e0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
a4f0: 74 65 72 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ter(aDb[i].pBt);
a500: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6e  .    }.  }.}.#en
a510: 64 69 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  dif..#if !define
a520: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  d(SQLITE_OMIT_SH
a530: 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20 53  ARED_CACHE) && S
a540: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
a550: 3e 30 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20  >0./*.** Unlock 
a560: 61 6c 6c 20 6f 66 20 74 68 65 20 62 74 72 65 65  all of the btree
a570: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  s previously loc
a580: 6b 65 64 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  ked by a call to
a590: 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74 65   sqlite3VdbeEnte
a5a0: 72 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 53  r()..*/.static S
a5b0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
a5c0: 6f 69 64 20 76 64 62 65 4c 65 61 76 65 28 56 64  oid vdbeLeave(Vd
a5d0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  be *p){.  int i;
a5e0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
a5f0: 20 20 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74    Db *aDb;.  int
a600: 20 6e 44 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   nDb;.  db = p->
a610: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
a620: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
a630: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
a640: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
a650: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
a660: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
a670: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
a680: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
a690: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a6a0: 33 42 74 72 65 65 4c 65 61 76 65 28 61 44 62 5b  3BtreeLeave(aDb[
a6b0: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
a6c0: 20 7d 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65   }.}.void sqlite
a6d0: 33 56 64 62 65 4c 65 61 76 65 28 56 64 62 65 20  3VdbeLeave(Vdbe 
a6e0: 2a 70 29 7b 0a 20 20 69 66 28 20 44 62 4d 61 73  *p){.  if( DbMas
a6f0: 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b  kAllZero(p->lock
a700: 4d 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20  Mask) ) return; 
a710: 20 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63   /* The common c
a720: 61 73 65 20 2a 2f 0a 20 20 76 64 62 65 4c 65 61  ase */.  vdbeLea
a730: 76 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a  ve(p);.}.#endif.
a740: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 56 44 42  .#if defined(VDB
a750: 45 5f 50 52 4f 46 49 4c 45 29 20 7c 7c 20 64 65  E_PROFILE) || de
a760: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
a770: 55 47 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  UG)./*.** Print 
a780: 61 20 73 69 6e 67 6c 65 20 6f 70 63 6f 64 65 2e  a single opcode.
a790: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
a7a0: 73 20 75 73 65 64 20 66 6f 72 20 64 65 62 75 67  s used for debug
a7b0: 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 76 6f  ging only..*/.vo
a7c0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50 72  id sqlite3VdbePr
a7d0: 69 6e 74 4f 70 28 46 49 4c 45 20 2a 70 4f 75 74  intOp(FILE *pOut
a7e0: 2c 20 69 6e 74 20 70 63 2c 20 4f 70 20 2a 70 4f  , int pc, Op *pO
a7f0: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 34 3b  p){.  char *zP4;
a800: 0a 20 20 63 68 61 72 20 7a 50 74 72 5b 35 30 5d  .  char zPtr[50]
a810: 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6d 5b 31 30  ;.  char zCom[10
a820: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  0];.  static con
a830: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
a840: 31 20 3d 20 22 25 34 64 20 25 2d 31 33 73 20 25  1 = "%4d %-13s %
a850: 34 64 20 25 34 64 20 25 34 64 20 25 2d 31 33 73  4d %4d %4d %-13s
a860: 20 25 2e 32 58 20 25 73 5c 6e 22 3b 0a 20 20 69   %.2X %s\n";.  i
a870: 66 28 20 70 4f 75 74 3d 3d 30 20 29 20 70 4f 75  f( pOut==0 ) pOu
a880: 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7a 50  t = stdout;.  zP
a890: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
a8a0: 70 2c 20 7a 50 74 72 2c 20 73 69 7a 65 6f 66 28  p, zPtr, sizeof(
a8b0: 7a 50 74 72 29 29 3b 0a 23 69 66 64 65 66 20 53  zPtr));.#ifdef S
a8c0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 45 58 50  QLITE_ENABLE_EXP
a8d0: 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20  LAIN_COMMENTS.  
a8e0: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 70  displayComment(p
a8f0: 4f 70 2c 20 7a 50 34 2c 20 7a 43 6f 6d 2c 20 73  Op, zP4, zCom, s
a900: 69 7a 65 6f 66 28 7a 43 6f 6d 29 29 3b 0a 23 65  izeof(zCom));.#e
a910: 6c 73 65 0a 20 20 7a 43 6f 6d 5b 30 5d 20 3d 20  lse.  zCom[0] = 
a920: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 4e  0;.#endif.  /* N
a930: 42 3a 20 20 54 68 65 20 73 71 6c 69 74 65 33 4f  B:  The sqlite3O
a940: 70 63 6f 64 65 4e 61 6d 65 28 29 20 66 75 6e 63  pcodeName() func
a950: 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
a960: 74 65 64 20 62 79 20 63 6f 64 65 20 63 72 65 61  ted by code crea
a970: 74 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ted.  ** by the 
a980: 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 61 6e  mkopcodeh.awk an
a990: 64 20 6d 6b 6f 70 63 6f 64 65 63 2e 61 77 6b 20  d mkopcodec.awk 
a9a0: 73 63 72 69 70 74 73 20 77 68 69 63 68 20 65 78  scripts which ex
a9b0: 74 72 61 63 74 20 74 68 65 0a 20 20 2a 2a 20 69  tract the.  ** i
a9c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
a9d0: 74 68 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63  the vdbe.c sourc
a9e0: 65 20 74 65 78 74 20 2a 2f 0a 20 20 66 70 72 69  e text */.  fpri
a9f0: 6e 74 66 28 70 4f 75 74 2c 20 7a 46 6f 72 6d 61  ntf(pOut, zForma
aa00: 74 31 2c 20 70 63 2c 20 0a 20 20 20 20 20 20 73  t1, pc, .      s
aa10: 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d 65  qlite3OpcodeName
aa20: 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 2c 20 70  (pOp->opcode), p
aa30: 4f 70 2d 3e 70 31 2c 20 70 4f 70 2d 3e 70 32 2c  Op->p1, pOp->p2,
aa40: 20 70 4f 70 2d 3e 70 33 2c 20 7a 50 34 2c 20 70   pOp->p3, zP4, p
aa50: 4f 70 2d 3e 70 35 2c 0a 20 20 20 20 20 20 7a 43  Op->p5,.      zC
aa60: 6f 6d 0a 20 20 29 3b 0a 20 20 66 66 6c 75 73 68  om.  );.  fflush
aa70: 28 70 4f 75 74 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pOut);.}.#endif
aa80: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
aa90: 61 6e 20 61 72 72 61 79 20 6f 66 20 4e 20 4d 65  an array of N Me
aaa0: 6d 20 65 6c 65 6d 65 6e 74 73 0a 2a 2f 0a 73 74  m elements.*/.st
aab0: 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73  atic void releas
aac0: 65 4d 65 6d 41 72 72 61 79 28 4d 65 6d 20 2a 70  eMemArray(Mem *p
aad0: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 69 66 28 20  , int N){.  if( 
aae0: 70 20 26 26 20 4e 20 29 7b 0a 20 20 20 20 4d 65  p && N ){.    Me
aaf0: 6d 20 2a 70 45 6e 64 20 3d 20 26 70 5b 4e 5d 3b  m *pEnd = &p[N];
ab00: 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62  .    sqlite3 *db
ab10: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66   = p->db;.    if
ab20: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
ab30: 65 64 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a  ed ){.      do{.
ab40: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 73          if( p->s
ab50: 7a 4d 61 6c 6c 6f 63 20 29 20 73 71 6c 69 74 65  zMalloc ) sqlite
ab60: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
ab70: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 7d  Malloc);.      }
ab80: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
ab90: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
aba0: 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b  n;.    }.    do{
abb0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
abc0: 26 70 5b 31 5d 29 3d 3d 70 45 6e 64 20 7c 7c 20  &p[1])==pEnd || 
abd0: 70 5b 30 5d 2e 64 62 3d 3d 70 5b 31 5d 2e 64 62  p[0].db==p[1].db
abe0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
abf0: 28 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65  ( sqlite3VdbeChe
ac00: 63 6b 4d 65 6d 49 6e 76 61 72 69 61 6e 74 73 28  ckMemInvariants(
ac10: 70 29 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  p) );..      /* 
ac20: 54 68 69 73 20 62 6c 6f 63 6b 20 69 73 20 72 65  This block is re
ac30: 61 6c 6c 79 20 61 6e 20 69 6e 6c 69 6e 65 64 20  ally an inlined 
ac40: 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
ac50: 65 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65  e3VdbeMemRelease
ac60: 28 29 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ().      ** that
ac70: 20 74 61 6b 65 73 20 61 64 76 61 6e 74 61 67 65   takes advantage
ac80: 20 6f 66 20 74 68 65 20 66 61 63 74 20 74 68 61   of the fact tha
ac90: 74 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  t the memory cel
aca0: 6c 20 76 61 6c 75 65 20 69 73 20 0a 20 20 20 20  l value is .    
acb0: 20 20 2a 2a 20 62 65 69 6e 67 20 73 65 74 20 74    ** being set t
acc0: 6f 20 4e 55 4c 4c 20 61 66 74 65 72 20 72 65 6c  o NULL after rel
acd0: 65 61 73 69 6e 67 20 61 6e 79 20 64 79 6e 61 6d  easing any dynam
ace0: 69 63 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20  ic resources..  
acf0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
ad00: 54 68 65 20 6a 75 73 74 69 66 69 63 61 74 69 6f  The justificatio
ad10: 6e 20 66 6f 72 20 64 75 70 6c 69 63 61 74 69 6e  n for duplicatin
ad20: 67 20 63 6f 64 65 20 69 73 20 74 68 61 74 20 61  g code is that a
ad30: 63 63 6f 72 64 69 6e 67 20 74 6f 20 0a 20 20 20  ccording to .   
ad40: 20 20 20 2a 2a 20 63 61 6c 6c 67 72 69 6e 64 2c     ** callgrind,
ad50: 20 74 68 69 73 20 63 61 75 73 65 73 20 61 20 63   this causes a c
ad60: 65 72 74 61 69 6e 20 74 65 73 74 20 63 61 73 65  ertain test case
ad70: 20 74 6f 20 68 69 74 20 74 68 65 20 43 50 55 20   to hit the CPU 
ad80: 34 2e 37 20 0a 20 20 20 20 20 20 2a 2a 20 70 65  4.7 .      ** pe
ad90: 72 63 65 6e 74 20 6c 65 73 73 20 28 78 38 36 20  rcent less (x86 
ada0: 6c 69 6e 75 78 2c 20 67 63 63 20 76 65 72 73 69  linux, gcc versi
adb0: 6f 6e 20 34 2e 31 2e 32 2c 20 2d 4f 36 29 20 74  on 4.1.2, -O6) t
adc0: 68 61 6e 20 69 66 20 0a 20 20 20 20 20 20 2a 2a  han if .      **
add0: 20 73 71 6c 69 74 65 33 4d 65 6d 52 65 6c 65 61   sqlite3MemRelea
ade0: 73 65 28 29 20 77 65 72 65 20 63 61 6c 6c 65 64  se() were called
adf0: 20 66 72 6f 6d 20 68 65 72 65 2e 20 57 69 74 68   from here. With
ae00: 20 2d 4f 32 2c 20 74 68 69 73 20 6a 75 6d 70 73   -O2, this jumps
ae10: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 36 2e 36  .      ** to 6.6
ae20: 20 70 65 72 63 65 6e 74 2e 20 54 68 65 20 74 65   percent. The te
ae30: 73 74 20 63 61 73 65 20 69 73 20 69 6e 73 65 72  st case is inser
ae40: 74 69 6e 67 20 31 30 30 30 20 72 6f 77 73 20 69  ting 1000 rows i
ae50: 6e 74 6f 20 61 20 74 61 62 6c 65 20 0a 20 20 20  nto a table .   
ae60: 20 20 20 2a 2a 20 77 69 74 68 20 6e 6f 20 69 6e     ** with no in
ae70: 64 65 78 65 73 20 75 73 69 6e 67 20 61 20 73 69  dexes using a si
ae80: 6e 67 6c 65 20 70 72 65 70 61 72 65 64 20 49 4e  ngle prepared IN
ae90: 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 2c 20  SERT statement, 
aea0: 62 69 6e 64 28 29 20 0a 20 20 20 20 20 20 2a 2a  bind() .      **
aeb0: 20 61 6e 64 20 72 65 73 65 74 28 29 2e 20 49 6e   and reset(). In
aec0: 73 65 72 74 73 20 61 72 65 20 67 72 6f 75 70 65  serts are groupe
aed0: 64 20 69 6e 74 6f 20 61 20 74 72 61 6e 73 61 63  d into a transac
aee0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
aef0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
af00: 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 41 67  ->flags & MEM_Ag
af10: 67 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  g );.      testc
af20: 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20  ase( p->flags & 
af30: 4d 45 4d 5f 44 79 6e 20 29 3b 0a 20 20 20 20 20  MEM_Dyn );.     
af40: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
af50: 61 67 73 20 26 20 4d 45 4d 5f 46 72 61 6d 65 20  ags & MEM_Frame 
af60: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
af70: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
af80: 4d 5f 52 6f 77 53 65 74 20 29 3b 0a 20 20 20 20  M_RowSet );.    
af90: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 28    if( p->flags&(
afa0: 4d 45 4d 5f 41 67 67 7c 4d 45 4d 5f 44 79 6e 7c  MEM_Agg|MEM_Dyn|
afb0: 4d 45 4d 5f 46 72 61 6d 65 7c 4d 45 4d 5f 52 6f  MEM_Frame|MEM_Ro
afc0: 77 53 65 74 29 20 29 7b 0a 20 20 20 20 20 20 20  wSet) ){.       
afd0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
afe0: 65 6c 65 61 73 65 28 70 29 3b 0a 20 20 20 20 20  elease(p);.     
aff0: 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 73 7a   }else if( p->sz
b000: 4d 61 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20  Malloc ){.      
b010: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
b020: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
b030: 0a 20 20 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61  .        p->szMa
b040: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
b050: 7d 0a 0a 20 20 20 20 20 20 70 2d 3e 66 6c 61 67  }..      p->flag
b060: 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  s = MEM_Undefine
b070: 64 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 28  d;.    }while( (
b080: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 7d  ++p)<pEnd );.  }
b090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
b0a0: 20 61 20 56 64 62 65 46 72 61 6d 65 20 6f 62 6a   a VdbeFrame obj
b0b0: 65 63 74 20 61 6e 64 20 69 74 73 20 63 6f 6e 74  ect and its cont
b0c0: 65 6e 74 73 2e 20 56 64 62 65 46 72 61 6d 65 20  ents. VdbeFrame 
b0d0: 6f 62 6a 65 63 74 73 20 61 72 65 0a 2a 2a 20 61  objects are.** a
b0e0: 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 65 20  llocated by the 
b0f0: 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63 6f 64  OP_Program opcod
b100: 65 20 69 6e 20 73 71 6c 69 74 65 33 56 64 62 65  e in sqlite3Vdbe
b110: 45 78 65 63 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20  Exec()..*/.void 
b120: 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65  sqlite3VdbeFrame
b130: 44 65 6c 65 74 65 28 56 64 62 65 46 72 61 6d 65  Delete(VdbeFrame
b140: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
b150: 20 4d 65 6d 20 2a 61 4d 65 6d 20 3d 20 56 64 62   Mem *aMem = Vdb
b160: 65 46 72 61 6d 65 4d 65 6d 28 70 29 3b 0a 20 20  eFrameMem(p);.  
b170: 56 64 62 65 43 75 72 73 6f 72 20 2a 2a 61 70 43  VdbeCursor **apC
b180: 73 72 20 3d 20 28 56 64 62 65 43 75 72 73 6f 72  sr = (VdbeCursor
b190: 20 2a 2a 29 26 61 4d 65 6d 5b 70 2d 3e 6e 43 68   **)&aMem[p->nCh
b1a0: 69 6c 64 4d 65 6d 5d 3b 0a 20 20 66 6f 72 28 69  ildMem];.  for(i
b1b0: 3d 30 3b 20 69 3c 70 2d 3e 6e 43 68 69 6c 64 43  =0; i<p->nChildC
b1c0: 73 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  sr; i++){.    sq
b1d0: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
b1e0: 73 6f 72 28 70 2d 3e 76 2c 20 61 70 43 73 72 5b  sor(p->v, apCsr[
b1f0: 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  i]);.  }.  relea
b200: 73 65 4d 65 6d 41 72 72 61 79 28 61 4d 65 6d 2c  seMemArray(aMem,
b210: 20 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 29 3b 0a   p->nChildMem);.
b220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c    sqlite3VdbeDel
b230: 65 74 65 41 75 78 44 61 74 61 28 70 2d 3e 76 2d  eteAuxData(p->v-
b240: 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78 44 61 74  >db, &p->pAuxDat
b250: 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 73 71 6c  a, -1, 0);.  sql
b260: 69 74 65 33 44 62 46 72 65 65 28 70 2d 3e 76 2d  ite3DbFree(p->v-
b270: 3e 64 62 2c 20 70 29 3b 0a 7d 0a 0a 23 69 66 6e  >db, p);.}..#ifn
b280: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b290: 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 47 69  EXPLAIN./*.** Gi
b2a0: 76 65 20 61 20 6c 69 73 74 69 6e 67 20 6f 66 20  ve a listing of 
b2b0: 74 68 65 20 70 72 6f 67 72 61 6d 20 69 6e 20 74  the program in t
b2c0: 68 65 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  he virtual machi
b2d0: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ne..**.** The in
b2e0: 74 65 72 66 61 63 65 20 69 73 20 74 68 65 20 73  terface is the s
b2f0: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 56 64  ame as sqlite3Vd
b300: 62 65 45 78 65 63 28 29 2e 20 20 42 75 74 20 69  beExec().  But i
b310: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 72 75 6e  nstead of.** run
b320: 6e 69 6e 67 20 74 68 65 20 63 6f 64 65 2c 20 69  ning the code, i
b330: 74 20 69 6e 76 6f 6b 65 73 20 74 68 65 20 63 61  t invokes the ca
b340: 6c 6c 62 61 63 6b 20 6f 6e 63 65 20 66 6f 72 20  llback once for 
b350: 65 61 63 68 20 69 6e 73 74 72 75 63 74 69 6f 6e  each instruction
b360: 2e 0a 2a 2a 20 54 68 69 73 20 66 65 61 74 75 72  ..** This featur
b370: 65 20 69 73 20 75 73 65 64 20 74 6f 20 69 6d 70  e is used to imp
b380: 6c 65 6d 65 6e 74 20 22 45 58 50 4c 41 49 4e 22  lement "EXPLAIN"
b390: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e  ..**.** When p->
b3a0: 65 78 70 6c 61 69 6e 3d 3d 31 2c 20 65 61 63 68  explain==1, each
b3b0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20   instruction is 
b3c0: 6c 69 73 74 65 64 2e 20 20 57 68 65 6e 0a 2a 2a  listed.  When.**
b3d0: 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 2c 20   p->explain==2, 
b3e0: 6f 6e 6c 79 20 4f 50 5f 45 78 70 6c 61 69 6e 20  only OP_Explain 
b3f0: 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 61 72 65  instructions are
b400: 20 6c 69 73 74 65 64 20 61 6e 64 20 74 68 65 73   listed and thes
b410: 65 0a 2a 2a 20 61 72 65 20 73 68 6f 77 6e 20 69  e.** are shown i
b420: 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20 66 6f  n a different fo
b430: 72 6d 61 74 2e 20 20 70 2d 3e 65 78 70 6c 61 69  rmat.  p->explai
b440: 6e 3d 3d 32 20 69 73 20 75 73 65 64 20 74 6f 20  n==2 is used to 
b450: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 45 58 50  implement.** EXP
b460: 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 2e  LAIN QUERY PLAN.
b470: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 2d 3e 65  .**.** When p->e
b480: 78 70 6c 61 69 6e 3d 3d 31 2c 20 66 69 72 73 74  xplain==1, first
b490: 20 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61   the main progra
b4a0: 6d 20 69 73 20 6c 69 73 74 65 64 2c 20 74 68 65  m is listed, the
b4b0: 6e 20 65 61 63 68 20 6f 66 0a 2a 2a 20 74 68 65  n each of.** the
b4c0: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
b4d0: 72 61 6d 73 20 61 72 65 20 6c 69 73 74 65 64 20  rams are listed 
b4e0: 6f 6e 65 20 62 79 20 6f 6e 65 2e 0a 2a 2f 0a 69  one by one..*/.i
b4f0: 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69  nt sqlite3VdbeLi
b500: 73 74 28 0a 20 20 56 64 62 65 20 2a 70 20 20 20  st(.  Vdbe *p   
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 2f 2a 20 54 68 65 20 56 44 42 45 20 2a 2f 0a 29  /* The VDBE */.)
b530: 7b 0a 20 20 69 6e 74 20 6e 52 6f 77 3b 20 20 20  {.  int nRow;   
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 70           /* Stop
b560: 20 77 68 65 6e 20 72 6f 77 20 63 6f 75 6e 74 20   when row count 
b570: 72 65 61 63 68 65 73 20 74 68 69 73 20 2a 2f 0a  reaches this */.
b580: 20 20 69 6e 74 20 6e 53 75 62 20 3d 20 30 3b 20    int nSub = 0; 
b590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b5b0: 20 6f 66 20 73 75 62 2d 76 64 62 65 73 20 73 65   of sub-vdbes se
b5c0: 65 6e 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 53  en so far */.  S
b5d0: 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61 70 53 75  ubProgram **apSu
b5e0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
b5f0: 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
b600: 73 75 62 2d 76 64 62 65 73 20 2a 2f 0a 20 20 4d  sub-vdbes */.  M
b610: 65 6d 20 2a 70 53 75 62 20 3d 20 30 3b 20 20 20  em *pSub = 0;   
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65      /* Memory ce
b640: 6c 6c 20 68 6f 6c 64 20 61 72 72 61 79 20 6f 66  ll hold array of
b650: 20 73 75 62 70 72 6f 67 73 20 2a 2f 0a 20 20 73   subprogs */.  s
b660: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
b670: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
b680: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
b690: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
b6a0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
b6d0: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
b6e0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
b6f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b700: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
b710: 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d  e */.  Mem *pMem
b720: 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b 20   = &p->aMem[1]; 
b730: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
b740: 69 72 73 74 20 4d 65 6d 20 6f 66 20 72 65 73 75  irst Mem of resu
b750: 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 61 73 73  lt set */..  ass
b760: 65 72 74 28 20 70 2d 3e 65 78 70 6c 61 69 6e 20  ert( p->explain 
b770: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
b780: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
b790: 43 5f 52 55 4e 20 29 3b 0a 20 20 61 73 73 65 72  C_RUN );.  asser
b7a0: 74 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  t( p->rc==SQLITE
b7b0: 5f 4f 4b 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51  _OK || p->rc==SQ
b7c0: 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 70 2d 3e  LITE_BUSY || p->
b7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b7e0: 20 29 3b 0a 0a 20 20 2f 2a 20 45 76 65 6e 20 74   );..  /* Even t
b7f0: 68 6f 75 67 68 20 74 68 69 73 20 6f 70 63 6f 64  hough this opcod
b800: 65 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 64  e does not use d
b810: 79 6e 61 6d 69 63 20 73 74 72 69 6e 67 73 20 66  ynamic strings f
b820: 6f 72 0a 20 20 2a 2a 20 74 68 65 20 72 65 73 75  or.  ** the resu
b830: 6c 74 2c 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  lt, result colum
b840: 6e 73 20 6d 61 79 20 62 65 63 6f 6d 65 20 64 79  ns may become dy
b850: 6e 61 6d 69 63 20 69 66 20 74 68 65 20 75 73 65  namic if the use
b860: 72 20 63 61 6c 6c 73 0a 20 20 2a 2a 20 73 71 6c  r calls.  ** sql
b870: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
b880: 31 36 28 29 2c 20 63 61 75 73 69 6e 67 20 61 20  16(), causing a 
b890: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 74 6f 20 55  translation to U
b8a0: 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 2e 0a  TF-16 encoding..
b8b0: 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65 4d 65    */.  releaseMe
b8c0: 6d 41 72 72 61 79 28 70 4d 65 6d 2c 20 38 29 3b  mArray(pMem, 8);
b8d0: 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74  .  p->pResultSet
b8e0: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 2d 3e   = 0;..  if( p->
b8f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
b900: 5f 42 4b 50 54 20 29 7b 0a 20 20 20 20 2f 2a 20  _BKPT ){.    /* 
b910: 54 68 69 73 20 68 61 70 70 65 6e 73 20 69 66 20  This happens if 
b920: 61 20 6d 61 6c 6c 6f 63 28 29 20 69 6e 73 69 64  a malloc() insid
b930: 65 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  e a call to sqli
b940: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
b950: 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69  ) or.    ** sqli
b960: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
b970: 36 28 29 20 66 61 69 6c 65 64 2e 20 20 2a 2f 0a  6() failed.  */.
b980: 20 20 20 20 73 71 6c 69 74 65 33 4f 6f 6d 46 61      sqlite3OomFa
b990: 75 6c 74 28 64 62 29 3b 0a 20 20 20 20 72 65 74  ult(db);.    ret
b9a0: 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
b9b0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 68 65 6e  ;.  }..  /* When
b9c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6f   the number of o
b9d0: 75 74 70 75 74 20 72 6f 77 73 20 72 65 61 63 68  utput rows reach
b9e0: 65 73 20 6e 52 6f 77 2c 20 74 68 61 74 20 6d 65  es nRow, that me
b9f0: 61 6e 73 20 74 68 65 0a 20 20 2a 2a 20 6c 69 73  ans the.  ** lis
ba00: 74 69 6e 67 20 68 61 73 20 66 69 6e 69 73 68 65  ting has finishe
ba10: 64 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 73 74  d and sqlite3_st
ba20: 65 70 28 29 20 73 68 6f 75 6c 64 20 72 65 74 75  ep() should retu
ba30: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a  rn SQLITE_DONE..
ba40: 20 20 2a 2a 20 6e 52 6f 77 20 69 73 20 74 68 65    ** nRow is the
ba50: 20 73 75 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62   sum of the numb
ba60: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
ba70: 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c 20  e main program, 
ba80: 70 6c 75 73 0a 20 20 2a 2a 20 74 68 65 20 73 75  plus.  ** the su
ba90: 6d 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  m of the number 
baa0: 6f 66 20 72 6f 77 73 20 69 6e 20 61 6c 6c 20 74  of rows in all t
bab0: 72 69 67 67 65 72 20 73 75 62 70 72 6f 67 72 61  rigger subprogra
bac0: 6d 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20  ms encountered. 
bad0: 20 2a 2a 20 73 6f 20 66 61 72 2e 20 20 54 68 65   ** so far.  The
bae0: 20 6e 52 6f 77 20 76 61 6c 75 65 20 77 69 6c 6c   nRow value will
baf0: 20 69 6e 63 72 65 61 73 65 20 61 73 20 6e 65 77   increase as new
bb00: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
bb10: 72 61 6d 73 20 61 72 65 0a 20 20 2a 2a 20 65 6e  rams are.  ** en
bb20: 63 6f 75 6e 74 65 72 65 64 2c 20 62 75 74 20 70  countered, but p
bb30: 2d 3e 70 63 20 77 69 6c 6c 20 65 76 65 6e 74 75  ->pc will eventu
bb40: 61 6c 6c 79 20 63 61 74 63 68 20 75 70 20 74 6f  ally catch up to
bb50: 20 6e 52 6f 77 2e 0a 20 20 2a 2f 0a 20 20 6e 52   nRow..  */.  nR
bb60: 6f 77 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 69  ow = p->nOp;.  i
bb70: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
bb80: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 66   ){.    /* The f
bb90: 69 72 73 74 20 38 20 6d 65 6d 6f 72 79 20 63 65  irst 8 memory ce
bba0: 6c 6c 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  lls are used for
bbb0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
bbc0: 20 20 53 6f 20 77 65 20 77 69 6c 6c 0a 20 20 20    So we will.   
bbd0: 20 2a 2a 20 63 6f 6d 6d 61 6e 64 65 65 72 20 74   ** commandeer t
bbe0: 68 65 20 39 74 68 20 63 65 6c 6c 20 74 6f 20 75  he 9th cell to u
bbf0: 73 65 20 61 73 20 73 74 6f 72 61 67 65 20 66 6f  se as storage fo
bc00: 72 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70 6f  r an array of po
bc10: 69 6e 74 65 72 73 0a 20 20 20 20 2a 2a 20 74 6f  inters.    ** to
bc20: 20 74 72 69 67 67 65 72 20 73 75 62 70 72 6f 67   trigger subprog
bc30: 72 61 6d 73 2e 20 20 54 68 65 20 56 44 42 45 20  rams.  The VDBE 
bc40: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
bc50: 20 68 61 76 65 20 61 74 20 6c 65 61 73 74 20 39   have at least 9
bc60: 0a 20 20 20 20 2a 2a 20 63 65 6c 6c 73 2e 20 20  .    ** cells.  
bc70: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
bc80: 2d 3e 6e 4d 65 6d 3e 39 20 29 3b 0a 20 20 20 20  ->nMem>9 );.    
bc90: 70 53 75 62 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pSub = &p->aMem[
bca0: 39 5d 3b 0a 20 20 20 20 69 66 28 20 70 53 75 62  9];.    if( pSub
bcb0: 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 42 6c 6f 62  ->flags&MEM_Blob
bcc0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 6e 20   ){.      /* On 
bcd0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
bce0: 6f 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29  o sqlite3_step()
bcf0: 2c 20 70 53 75 62 20 77 69 6c 6c 20 68 6f 6c 64  , pSub will hold
bd00: 20 61 20 4e 55 4c 4c 2e 20 20 49 74 20 69 73 0a   a NULL.  It is.
bd10: 20 20 20 20 20 20 2a 2a 20 69 6e 69 74 69 61 6c        ** initial
bd20: 69 7a 65 64 20 74 6f 20 61 20 42 4c 4f 42 20 62  ized to a BLOB b
bd30: 79 20 74 68 65 20 50 34 5f 53 55 42 50 52 4f 47  y the P4_SUBPROG
bd40: 52 41 4d 20 70 72 6f 63 65 73 73 69 6e 67 20 6c  RAM processing l
bd50: 6f 67 69 63 20 62 65 6c 6f 77 20 2a 2f 0a 20 20  ogic below */.  
bd60: 20 20 20 20 6e 53 75 62 20 3d 20 70 53 75 62 2d      nSub = pSub-
bd70: 3e 6e 2f 73 69 7a 65 6f 66 28 56 64 62 65 2a 29  >n/sizeof(Vdbe*)
bd80: 3b 0a 20 20 20 20 20 20 61 70 53 75 62 20 3d 20  ;.      apSub = 
bd90: 28 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70  (SubProgram **)p
bda0: 53 75 62 2d 3e 7a 3b 0a 20 20 20 20 7d 0a 20 20  Sub->z;.    }.  
bdb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 75    for(i=0; i<nSu
bdc0: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 6e  b; i++){.      n
bdd0: 52 6f 77 20 2b 3d 20 61 70 53 75 62 5b 69 5d 2d  Row += apSub[i]-
bde0: 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >nOp;.    }.  }.
bdf0: 0a 20 20 64 6f 7b 0a 20 20 20 20 69 20 3d 20 70  .  do{.    i = p
be00: 2d 3e 70 63 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65  ->pc++;.  }while
be10: 28 20 69 3c 6e 52 6f 77 20 26 26 20 70 2d 3e 65  ( i<nRow && p->e
be20: 78 70 6c 61 69 6e 3d 3d 32 20 26 26 20 70 2d 3e  xplain==2 && p->
be30: 61 4f 70 5b 69 5d 2e 6f 70 63 6f 64 65 21 3d 4f  aOp[i].opcode!=O
be40: 50 5f 45 78 70 6c 61 69 6e 20 29 3b 0a 20 20 69  P_Explain );.  i
be50: 66 28 20 69 3e 3d 6e 52 6f 77 20 29 7b 0a 20 20  f( i>=nRow ){.  
be60: 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
be70: 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  _OK;.    rc = SQ
be80: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c  LITE_DONE;.  }el
be90: 73 65 20 69 66 28 20 64 62 2d 3e 75 31 2e 69 73  se if( db->u1.is
bea0: 49 6e 74 65 72 72 75 70 74 65 64 20 29 7b 0a 20  Interrupted ){. 
beb0: 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54     p->rc = SQLIT
bec0: 45 5f 49 4e 54 45 52 52 55 50 54 3b 0a 20 20 20  E_INTERRUPT;.   
bed0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
bee0: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  OR;.    sqlite3V
bef0: 64 62 65 45 72 72 6f 72 28 70 2c 20 73 71 6c 69  dbeError(p, sqli
bf00: 74 65 33 45 72 72 53 74 72 28 70 2d 3e 72 63 29  te3ErrStr(p->rc)
bf10: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
bf20: 63 68 61 72 20 2a 7a 50 34 3b 0a 20 20 20 20 4f  char *zP4;.    O
bf30: 70 20 2a 70 4f 70 3b 0a 20 20 20 20 69 66 28 20  p *pOp;.    if( 
bf40: 69 3c 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  i<p->nOp ){.    
bf50: 20 20 2f 2a 20 54 68 65 20 6f 75 74 70 75 74 20    /* The output 
bf60: 6c 69 6e 65 20 6e 75 6d 62 65 72 20 69 73 20 73  line number is s
bf70: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 74 68 61 74  mall enough that
bf80: 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 69 6e   we are still in
bf90: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6d 61   the.      ** ma
bfa0: 69 6e 20 70 72 6f 67 72 61 6d 2e 20 2a 2f 0a 20  in program. */. 
bfb0: 20 20 20 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61       pOp = &p->a
bfc0: 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 65 6c 73 65  Op[i];.    }else
bfd0: 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20 61 72  {.      /* We ar
bfe0: 65 20 63 75 72 72 65 6e 74 6c 79 20 6c 69 73 74  e currently list
bff0: 69 6e 67 20 73 75 62 70 72 6f 67 72 61 6d 73 2e  ing subprograms.
c000: 20 20 46 69 67 75 72 65 20 6f 75 74 20 77 68 69    Figure out whi
c010: 63 68 20 6f 6e 65 20 61 6e 64 0a 20 20 20 20 20  ch one and.     
c020: 20 2a 2a 20 70 69 63 6b 20 75 70 20 74 68 65 20   ** pick up the 
c030: 61 70 70 72 6f 70 72 69 61 74 65 20 6f 70 63 6f  appropriate opco
c040: 64 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  de. */.      int
c050: 20 6a 3b 0a 20 20 20 20 20 20 69 20 2d 3d 20 70   j;.      i -= p
c060: 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20 66 6f 72  ->nOp;.      for
c070: 28 6a 3d 30 3b 20 69 3e 3d 61 70 53 75 62 5b 6a  (j=0; i>=apSub[j
c080: 5d 2d 3e 6e 4f 70 3b 20 6a 2b 2b 29 7b 0a 20 20  ]->nOp; j++){.  
c090: 20 20 20 20 20 20 69 20 2d 3d 20 61 70 53 75 62        i -= apSub
c0a0: 5b 6a 5d 2d 3e 6e 4f 70 3b 0a 20 20 20 20 20 20  [j]->nOp;.      
c0b0: 7d 0a 20 20 20 20 20 20 70 4f 70 20 3d 20 26 61  }.      pOp = &a
c0c0: 70 53 75 62 5b 6a 5d 2d 3e 61 4f 70 5b 69 5d 3b  pSub[j]->aOp[i];
c0d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
c0e0: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a  ->explain==1 ){.
c0f0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c100: 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
c110: 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 69     pMem->u.i = i
c120: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 2f 2a 20 50 72 6f 67 72 61 6d 20 63 6f 75 6e   /* Program coun
c150: 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  ter */.      pMe
c160: 6d 2b 2b 3b 0a 20 20 0a 20 20 20 20 20 20 70 4d  m++;.  .      pM
c170: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c180: 53 74 61 74 69 63 7c 4d 45 4d 5f 53 74 72 7c 4d  Static|MEM_Str|M
c190: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
c1a0: 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 2a 29  Mem->z = (char*)
c1b0: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
c1c0: 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29 3b 20  e(pOp->opcode); 
c1d0: 2f 2a 20 4f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  /* Opcode */.   
c1e0: 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d     assert( pMem-
c1f0: 3e 7a 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  >z!=0 );.      p
c200: 4d 65 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33  Mem->n = sqlite3
c210: 53 74 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a  Strlen30(pMem->z
c220: 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65  );.      pMem->e
c230: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38  nc = SQLITE_UTF8
c240: 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a  ;.      pMem++;.
c250: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 61  .      /* When a
c260: 6e 20 4f 50 5f 50 72 6f 67 72 61 6d 20 6f 70 63  n OP_Program opc
c270: 6f 64 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ode is encounter
c280: 20 28 74 68 65 20 6f 6e 6c 79 20 6f 70 63 6f 64   (the only opcod
c290: 65 20 74 68 61 74 20 68 61 73 0a 20 20 20 20 20  e that has.     
c2a0: 20 2a 2a 20 61 20 50 34 5f 53 55 42 50 52 4f 47   ** a P4_SUBPROG
c2b0: 52 41 4d 20 61 72 67 75 6d 65 6e 74 29 2c 20 65  RAM argument), e
c2c0: 78 70 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f  xpand the size o
c2d0: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 73  f the array of s
c2e0: 75 62 70 72 6f 67 72 61 6d 73 0a 20 20 20 20 20  ubprograms.     
c2f0: 20 2a 2a 20 6b 65 70 74 20 69 6e 20 70 2d 3e 61   ** kept in p->a
c300: 4d 65 6d 5b 39 5d 2e 7a 20 74 6f 20 68 6f 6c 64  Mem[9].z to hold
c310: 20 74 68 65 20 6e 65 77 20 70 72 6f 67 72 61 6d   the new program
c320: 20 2d 20 61 73 73 75 6d 69 6e 67 20 74 68 69 73   - assuming this
c330: 20 73 75 62 70 72 6f 67 72 61 6d 0a 20 20 20 20   subprogram.    
c340: 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 61 6c 72    ** has not alr
c350: 65 61 64 79 20 62 65 65 6e 20 73 65 65 6e 2e 0a  eady been seen..
c360: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
c370: 66 28 20 70 4f 70 2d 3e 70 34 74 79 70 65 3d 3d  f( pOp->p4type==
c380: 50 34 5f 53 55 42 50 52 4f 47 52 41 4d 20 29 7b  P4_SUBPROGRAM ){
c390: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 42 79  .        int nBy
c3a0: 74 65 20 3d 20 28 6e 53 75 62 2b 31 29 2a 73 69  te = (nSub+1)*si
c3b0: 7a 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a  zeof(SubProgram*
c3c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  );.        int j
c3d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  ;.        for(j=
c3e0: 30 3b 20 6a 3c 6e 53 75 62 3b 20 6a 2b 2b 29 7b  0; j<nSub; j++){
c3f0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61  .          if( a
c400: 70 53 75 62 5b 6a 5d 3d 3d 70 4f 70 2d 3e 70 34  pSub[j]==pOp->p4
c410: 2e 70 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61  .pProgram ) brea
c420: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
c430: 20 20 20 20 20 69 66 28 20 6a 3d 3d 6e 53 75 62       if( j==nSub
c440: 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 73   && SQLITE_OK==s
c450: 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 47 72 6f  qlite3VdbeMemGro
c460: 77 28 70 53 75 62 2c 20 6e 42 79 74 65 2c 20 6e  w(pSub, nByte, n
c470: 53 75 62 21 3d 30 29 20 29 7b 0a 20 20 20 20 20  Sub!=0) ){.     
c480: 20 20 20 20 20 61 70 53 75 62 20 3d 20 28 53 75       apSub = (Su
c490: 62 50 72 6f 67 72 61 6d 20 2a 2a 29 70 53 75 62  bProgram **)pSub
c4a0: 2d 3e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ->z;.          a
c4b0: 70 53 75 62 5b 6e 53 75 62 2b 2b 5d 20 3d 20 70  pSub[nSub++] = p
c4c0: 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61 6d 3b  Op->p4.pProgram;
c4d0: 0a 20 20 20 20 20 20 20 20 20 20 70 53 75 62 2d  .          pSub-
c4e0: 3e 66 6c 61 67 73 20 7c 3d 20 4d 45 4d 5f 42 6c  >flags |= MEM_Bl
c4f0: 6f 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53  ob;.          pS
c500: 75 62 2d 3e 6e 20 3d 20 6e 53 75 62 2a 73 69 7a  ub->n = nSub*siz
c510: 65 6f 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29  eof(SubProgram*)
c520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c530: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
c540: 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
c550: 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  _Int;.    pMem->
c560: 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 31 3b 20 20  u.i = pOp->p1;  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c580: 20 20 20 20 20 20 20 20 2f 2a 20 50 31 20 2a 2f          /* P1 */
c590: 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20  .    pMem++;..  
c5a0: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c5b0: 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 70 4d 65  MEM_Int;.    pMe
c5c0: 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d 3e 70 32  m->u.i = pOp->p2
c5d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c5e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 32             /* P2
c5f0: 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a   */.    pMem++;.
c600: 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  .    pMem->flags
c610: 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
c620: 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f 70 2d  pMem->u.i = pOp-
c630: 3e 70 33 3b 20 20 20 20 20 20 20 20 20 20 20 20  >p3;            
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c650: 20 50 33 20 2a 2f 0a 20 20 20 20 70 4d 65 6d 2b   P3 */.    pMem+
c660: 2b 3b 0a 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +;..    if( sqli
c670: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
c680: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 31  ndResize(pMem, 1
c690: 30 30 29 20 29 7b 20 2f 2a 20 50 34 20 2a 2f 0a  00) ){ /* P4 */.
c6a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
c6b0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
c6c0: 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  d );.      retur
c6d0: 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
c6e0: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2d 3e      }.    pMem->
c6f0: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c  flags = MEM_Str|
c700: 4d 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 7a 50  MEM_Term;.    zP
c710: 34 20 3d 20 64 69 73 70 6c 61 79 50 34 28 70 4f  4 = displayP4(pO
c720: 70 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 70 4d 65 6d  p, pMem->z, pMem
c730: 2d 3e 73 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20  ->szMalloc);.   
c740: 20 69 66 28 20 7a 50 34 21 3d 70 4d 65 6d 2d 3e   if( zP4!=pMem->
c750: 7a 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  z ){.      sqlit
c760: 65 33 56 64 62 65 4d 65 6d 53 65 74 53 74 72 28  e3VdbeMemSetStr(
c770: 70 4d 65 6d 2c 20 7a 50 34 2c 20 2d 31 2c 20 53  pMem, zP4, -1, S
c780: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3b 0a  QLITE_UTF8, 0);.
c790: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c7a0: 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 7a   assert( pMem->z
c7b0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 4d 65  !=0 );.      pMe
c7c0: 6d 2d 3e 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  m->n = sqlite3St
c7d0: 72 6c 65 6e 33 30 28 70 4d 65 6d 2d 3e 7a 29 3b  rlen30(pMem->z);
c7e0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
c7f0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
c800: 20 20 20 20 7d 0a 20 20 20 20 70 4d 65 6d 2b 2b      }.    pMem++
c810: 3b 0a 0a 20 20 20 20 69 66 28 20 70 2d 3e 65 78  ;..    if( p->ex
c820: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
c830: 20 20 69 66 28 20 73 71 6c 69 74 65 33 56 64 62    if( sqlite3Vdb
c840: 65 4d 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69  eMemClearAndResi
c850: 7a 65 28 70 4d 65 6d 2c 20 34 29 20 29 7b 0a 20  ze(pMem, 4) ){. 
c860: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c870: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
c880: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
c890: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
c8a0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
c8b0: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
c8c0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
c8d0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
c8e0: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
c8f0: 33 5f 73 6e 70 72 69 6e 74 66 28 33 2c 20 70 4d  3_snprintf(3, pM
c900: 65 6d 2d 3e 7a 2c 20 22 25 2e 32 78 22 2c 20 70  em->z, "%.2x", p
c910: 4f 70 2d 3e 70 35 29 3b 20 20 20 2f 2a 20 50 35  Op->p5);   /* P5
c920: 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
c930: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
c940: 38 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2b 2b 3b  8;.      pMem++;
c950: 0a 20 20 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .  .#ifdef SQLIT
c960: 45 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e  E_ENABLE_EXPLAIN
c970: 5f 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20  _COMMENTS.      
c980: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
c990: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
c9a0: 28 70 4d 65 6d 2c 20 35 30 30 29 20 29 7b 0a 20  (pMem, 500) ){. 
c9b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
c9c0: 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
c9d0: 65 64 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ed );.        re
c9e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
c9f0: 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
ca00: 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
ca10: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
ca20: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
ca30: 20 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28   displayComment(
ca40: 70 4f 70 2c 20 7a 50 34 2c 20 70 4d 65 6d 2d 3e  pOp, zP4, pMem->
ca50: 7a 2c 20 35 30 30 29 3b 0a 20 20 20 20 20 20 70  z, 500);.      p
ca60: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
ca70: 45 5f 55 54 46 38 3b 0a 23 65 6c 73 65 0a 20 20  E_UTF8;.#else.  
ca80: 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
ca90: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 20 20 20 20 20  = MEM_Null;     
caa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cab0: 20 20 2f 2a 20 43 6f 6d 6d 65 6e 74 20 2a 2f 0a    /* Comment */.
cac0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
cad0: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
cae0: 3d 20 38 20 2d 20 34 2a 28 70 2d 3e 65 78 70 6c  = 8 - 4*(p->expl
caf0: 61 69 6e 2d 31 29 3b 0a 20 20 20 20 70 2d 3e 70  ain-1);.    p->p
cb00: 52 65 73 75 6c 74 53 65 74 20 3d 20 26 70 2d 3e  ResultSet = &p->
cb10: 61 4d 65 6d 5b 31 5d 3b 0a 20 20 20 20 70 2d 3e  aMem[1];.    p->
cb20: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
cb30: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
cb40: 52 4f 57 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROW;.  }.  retur
cb50: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
cb60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  * SQLITE_OMIT_EX
cb70: 50 4c 41 49 4e 20 2a 2f 0a 0a 23 69 66 64 65 66  PLAIN */..#ifdef
cb80: 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
cb90: 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 53 51  .** Print the SQ
cba0: 4c 20 74 68 61 74 20 77 61 73 20 75 73 65 64 20  L that was used 
cbb0: 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 56 44  to generate a VD
cbc0: 42 45 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 76  BE program..*/.v
cbd0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 50  oid sqlite3VdbeP
cbe0: 72 69 6e 74 53 71 6c 28 56 64 62 65 20 2a 70 29  rintSql(Vdbe *p)
cbf0: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
cc00: 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e  z = 0;.  if( p->
cc10: 7a 53 71 6c 20 29 7b 0a 20 20 20 20 7a 20 3d 20  zSql ){.    z = 
cc20: 70 2d 3e 7a 53 71 6c 3b 0a 20 20 7d 65 6c 73 65  p->zSql;.  }else
cc30: 20 69 66 28 20 70 2d 3e 6e 4f 70 3e 3d 31 20 29   if( p->nOp>=1 )
cc40: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 56 64 62 65  {.    const Vdbe
cc50: 4f 70 20 2a 70 4f 70 20 3d 20 26 70 2d 3e 61 4f  Op *pOp = &p->aO
cc60: 70 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 4f  p[0];.    if( pO
cc70: 70 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e  p->opcode==OP_In
cc80: 69 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21  it && pOp->p4.z!
cc90: 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
cca0: 70 4f 70 2d 3e 70 34 2e 7a 3b 0a 20 20 20 20 20  pOp->p4.z;.     
ccb0: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 49   while( sqlite3I
ccc0: 73 73 70 61 63 65 28 2a 7a 29 20 29 20 7a 2b 2b  sspace(*z) ) z++
ccd0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
cce0: 28 20 7a 20 29 20 70 72 69 6e 74 66 28 22 53 51  ( z ) printf("SQ
ccf0: 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 29 3b 0a  L: [%s]\n", z);.
cd00: 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64  }.#endif..#if !d
cd10: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
cd20: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
cd30: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
cd40: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
cd50: 2a 20 50 72 69 6e 74 20 61 6e 20 49 4f 54 52 41  * Print an IOTRA
cd60: 43 45 20 6d 65 73 73 61 67 65 20 73 68 6f 77 69  CE message showi
cd70: 6e 67 20 53 51 4c 20 63 6f 6e 74 65 6e 74 2e 0a  ng SQL content..
cd80: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
cd90: 64 62 65 49 4f 54 72 61 63 65 53 71 6c 28 56 64  dbeIOTraceSql(Vd
cda0: 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 4f  be *p){.  int nO
cdb0: 70 20 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 56 64  p = p->nOp;.  Vd
cdc0: 62 65 4f 70 20 2a 70 4f 70 3b 0a 20 20 69 66 28  beOp *pOp;.  if(
cdd0: 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 3d   sqlite3IoTrace=
cde0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
cdf0: 66 28 20 6e 4f 70 3c 31 20 29 20 72 65 74 75 72  f( nOp<1 ) retur
ce00: 6e 3b 0a 20 20 70 4f 70 20 3d 20 26 70 2d 3e 61  n;.  pOp = &p->a
ce10: 4f 70 5b 30 5d 3b 0a 20 20 69 66 28 20 70 4f 70  Op[0];.  if( pOp
ce20: 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 49 6e 69  ->opcode==OP_Ini
ce30: 74 20 26 26 20 70 4f 70 2d 3e 70 34 2e 7a 21 3d  t && pOp->p4.z!=
ce40: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20  0 ){.    int i, 
ce50: 6a 3b 0a 20 20 20 20 63 68 61 72 20 7a 5b 31 30  j;.    char z[10
ce60: 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  00];.    sqlite3
ce70: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
ce80: 28 7a 29 2c 20 7a 2c 20 22 25 73 22 2c 20 70 4f  (z), z, "%s", pO
ce90: 70 2d 3e 70 34 2e 7a 29 3b 0a 20 20 20 20 66 6f  p->p4.z);.    fo
cea0: 72 28 69 3d 30 3b 20 73 71 6c 69 74 65 33 49 73  r(i=0; sqlite3Is
ceb0: 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b  space(z[i]); i++
cec0: 29 7b 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ){}.    for(j=0;
ced0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
cee0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73     if( sqlite3Is
cef0: 73 70 61 63 65 28 7a 5b 69 5d 29 20 29 7b 0a 20  space(z[i]) ){. 
cf00: 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2d 31         if( z[i-1
cf10: 5d 21 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]!=' ' ){.      
cf20: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 27 20 27      z[j++] = ' '
cf30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
cf40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf50: 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a   z[j++] = z[i];.
cf60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
cf70: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
cf80: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 28 22  sqlite3IoTrace("
cf90: 53 51 4c 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  SQL %s\n", z);. 
cfa0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21   }.}.#endif /* !
cfb0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
cfc0: 45 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  E && SQLITE_ENAB
cfd0: 4c 45 5f 49 4f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LE_IOTRACE */../
cfe0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
cff0: 20 74 68 69 73 20 6f 62 6a 65 63 74 20 64 65 73   this object des
d000: 63 72 69 62 65 73 20 62 75 6c 6b 20 6d 65 6d 6f  cribes bulk memo
d010: 72 79 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72  ry available for
d020: 20 75 73 65 0a 2a 2a 20 62 79 20 73 75 62 63 6f   use.** by subco
d030: 6d 70 6f 6e 65 6e 74 73 20 6f 66 20 61 20 70 72  mponents of a pr
d040: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
d050: 2e 20 20 53 70 61 63 65 20 69 73 20 61 6c 6c 6f  .  Space is allo
d060: 63 61 74 65 64 20 6f 75 74 0a 2a 2a 20 6f 66 20  cated out.** of 
d070: 61 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  a ReusableSpace 
d080: 6f 62 6a 65 63 74 20 62 79 20 74 68 65 20 61 6c  object by the al
d090: 6c 6f 63 53 70 61 63 65 28 29 20 72 6f 75 74 69  locSpace() routi
d0a0: 6e 65 20 62 65 6c 6f 77 2e 0a 2a 2f 0a 73 74 72  ne below..*/.str
d0b0: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
d0c0: 65 20 7b 0a 20 20 75 38 20 2a 70 53 70 61 63 65  e {.  u8 *pSpace
d0d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 76  ;          /* Av
d0e0: 61 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a  ailable memory *
d0f0: 2f 0a 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20  /.  int nFree;  
d100: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
d110: 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6d  s of available m
d120: 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  emory */.  int n
d130: 4e 65 65 64 65 64 3b 20 20 20 20 20 20 20 20 20  Needed;         
d140: 2f 2a 20 54 6f 74 61 6c 20 62 79 74 65 73 20 74  /* Total bytes t
d150: 68 61 74 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65  hat could not be
d160: 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b   allocated */.};
d170: 0a 0a 2f 2a 20 54 72 79 20 74 6f 20 61 6c 6c 6f  ../* Try to allo
d180: 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65 73  cate nByte bytes
d190: 20 6f 66 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   of 8-byte align
d1a0: 65 64 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 66  ed bulk memory f
d1b0: 6f 72 20 70 42 75 66 0a 2a 2a 20 66 72 6f 6d 20  or pBuf.** from 
d1c0: 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  the ReusableSpac
d1d0: 65 20 6f 62 6a 65 63 74 2e 20 20 52 65 74 75 72  e object.  Retur
d1e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
d1f0: 68 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  he allocated.** 
d200: 6d 65 6d 6f 72 79 20 6f 6e 20 73 75 63 63 65 73  memory on succes
d210: 73 2e 20 20 49 66 20 69 6e 73 75 66 66 69 63 69  s.  If insuffici
d220: 65 6e 74 20 6d 65 6d 6f 72 79 20 69 73 20 61 76  ent memory is av
d230: 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 0a 2a  ailable in the.*
d240: 2a 20 52 65 75 73 61 62 6c 65 53 70 61 63 65 20  * ReusableSpace 
d250: 6f 62 6a 65 63 74 2c 20 69 6e 63 72 65 61 73 65  object, increase
d260: 20 74 68 65 20 52 65 75 73 61 62 6c 65 53 70 61   the ReusableSpa
d270: 63 65 2e 6e 4e 65 65 64 65 64 0a 2a 2a 20 76 61  ce.nNeeded.** va
d280: 6c 75 65 20 62 79 20 74 68 65 20 61 6d 6f 75 6e  lue by the amoun
d290: 74 20 6e 65 65 64 65 64 20 61 6e 64 20 72 65 74  t needed and ret
d2a0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20  urn NULL..**.** 
d2b0: 49 66 20 70 42 75 66 20 69 73 20 6e 6f 74 20 69  If pBuf is not i
d2c0: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
d2d0: 68 61 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74  hat means that t
d2e0: 68 65 20 6d 65 6d 6f 72 79 20 68 61 73 20 61 6c  he memory has al
d2f0: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 61 6c  ready.** been al
d300: 6c 6f 63 61 74 65 64 20 62 79 20 61 20 70 72 69  located by a pri
d310: 6f 72 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  or call to this 
d320: 72 6f 75 74 69 6e 65 2c 20 73 6f 20 6a 75 73 74  routine, so just
d330: 20 72 65 74 75 72 6e 20 61 20 63 6f 70 79 0a 2a   return a copy.*
d340: 2a 20 6f 66 20 70 42 75 66 20 61 6e 64 20 6c 65  * of pBuf and le
d350: 61 76 65 20 52 65 75 73 61 62 6c 65 53 70 61 63  ave ReusableSpac
d360: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  e unchanged..**.
d370: 2a 2a 20 54 68 69 73 20 61 6c 6c 6f 63 61 74 6f  ** This allocato
d380: 72 20 69 73 20 65 6d 70 6c 6f 79 65 64 20 74 6f  r is employed to
d390: 20 72 65 70 75 72 70 6f 73 65 20 75 6e 75 73 65   repurpose unuse
d3a0: 64 20 73 6c 6f 74 73 20 61 74 20 74 68 65 20 65  d slots at the e
d3b0: 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 70 63  nd of the.** opc
d3c0: 6f 64 65 20 61 72 72 61 79 20 6f 66 20 70 72 65  ode array of pre
d3d0: 70 61 72 65 64 20 73 74 61 74 65 20 66 6f 72 20  pared state for 
d3e0: 6f 74 68 65 72 20 6d 65 6d 6f 72 79 20 6e 65 65  other memory nee
d3f0: 64 73 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ds of the prepar
d400: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e  ed.** statement.
d410: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
d420: 2a 61 6c 6c 6f 63 53 70 61 63 65 28 0a 20 20 73  *allocSpace(.  s
d430: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
d440: 61 63 65 20 2a 70 2c 20 20 2f 2a 20 42 75 6c 6b  ace *p,  /* Bulk
d450: 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c 61 62 6c   memory availabl
d460: 65 20 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  e for allocation
d470: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66   */.  void *pBuf
d480: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
d490: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 20  /* Pointer to a 
d4a0: 70 72 69 6f 72 20 61 6c 6c 6f 63 61 74 69 6f 6e  prior allocation
d4b0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 20   */.  int nByte 
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f  /* Bytes of memo
d4e0: 72 79 20 6e 65 65 64 65 64 20 2a 2f 0a 29 7b 0a  ry needed */.){.
d4f0: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
d500: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  BYTE_ALIGNMENT(p
d510: 2d 3e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 69  ->pSpace) );.  i
d520: 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20  f( pBuf==0 ){.  
d530: 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e 44 38    nByte = ROUND8
d540: 28 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28  (nByte);.    if(
d550: 20 6e 42 79 74 65 20 3c 3d 20 70 2d 3e 6e 46 72   nByte <= p->nFr
d560: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  ee ){.      p->n
d570: 46 72 65 65 20 2d 3d 20 6e 42 79 74 65 3b 0a 20  Free -= nByte;. 
d580: 20 20 20 20 20 70 42 75 66 20 3d 20 26 70 2d 3e       pBuf = &p->
d590: 70 53 70 61 63 65 5b 70 2d 3e 6e 46 72 65 65 5d  pSpace[p->nFree]
d5a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d5b0: 20 20 20 70 2d 3e 6e 4e 65 65 64 65 64 20 2b 3d     p->nNeeded +=
d5c0: 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 20 20   nByte;.    }.  
d5d0: 7d 0a 20 20 61 73 73 65 72 74 28 20 45 49 47 48  }.  assert( EIGH
d5e0: 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54  T_BYTE_ALIGNMENT
d5f0: 28 70 42 75 66 29 20 29 3b 0a 20 20 72 65 74 75  (pBuf) );.  retu
d600: 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pBuf;.}../*.*
d610: 2a 20 52 65 77 69 6e 64 20 74 68 65 20 56 44 42  * Rewind the VDB
d620: 45 20 62 61 63 6b 20 74 6f 20 74 68 65 20 62 65  E back to the be
d630: 67 69 6e 6e 69 6e 67 20 69 6e 20 70 72 65 70 61  ginning in prepa
d640: 72 61 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 72 75  ration for.** ru
d650: 6e 6e 69 6e 67 20 69 74 2e 0a 2a 2f 0a 76 6f 69  nning it..*/.voi
d660: 64 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 77  d sqlite3VdbeRew
d670: 69 6e 64 28 56 64 62 65 20 2a 70 29 7b 0a 23 69  ind(Vdbe *p){.#i
d680: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
d690: 5f 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e  _DEBUG) || defin
d6a0: 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c 45 29  ed(VDBE_PROFILE)
d6b0: 0a 20 20 69 6e 74 20 69 3b 0a 23 65 6e 64 69 66  .  int i;.#endif
d6c0: 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20  .  assert( p!=0 
d6d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
d6e0: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
d6f0: 43 5f 49 4e 49 54 20 29 3b 0a 0a 20 20 2f 2a 20  C_INIT );..  /* 
d700: 54 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20  There should be 
d710: 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 70 63  at least one opc
d720: 6f 64 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ode..  */.  asse
d730: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
d740: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6d 61  .  /* Set the ma
d750: 67 69 63 20 74 6f 20 56 44 42 45 5f 4d 41 47 49  gic to VDBE_MAGI
d760: 43 5f 52 55 4e 20 73 6f 6f 6e 65 72 20 72 61 74  C_RUN sooner rat
d770: 68 65 72 20 74 68 61 6e 20 6c 61 74 65 72 2e 20  her than later. 
d780: 2a 2f 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  */.  p->magic = 
d790: 56 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 3b 0a  VDBE_MAGIC_RUN;.
d7a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d7b0: 45 42 55 47 0a 20 20 66 6f 72 28 69 3d 30 3b 20  EBUG.  for(i=0; 
d7c0: 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b 29 7b  i<p->nMem; i++){
d7d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
d7e0: 61 4d 65 6d 5b 69 5d 2e 64 62 3d 3d 70 2d 3e 64  aMem[i].db==p->d
d7f0: 62 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  b );.  }.#endif.
d800: 20 20 70 2d 3e 70 63 20 3d 20 2d 31 3b 0a 20 20    p->pc = -1;.  
d810: 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  p->rc = SQLITE_O
d820: 4b 3b 0a 20 20 70 2d 3e 65 72 72 6f 72 41 63 74  K;.  p->errorAct
d830: 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a  ion = OE_Abort;.
d840: 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
d850: 3b 0a 20 20 70 2d 3e 63 61 63 68 65 43 74 72 20  ;.  p->cacheCtr 
d860: 3d 20 31 3b 0a 20 20 70 2d 3e 6d 69 6e 57 72 69  = 1;.  p->minWri
d870: 74 65 46 69 6c 65 46 6f 72 6d 61 74 20 3d 20 32  teFileFormat = 2
d880: 35 35 3b 0a 20 20 70 2d 3e 69 53 74 61 74 65 6d  55;.  p->iStatem
d890: 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 46  ent = 0;.  p->nF
d8a0: 6b 43 6f 6e 73 74 72 61 69 6e 74 20 3d 20 30 3b  kConstraint = 0;
d8b0: 0a 23 69 66 64 65 66 20 56 44 42 45 5f 50 52 4f  .#ifdef VDBE_PRO
d8c0: 46 49 4c 45 0a 20 20 66 6f 72 28 69 3d 30 3b 20  FILE.  for(i=0; 
d8d0: 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a  i<p->nOp; i++){.
d8e0: 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e      p->aOp[i].cn
d8f0: 74 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4f  t = 0;.    p->aO
d900: 70 5b 69 5d 2e 63 79 63 6c 65 73 20 3d 20 30 3b  p[i].cycles = 0;
d910: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
d920: 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 20 76  *.** Prepare a v
d930: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 66  irtual machine f
d940: 6f 72 20 65 78 65 63 75 74 69 6f 6e 20 66 6f 72  or execution for
d950: 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
d960: 61 66 74 65 72 0a 2a 2a 20 63 72 65 61 74 69 6e  after.** creatin
d970: 67 20 74 68 65 20 76 69 72 74 75 61 6c 20 6d 61  g the virtual ma
d980: 63 68 69 6e 65 2e 20 20 54 68 69 73 20 69 6e 76  chine.  This inv
d990: 6f 6c 76 65 73 20 74 68 69 6e 67 73 20 73 75 63  olves things suc
d9a0: 68 0a 2a 2a 20 61 73 20 61 6c 6c 6f 63 61 74 69  h.** as allocati
d9b0: 6e 67 20 72 65 67 69 73 74 65 72 73 20 61 6e 64  ng registers and
d9c0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
d9d0: 65 20 70 72 6f 67 72 61 6d 20 63 6f 75 6e 74 65  e program counte
d9e0: 72 2e 0a 2a 2a 20 41 66 74 65 72 20 74 68 65 20  r..** After the 
d9f0: 56 44 42 45 20 68 61 73 20 62 65 20 70 72 65 70  VDBE has be prep
da00: 70 65 64 2c 20 69 74 20 63 61 6e 20 62 65 20 65  ped, it can be e
da10: 78 65 63 75 74 65 64 20 62 79 20 6f 6e 65 20 6f  xecuted by one o
da20: 72 20 6d 6f 72 65 0a 2a 2a 20 63 61 6c 6c 73 20  r more.** calls 
da30: 74 6f 20 73 71 6c 69 74 65 33 56 64 62 65 45 78  to sqlite3VdbeEx
da40: 65 63 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  ec().  .**.** Th
da50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20  is function may 
da60: 62 65 20 63 61 6c 6c 65 64 20 65 78 61 63 74 6c  be called exactl
da70: 79 20 6f 6e 63 65 20 6f 6e 20 65 61 63 68 20 76  y once on each v
da80: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 0a  irtual machine..
da90: 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72 6f  ** After this ro
daa0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
dab0: 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
dac0: 22 70 61 63 6b 61 67 65 64 22 20 61 6e 64 20 69  "packaged" and i
dad0: 73 20 72 65 61 64 79 0a 2a 2a 20 74 6f 20 72 75  s ready.** to ru
dae0: 6e 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  n.  After this r
daf0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
db00: 2c 20 66 75 72 74 68 65 72 20 63 61 6c 6c 73 20  , further calls 
db10: 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  to .** sqlite3Vd
db20: 62 65 41 64 64 4f 70 28 29 20 66 75 6e 63 74 69  beAddOp() functi
db30: 6f 6e 73 20 61 72 65 20 70 72 6f 68 69 62 69 74  ons are prohibit
db40: 65 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ed.  This routin
db50: 65 20 64 69 73 63 6f 6e 6e 65 63 74 73 0a 2a 2a  e disconnects.**
db60: 20 74 68 65 20 56 64 62 65 20 66 72 6f 6d 20 74   the Vdbe from t
db70: 68 65 20 50 61 72 73 65 20 6f 62 6a 65 63 74 20  he Parse object 
db80: 74 68 61 74 20 68 65 6c 70 65 64 20 67 65 6e 65  that helped gene
db90: 72 61 74 65 20 69 74 20 73 6f 20 74 68 61 74 20  rate it so that 
dba0: 74 68 65 0a 2a 2a 20 74 68 65 20 56 64 62 65 20  the.** the Vdbe 
dbb0: 62 65 63 6f 6d 65 73 20 61 6e 20 69 6e 64 65 70  becomes an indep
dbc0: 65 6e 64 65 6e 74 20 65 6e 74 69 74 79 20 61 6e  endent entity an
dbd0: 64 20 74 68 65 20 50 61 72 73 65 20 6f 62 6a 65  d the Parse obje
dbe0: 63 74 20 63 61 6e 20 62 65 0a 2a 2a 20 64 65 73  ct can be.** des
dbf0: 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 73  troyed..**.** Us
dc00: 65 20 74 68 65 20 73 71 6c 69 74 65 33 56 64 62  e the sqlite3Vdb
dc10: 65 52 65 77 69 6e 64 28 29 20 70 72 6f 63 65 64  eRewind() proced
dc20: 75 72 65 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ure to restore a
dc30: 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65   virtual machine
dc40: 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 69 74 73 20   back.** to its 
dc50: 69 6e 69 74 69 61 6c 20 73 74 61 74 65 20 61 66  initial state af
dc60: 74 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ter it has been 
dc70: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  run..*/.void sql
dc80: 69 74 65 33 56 64 62 65 4d 61 6b 65 52 65 61 64  ite3VdbeMakeRead
dc90: 79 28 0a 20 20 56 64 62 65 20 2a 70 2c 20 20 20  y(.  Vdbe *p,   
dca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcb0: 20 20 20 20 2f 2a 20 54 68 65 20 56 44 42 45 20      /* The VDBE 
dcc0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
dcd0: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
dce0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
dcf0: 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 73  ontext */.){.  s
dd00: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dd20: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   The database co
dd30: 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  nnection */.  in
dd40: 74 20 6e 56 61 72 3b 20 20 20 20 20 20 20 20 20  t nVar;         
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd60: 4e 75 6d 62 65 72 20 6f 66 20 70 61 72 61 6d 65  Number of parame
dd70: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ters */.  int nM
dd80: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
dd90: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
dda0: 65 72 20 6f 66 20 56 4d 20 6d 65 6d 6f 72 79 20  er of VM memory 
ddb0: 72 65 67 69 73 74 65 72 73 20 2a 2f 0a 20 20 69  registers */.  i
ddc0: 6e 74 20 6e 43 75 72 73 6f 72 3b 20 20 20 20 20  nt nCursor;     
ddd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dde0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 75 72 73 6f   Number of curso
ddf0: 72 73 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  rs required */. 
de00: 20 69 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20   int nArg;      
de10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
de20: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
de30: 75 6d 65 6e 74 73 20 69 6e 20 73 75 62 70 72 6f  uments in subpro
de40: 67 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  grams */.  int n
de50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
de60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
de70: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73  p counter */.  s
de80: 74 72 75 63 74 20 52 65 75 73 61 62 6c 65 53 70  truct ReusableSp
de90: 61 63 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a  ace x;        /*
dea0: 20 52 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d   Reusable bulk m
deb0: 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65  emory */..  asse
dec0: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73  rt( p!=0 );.  as
ded0: 73 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29  sert( p->nOp>0 )
dee0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
def0: 73 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  se!=0 );.  asser
df00: 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  t( p->magic==VDB
df10: 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a  E_MAGIC_INIT );.
df20: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
df30: 3d 3d 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20  ==p->pParse );. 
df40: 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61   db = p->db;.  a
df50: 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f  ssert( db->mallo
df60: 63 46 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20  cFailed==0 );.  
df70: 6e 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nVar = pParse->n
df80: 56 61 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50  Var;.  nMem = pP
df90: 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43  arse->nMem;.  nC
dfa0: 75 72 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e  ursor = pParse->
dfb0: 6e 54 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70  nTab;.  nArg = p
dfc0: 50 61 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a  Parse->nMaxArg;.
dfd0: 20 20 0a 20 20 2f 2a 20 45 61 63 68 20 63 75 72    .  /* Each cur
dfe0: 73 6f 72 20 75 73 65 73 20 61 20 6d 65 6d 6f 72  sor uses a memor
dff0: 79 20 63 65 6c 6c 2e 20 20 54 68 65 20 66 69 72  y cell.  The fir
e000: 73 74 20 63 75 72 73 6f 72 20 28 63 75 72 73 6f  st cursor (curso
e010: 72 20 30 29 20 63 61 6e 0a 20 20 2a 2a 20 75 73  r 0) can.  ** us
e020: 65 20 61 4d 65 6d 5b 30 5d 20 77 68 69 63 68 20  e aMem[0] which 
e030: 69 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  is not otherwise
e040: 20 75 73 65 64 20 62 79 20 74 68 65 20 56 44 42   used by the VDB
e050: 45 20 70 72 6f 67 72 61 6d 2e 20 20 41 6c 6c 6f  E program.  Allo
e060: 63 61 74 65 0a 20 20 2a 2a 20 73 70 61 63 65 20  cate.  ** space 
e070: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 4d  at the end of aM
e080: 65 6d 5b 5d 20 66 6f 72 20 63 75 72 73 6f 72 73  em[] for cursors
e090: 20 31 20 61 6e 64 20 67 72 65 61 74 65 72 2e 0a   1 and greater..
e0a0: 20 20 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 61    ** See also: a
e0b0: 6c 6c 6f 63 61 74 65 43 75 72 73 6f 72 28 29 2e  llocateCursor().
e0c0: 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d 20 2b 3d 20  .  */.  nMem += 
e0d0: 6e 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 6e  nCursor;.  if( n
e0e0: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 6e 4d 65  Cursor==0 && nMe
e0f0: 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b 3b 20 20 2f  m>0 ) nMem++;  /
e100: 2a 20 53 70 61 63 65 20 66 6f 72 20 61 4d 65 6d  * Space for aMem
e110: 5b 30 5d 20 65 76 65 6e 20 69 66 20 6e 6f 74 20  [0] even if not 
e120: 75 73 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  used */..  /* Fi
e130: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
e140: 68 20 72 65 75 73 61 62 6c 65 20 6d 65 6d 6f 72  h reusable memor
e150: 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 61  y is available a
e160: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e170: 0a 20 20 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72  .  ** opcode arr
e180: 61 79 2e 20 20 54 68 69 73 20 65 78 74 72 61 20  ay.  This extra 
e190: 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65 20 72  memory will be r
e1a0: 65 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 6f  eallocated for o
e1b0: 74 68 65 72 20 65 6c 65 6d 65 6e 74 73 0a 20 20  ther elements.  
e1c0: 2a 2a 20 6f 66 20 74 68 65 20 70 72 65 70 61 72  ** of the prepar
e1d0: 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20  ed statement..  
e1e0: 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55 4e 44 38 28  */.  n = ROUND8(
e1f0: 73 69 7a 65 6f 66 28 4f 70 29 2a 70 2d 3e 6e 4f  sizeof(Op)*p->nO
e200: 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
e210: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6f 70 63   /* Bytes of opc
e220: 6f 64 65 20 6d 65 6d 6f 72 79 20 75 73 65 64 20  ode memory used 
e230: 2a 2f 0a 20 20 78 2e 70 53 70 61 63 65 20 3d 20  */.  x.pSpace = 
e240: 26 28 28 75 38 2a 29 70 2d 3e 61 4f 70 29 5b 6e  &((u8*)p->aOp)[n
e250: 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
e260: 20 2f 2a 20 55 6e 75 73 65 64 20 6f 70 63 6f 64   /* Unused opcod
e270: 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73  e memory */.  as
e280: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
e290: 5f 41 4c 49 47 4e 4d 45 4e 54 28 78 2e 70 53 70  _ALIGNMENT(x.pSp
e2a0: 61 63 65 29 20 29 3b 0a 20 20 78 2e 6e 46 72 65  ace) );.  x.nFre
e2b0: 65 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 70  e = ROUNDDOWN8(p
e2c0: 50 61 72 73 65 2d 3e 73 7a 4f 70 41 6c 6c 6f 63  Parse->szOpAlloc
e2d0: 20 2d 20 6e 29 3b 20 20 2f 2a 20 42 79 74 65 73   - n);  /* Bytes
e2e0: 20 6f 66 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72   of unused memor
e2f0: 79 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 78  y */.  assert( x
e300: 2e 6e 46 72 65 65 3e 3d 30 20 29 3b 0a 20 20 69  .nFree>=0 );.  i
e310: 66 28 20 78 2e 6e 46 72 65 65 3e 30 20 29 7b 0a  f( x.nFree>0 ){.
e320: 20 20 20 20 6d 65 6d 73 65 74 28 78 2e 70 53 70      memset(x.pSp
e330: 61 63 65 2c 20 30 2c 20 78 2e 6e 46 72 65 65 29  ace, 0, x.nFree)
e340: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 45 49  ;.    assert( EI
e350: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
e360: 4e 54 28 26 78 2e 70 53 70 61 63 65 5b 78 2e 6e  NT(&x.pSpace[x.n
e370: 46 72 65 65 5d 29 20 29 3b 0a 20 20 7d 0a 0a 20  Free]) );.  }.. 
e380: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
e390: 28 70 2c 20 26 6e 41 72 67 29 3b 0a 20 20 70 2d  (p, &nArg);.  p-
e3a0: 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c  >usesStmtJournal
e3b0: 20 3d 20 28 75 38 29 28 70 50 61 72 73 65 2d 3e   = (u8)(pParse->
e3c0: 69 73 4d 75 6c 74 69 57 72 69 74 65 20 26 26 20  isMultiWrite && 
e3d0: 70 50 61 72 73 65 2d 3e 6d 61 79 41 62 6f 72 74  pParse->mayAbort
e3e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  );.  if( pParse-
e3f0: 3e 65 78 70 6c 61 69 6e 20 26 26 20 6e 4d 65 6d  >explain && nMem
e400: 3c 31 30 20 29 7b 0a 20 20 20 20 6e 4d 65 6d 20  <10 ){.    nMem 
e410: 3d 20 31 30 3b 0a 20 20 7d 0a 20 20 70 2d 3e 65  = 10;.  }.  p->e
e420: 78 70 69 72 65 64 20 3d 20 30 3b 0a 0a 20 20 2f  xpired = 0;..  /
e430: 2a 20 4d 65 6d 6f 72 79 20 66 6f 72 20 72 65 67  * Memory for reg
e440: 69 73 74 65 72 73 2c 20 70 61 72 61 6d 65 74 65  isters, paramete
e450: 72 73 2c 20 63 75 72 73 6f 72 2c 20 65 74 63 2c  rs, cursor, etc,
e460: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 69 6e   is allocated in
e470: 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 20 20 2a 2a   one or two.  **
e480: 20 70 61 73 73 65 73 2e 20 20 4f 6e 20 74 68 65   passes.  On the
e490: 20 66 69 72 73 74 20 70 61 73 73 2c 20 77 65 20   first pass, we 
e4a0: 74 72 79 20 74 6f 20 72 65 75 73 65 20 75 6e 75  try to reuse unu
e4b0: 73 65 64 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  sed memory at th
e4c0: 65 20 0a 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74  e .  ** end of t
e4d0: 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e  he opcode array.
e4e0: 20 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62    If we are unab
e4f0: 6c 65 20 74 6f 20 73 61 74 69 73 66 79 20 61 6c  le to satisfy al
e500: 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a 2a 20 72 65  l memory.  ** re
e510: 71 75 69 72 65 6d 65 6e 74 73 20 62 79 20 72 65  quirements by re
e520: 75 73 69 6e 67 20 74 68 65 20 6f 70 63 6f 64 65  using the opcode
e530: 20 61 72 72 61 79 20 74 61 69 6c 2c 20 74 68 65   array tail, the
e540: 6e 20 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 2a  n the second.  *
e550: 2a 20 70 61 73 73 20 77 69 6c 6c 20 66 69 6c 6c  * pass will fill
e560: 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64 65   in the remainde
e570: 72 20 75 73 69 6e 67 20 61 20 66 72 65 73 68 20  r using a fresh 
e580: 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
e590: 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  n.  .  **.  ** T
e5a0: 68 69 73 20 74 77 6f 2d 70 61 73 73 20 61 70 70  his two-pass app
e5b0: 72 6f 61 63 68 20 74 68 61 74 20 72 65 75 73 65  roach that reuse
e5c0: 73 20 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79  s as much memory
e5d0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 66 72 6f   as possible fro
e5e0: 6d 0a 20 20 2a 2a 20 74 68 65 20 6c 65 66 74 6f  m.  ** the lefto
e5f0: 76 65 72 20 6d 65 6d 6f 72 79 20 61 74 20 74 68  ver memory at th
e600: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63  e end of the opc
e610: 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69 73  ode array.  This
e620: 20 63 61 6e 20 73 69 67 6e 69 66 69 63 61 6e 74   can significant
e630: 6c 79 0a 20 20 2a 2a 20 72 65 64 75 63 65 20 74  ly.  ** reduce t
e640: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65 6d  he amount of mem
e650: 6f 72 79 20 68 65 6c 64 20 62 79 20 61 20 70 72  ory held by a pr
e660: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e670: 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20 7b 0a 20 20  ..  */.  do {.  
e680: 20 20 78 2e 6e 4e 65 65 64 65 64 20 3d 20 30 3b    x.nNeeded = 0;
e690: 0a 20 20 20 20 70 2d 3e 61 4d 65 6d 20 3d 20 61  .    p->aMem = a
e6a0: 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d  llocSpace(&x, p-
e6b0: 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a 73 69 7a 65  >aMem, nMem*size
e6c0: 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d  of(Mem));.    p-
e6d0: 3e 61 56 61 72 20 3d 20 61 6c 6c 6f 63 53 70 61  >aVar = allocSpa
e6e0: 63 65 28 26 78 2c 20 70 2d 3e 61 56 61 72 2c 20  ce(&x, p->aVar, 
e6f0: 6e 56 61 72 2a 73 69 7a 65 6f 66 28 4d 65 6d 29  nVar*sizeof(Mem)
e700: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 41 72 67 20  );.    p->apArg 
e710: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
e720: 20 70 2d 3e 61 70 41 72 67 2c 20 6e 41 72 67 2a   p->apArg, nArg*
e730: 73 69 7a 65 6f 66 28 4d 65 6d 2a 29 29 3b 0a 20  sizeof(Mem*));. 
e740: 20 20 20 70 2d 3e 61 70 43 73 72 20 3d 20 61 6c     p->apCsr = al
e750: 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e  locSpace(&x, p->
e760: 61 70 43 73 72 2c 20 6e 43 75 72 73 6f 72 2a 73  apCsr, nCursor*s
e770: 69 7a 65 6f 66 28 56 64 62 65 43 75 72 73 6f 72  izeof(VdbeCursor
e780: 2a 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  *));.#ifdef SQLI
e790: 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53  TE_ENABLE_STMT_S
e7a0: 43 41 4e 53 54 41 54 55 53 0a 20 20 20 20 70 2d  CANSTATUS.    p-
e7b0: 3e 61 6e 45 78 65 63 20 3d 20 61 6c 6c 6f 63 53  >anExec = allocS
e7c0: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 6e 45 78  pace(&x, p->anEx
e7d0: 65 63 2c 20 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f  ec, p->nOp*sizeo
e7e0: 66 28 69 36 34 29 29 3b 0a 23 65 6e 64 69 66 0a  f(i64));.#endif.
e7f0: 20 20 20 20 69 66 28 20 78 2e 6e 4e 65 65 64 65      if( x.nNeede
e800: 64 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  d==0 ) break;.  
e810: 20 20 78 2e 70 53 70 61 63 65 20 3d 20 70 2d 3e    x.pSpace = p->
e820: 70 46 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  pFree = sqlite3D
e830: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
e840: 78 2e 6e 4e 65 65 64 65 64 29 3b 0a 20 20 20 20  x.nNeeded);.    
e850: 78 2e 6e 46 72 65 65 20 3d 20 78 2e 6e 4e 65 65  x.nFree = x.nNee
e860: 64 65 64 3b 0a 20 20 7d 77 68 69 6c 65 28 20 21  ded;.  }while( !
e870: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
e880: 20 29 3b 0a 0a 20 20 70 2d 3e 6e 43 75 72 73 6f   );..  p->nCurso
e890: 72 20 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69  r = nCursor;.  i
e8a0: 66 28 20 70 2d 3e 61 56 61 72 20 29 7b 0a 20 20  f( p->aVar ){.  
e8b0: 20 20 70 2d 3e 6e 56 61 72 20 3d 20 28 79 6e 56    p->nVar = (ynV
e8c0: 61 72 29 6e 56 61 72 3b 0a 20 20 20 20 66 6f 72  ar)nVar;.    for
e8d0: 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72 3b 20 6e 2b  (n=0; n<nVar; n+
e8e0: 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61 56 61  +){.      p->aVa
e8f0: 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  r[n].flags = MEM
e900: 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20 70 2d 3e  _Null;.      p->
e910: 61 56 61 72 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b  aVar[n].db = db;
e920: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e  .    }.  }.  p->
e930: 6e 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  nzVar = pParse->
e940: 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e 61 7a 56 61  nzVar;.  p->azVa
e950: 72 20 3d 20 70 50 61 72 73 65 2d 3e 61 7a 56 61  r = pParse->azVa
e960: 72 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e 7a 56  r;.  pParse->nzV
e970: 61 72 20 3d 20 20 30 3b 0a 20 20 70 50 61 72 73  ar =  0;.  pPars
e980: 65 2d 3e 61 7a 56 61 72 20 3d 20 30 3b 0a 20 20  e->azVar = 0;.  
e990: 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20  if( p->aMem ){. 
e9a0: 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d 20 6e 4d 65     p->nMem = nMe
e9b0: 6d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20  m;.    for(n=0; 
e9c0: 6e 3c 6e 4d 65 6d 3b 20 6e 2b 2b 29 7b 0a 20 20  n<nMem; n++){.  
e9d0: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 66      p->aMem[n].f
e9e0: 6c 61 67 73 20 3d 20 4d 45 4d 5f 55 6e 64 65 66  lags = MEM_Undef
e9f0: 69 6e 65 64 3b 0a 20 20 20 20 20 20 70 2d 3e 61  ined;.      p->a
ea00: 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20 64 62 3b 0a  Mem[n].db = db;.
ea10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 2d 3e 65      }.  }.  p->e
ea20: 78 70 6c 61 69 6e 20 3d 20 70 50 61 72 73 65 2d  xplain = pParse-
ea30: 3e 65 78 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69  >explain;.  sqli
ea40: 74 65 33 56 64 62 65 52 65 77 69 6e 64 28 70 29  te3VdbeRewind(p)
ea50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
ea60: 20 61 20 56 44 42 45 20 63 75 72 73 6f 72 20 61   a VDBE cursor a
ea70: 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74  nd release all t
ea80: 68 65 20 72 65 73 6f 75 72 63 65 73 20 74 68 61  he resources tha
ea90: 74 20 63 75 72 73 6f 72 20 0a 2a 2a 20 68 61 70  t cursor .** hap
eaa0: 70 65 6e 73 20 74 6f 20 68 6f 6c 64 2e 0a 2a 2f  pens to hold..*/
eab0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
eac0: 65 46 72 65 65 43 75 72 73 6f 72 28 56 64 62 65  eFreeCursor(Vdbe
ead0: 20 2a 70 2c 20 56 64 62 65 43 75 72 73 6f 72 20   *p, VdbeCursor 
eae0: 2a 70 43 78 29 7b 0a 20 20 69 66 28 20 70 43 78  *pCx){.  if( pCx
eaf0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
eb00: 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  n;.  }.  assert(
eb10: 20 70 43 78 2d 3e 70 42 74 3d 3d 30 20 7c 7c 20   pCx->pBt==0 || 
eb20: 70 43 78 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  pCx->eCurType==C
eb30: 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
eb40: 20 20 73 77 69 74 63 68 28 20 70 43 78 2d 3e 65    switch( pCx->e
eb50: 43 75 72 54 79 70 65 20 29 7b 0a 20 20 20 20 63  CurType ){.    c
eb60: 61 73 65 20 43 55 52 54 59 50 45 5f 53 4f 52 54  ase CURTYPE_SORT
eb70: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
eb80: 74 65 33 56 64 62 65 53 6f 72 74 65 72 43 6c 6f  te3VdbeSorterClo
eb90: 73 65 28 70 2d 3e 64 62 2c 20 70 43 78 29 3b 0a  se(p->db, pCx);.
eba0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ebb0: 20 7d 0a 20 20 20 20 63 61 73 65 20 43 55 52 54   }.    case CURT
ebc0: 59 50 45 5f 42 54 52 45 45 3a 20 7b 0a 20 20 20  YPE_BTREE: {.   
ebd0: 20 20 20 69 66 28 20 70 43 78 2d 3e 70 42 74 20     if( pCx->pBt 
ebe0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ebf0: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 43 78  e3BtreeClose(pCx
ec00: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20  ->pBt);.        
ec10: 2f 2a 20 54 68 65 20 70 43 78 2d 3e 70 43 75 72  /* The pCx->pCur
ec20: 73 6f 72 20 77 69 6c 6c 20 62 65 20 63 6c 6f 73  sor will be clos
ec30: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2c  e automatically,
ec40: 20 69 66 20 69 74 20 65 78 69 73 74 73 2c 20 62   if it exists, b
ec50: 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  y.        ** the
ec60: 20 63 61 6c 6c 20 61 62 6f 76 65 2e 20 2a 2f 0a   call above. */.
ec70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
ec80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 78       assert( pCx
ec90: 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30 20  ->uc.pCursor!=0 
eca0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ecb0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
ecc0: 6f 72 28 70 43 78 2d 3e 75 63 2e 70 43 75 72 73  or(pCx->uc.pCurs
ecd0: 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  or);.      }.   
ece0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ecf0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ed00: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
ed10: 0a 20 20 20 20 63 61 73 65 20 43 55 52 54 59 50  .    case CURTYP
ed20: 45 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20  E_VTAB: {.      
ed30: 73 71 6c 69 74 65 33 5f 76 74 61 62 5f 63 75 72  sqlite3_vtab_cur
ed40: 73 6f 72 20 2a 70 56 43 75 72 20 3d 20 70 43 78  sor *pVCur = pCx
ed50: 2d 3e 75 63 2e 70 56 43 75 72 3b 0a 20 20 20 20  ->uc.pVCur;.    
ed60: 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f    const sqlite3_
ed70: 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64 75 6c 65 20  module *pModule 
ed80: 3d 20 70 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e  = pVCur->pVtab->
ed90: 70 4d 6f 64 75 6c 65 3b 0a 20 20 20 20 20 20 61  pModule;.      a
eda0: 73 73 65 72 74 28 20 70 56 43 75 72 2d 3e 70 56  ssert( pVCur->pV
edb0: 74 61 62 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  tab->nRef>0 );. 
edc0: 20 20 20 20 20 70 56 43 75 72 2d 3e 70 56 74 61       pVCur->pVta
edd0: 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 20  b->nRef--;.     
ede0: 20 70 4d 6f 64 75 6c 65 2d 3e 78 43 6c 6f 73 65   pModule->xClose
edf0: 28 70 56 43 75 72 29 3b 0a 20 20 20 20 20 20 62  (pVCur);.      b
ee00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
ee10: 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
ee20: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
ee30: 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
ee40: 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69   frame..*/.stati
ee50: 63 20 76 6f 69 64 20 63 6c 6f 73 65 43 75 72 73  c void closeCurs
ee60: 6f 72 73 49 6e 46 72 61 6d 65 28 56 64 62 65 20  orsInFrame(Vdbe 
ee70: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 61 70  *p){.  if( p->ap
ee80: 43 73 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  Csr ){.    int i
ee90: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
eea0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
eeb0: 29 7b 0a 20 20 20 20 20 20 56 64 62 65 43 75 72  ){.      VdbeCur
eec0: 73 6f 72 20 2a 70 43 20 3d 20 70 2d 3e 61 70 43  sor *pC = p->apC
eed0: 73 72 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  sr[i];.      if(
eee0: 20 70 43 20 29 7b 0a 20 20 20 20 20 20 20 20 73   pC ){.        s
eef0: 71 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75  qlite3VdbeFreeCu
ef00: 72 73 6f 72 28 70 2c 20 70 43 29 3b 0a 20 20 20  rsor(p, pC);.   
ef10: 20 20 20 20 20 70 2d 3e 61 70 43 73 72 5b 69 5d       p->apCsr[i]
ef20: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
ef30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ef40: 20 43 6f 70 79 20 74 68 65 20 76 61 6c 75 65 73   Copy the values
ef50: 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 56   stored in the V
ef60: 64 62 65 46 72 61 6d 65 20 73 74 72 75 63 74 75  dbeFrame structu
ef70: 72 65 20 74 6f 20 69 74 73 20 56 64 62 65 2e 20  re to its Vdbe. 
ef80: 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65 64 2c  This.** is used,
ef90: 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68   for example, wh
efa0: 65 6e 20 61 20 74 72 69 67 67 65 72 20 73 75 62  en a trigger sub
efb0: 2d 70 72 6f 67 72 61 6d 20 69 73 20 68 61 6c 74  -program is halt
efc0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 0a 2a 2a  ed to restore.**
efd0: 20 63 6f 6e 74 72 6f 6c 20 74 6f 20 74 68 65 20   control to the 
efe0: 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2e 0a 2a 2f  main program..*/
eff0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
f000: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 56 64 62  FrameRestore(Vdb
f010: 65 46 72 61 6d 65 20 2a 70 46 72 61 6d 65 29 7b  eFrame *pFrame){
f020: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 46 72  .  Vdbe *v = pFr
f030: 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c 6f 73 65 43  ame->v;.  closeC
f040: 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 76 29  ursorsInFrame(v)
f050: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
f060: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
f070: 53 54 41 54 55 53 0a 20 20 76 2d 3e 61 6e 45 78  STATUS.  v->anEx
f080: 65 63 20 3d 20 70 46 72 61 6d 65 2d 3e 61 6e 45  ec = pFrame->anE
f090: 78 65 63 3b 0a 23 65 6e 64 69 66 0a 20 20 76 2d  xec;.#endif.  v-
f0a0: 3e 61 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 61  >aOp = pFrame->a
f0b0: 4f 70 3b 0a 20 20 76 2d 3e 6e 4f 70 20 3d 20 70  Op;.  v->nOp = p
f0c0: 46 72 61 6d 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d  Frame->nOp;.  v-
f0d0: 3e 61 4d 65 6d 20 3d 20 70 46 72 61 6d 65 2d 3e  >aMem = pFrame->
f0e0: 61 4d 65 6d 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20  aMem;.  v->nMem 
f0f0: 3d 20 70 46 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a  = pFrame->nMem;.
f100: 20 20 76 2d 3e 61 70 43 73 72 20 3d 20 70 46 72    v->apCsr = pFr
f110: 61 6d 65 2d 3e 61 70 43 73 72 3b 0a 20 20 76 2d  ame->apCsr;.  v-
f120: 3e 6e 43 75 72 73 6f 72 20 3d 20 70 46 72 61 6d  >nCursor = pFram
f130: 65 2d 3e 6e 43 75 72 73 6f 72 3b 0a 20 20 76 2d  e->nCursor;.  v-
f140: 3e 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 20 3d  >db->lastRowid =
f150: 20 70 46 72 61 6d 65 2d 3e 6c 61 73 74 52 6f 77   pFrame->lastRow
f160: 69 64 3b 0a 20 20 76 2d 3e 6e 43 68 61 6e 67 65  id;.  v->nChange
f170: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 68 61 6e   = pFrame->nChan
f180: 67 65 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6e 43 68  ge;.  v->db->nCh
f190: 61 6e 67 65 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  ange = pFrame->n
f1a0: 44 62 43 68 61 6e 67 65 3b 0a 20 20 73 71 6c 69  DbChange;.  sqli
f1b0: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
f1c0: 44 61 74 61 28 76 2d 3e 64 62 2c 20 26 76 2d 3e  Data(v->db, &v->
f1d0: 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
f1e0: 3b 0a 20 20 76 2d 3e 70 41 75 78 44 61 74 61 20  ;.  v->pAuxData 
f1f0: 3d 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61  = pFrame->pAuxDa
f200: 74 61 3b 0a 20 20 70 46 72 61 6d 65 2d 3e 70 41  ta;.  pFrame->pA
f210: 75 78 44 61 74 61 20 3d 20 30 3b 0a 20 20 72 65  uxData = 0;.  re
f220: 74 75 72 6e 20 70 46 72 61 6d 65 2d 3e 70 63 3b  turn pFrame->pc;
f230: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
f240: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a  all cursors..**.
f250: 2a 2a 20 41 6c 73 6f 20 72 65 6c 65 61 73 65 20  ** Also release 
f260: 61 6e 79 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f  any dynamic memo
f270: 72 79 20 68 65 6c 64 20 62 79 20 74 68 65 20 56  ry held by the V
f280: 4d 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 4d  M in the Vdbe.aM
f290: 65 6d 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 63 65  em memory .** ce
f2a0: 6c 6c 20 61 72 72 61 79 2e 20 54 68 69 73 20 69  ll array. This i
f2b0: 73 20 6e 65 63 65 73 73 61 72 79 20 61 73 20 74  s necessary as t
f2c0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61  he memory cell a
f2d0: 72 72 61 79 20 6d 61 79 20 63 6f 6e 74 61 69 6e  rray may contain
f2e0: 0a 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  .** pointers to 
f2f0: 56 64 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74  VdbeFrame object
f300: 73 2c 20 77 68 69 63 68 20 6d 61 79 20 69 6e 20  s, which may in 
f310: 74 75 72 6e 20 63 6f 6e 74 61 69 6e 20 70 6f 69  turn contain poi
f320: 6e 74 65 72 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  nters to.** open
f330: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61   cursors..*/.sta
f340: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 41 6c  tic void closeAl
f350: 6c 43 75 72 73 6f 72 73 28 56 64 62 65 20 2a 70  lCursors(Vdbe *p
f360: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 70 46 72 61  ){.  if( p->pFra
f370: 6d 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72  me ){.    VdbeFr
f380: 61 6d 65 20 2a 70 46 72 61 6d 65 3b 0a 20 20 20  ame *pFrame;.   
f390: 20 66 6f 72 28 70 46 72 61 6d 65 3d 70 2d 3e 70   for(pFrame=p->p
f3a0: 46 72 61 6d 65 3b 20 70 46 72 61 6d 65 2d 3e 70  Frame; pFrame->p
f3b0: 50 61 72 65 6e 74 3b 20 70 46 72 61 6d 65 3d 70  Parent; pFrame=p
f3c0: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 29 3b  Frame->pParent);
f3d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
f3e0: 46 72 61 6d 65 52 65 73 74 6f 72 65 28 70 46 72  FrameRestore(pFr
f3f0: 61 6d 65 29 3b 0a 20 20 20 20 70 2d 3e 70 46 72  ame);.    p->pFr
f400: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ame = 0;.    p->
f410: 6e 46 72 61 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a  nFrame = 0;.  }.
f420: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e 46 72    assert( p->nFr
f430: 61 6d 65 3d 3d 30 20 29 3b 0a 20 20 63 6c 6f 73  ame==0 );.  clos
f440: 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28  eCursorsInFrame(
f450: 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65  p);.  if( p->aMe
f460: 6d 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  m ){.    release
f470: 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 4d 65 6d  MemArray(p->aMem
f480: 2c 20 70 2d 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a  , p->nMem);.  }.
f490: 20 20 77 68 69 6c 65 28 20 70 2d 3e 70 44 65 6c    while( p->pDel
f4a0: 46 72 61 6d 65 20 29 7b 0a 20 20 20 20 56 64 62  Frame ){.    Vdb
f4b0: 65 46 72 61 6d 65 20 2a 70 44 65 6c 20 3d 20 70  eFrame *pDel = p
f4c0: 2d 3e 70 44 65 6c 46 72 61 6d 65 3b 0a 20 20 20  ->pDelFrame;.   
f4d0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 3d 20   p->pDelFrame = 
f4e0: 70 44 65 6c 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  pDel->pParent;. 
f4f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
f500: 61 6d 65 44 65 6c 65 74 65 28 70 44 65 6c 29 3b  ameDelete(pDel);
f510: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 6c 65 74  .  }..  /* Delet
f520: 65 20 61 6e 79 20 61 75 78 64 61 74 61 20 61 6c  e any auxdata al
f530: 6c 6f 63 61 74 69 6f 6e 73 20 6d 61 64 65 20 62  locations made b
f540: 79 20 74 68 65 20 56 4d 20 2a 2f 0a 20 20 69 66  y the VM */.  if
f550: 28 20 70 2d 3e 70 41 75 78 44 61 74 61 20 29 20  ( p->pAuxData ) 
f560: 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
f570: 65 41 75 78 44 61 74 61 28 70 2d 3e 64 62 2c 20  eAuxData(p->db, 
f580: 26 70 2d 3e 70 41 75 78 44 61 74 61 2c 20 2d 31  &p->pAuxData, -1
f590: 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
f5a0: 70 2d 3e 70 41 75 78 44 61 74 61 3d 3d 30 20 29  p->pAuxData==0 )
f5b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e  ;.}../*.** Clean
f5c0: 20 75 70 20 74 68 65 20 56 4d 20 61 66 74 65 72   up the VM after
f5d0: 20 61 20 73 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a   a single run..*
f5e0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 43 6c  /.static void Cl
f5f0: 65 61 6e 75 70 28 56 64 62 65 20 2a 70 29 7b 0a  eanup(Vdbe *p){.
f600: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
f610: 70 2d 3e 64 62 3b 0a 0a 23 69 66 64 65 66 20 53  p->db;..#ifdef S
f620: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
f630: 20 45 78 65 63 75 74 65 20 61 73 73 65 72 74 28   Execute assert(
f640: 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20  ) statements to 
f650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
f660: 56 64 62 65 2e 61 70 43 73 72 5b 5d 20 61 6e 64  Vdbe.apCsr[] and
f670: 20 0a 20 20 2a 2a 20 56 64 62 65 2e 61 4d 65 6d   .  ** Vdbe.aMem
f680: 5b 5d 20 61 72 72 61 79 73 20 68 61 76 65 20 61  [] arrays have a
f690: 6c 72 65 61 64 79 20 62 65 65 6e 20 63 6c 65 61  lready been clea
f6a0: 6e 65 64 20 75 70 2e 20 20 2a 2f 0a 20 20 69 6e  ned up.  */.  in
f6b0: 74 20 69 3b 0a 20 20 69 66 28 20 70 2d 3e 61 70  t i;.  if( p->ap
f6c0: 43 73 72 20 29 20 66 6f 72 28 69 3d 30 3b 20 69  Csr ) for(i=0; i
f6d0: 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b 20 69 2b 2b  <p->nCursor; i++
f6e0: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 70 43  ) assert( p->apC
f6f0: 73 72 5b 69 5d 3d 3d 30 20 29 3b 0a 20 20 69 66  sr[i]==0 );.  if
f700: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
f710: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
f720: 4d 65 6d 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  Mem; i++) assert
f730: 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61  ( p->aMem[i].fla
f740: 67 73 3d 3d 4d 45 4d 5f 55 6e 64 65 66 69 6e 65  gs==MEM_Undefine
f750: 64 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  d );.  }.#endif.
f760: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
f770: 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
f780: 3b 0a 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d  ;.  p->zErrMsg =
f790: 20 30 3b 0a 20 20 70 2d 3e 70 52 65 73 75 6c 74   0;.  p->pResult
f7a0: 53 65 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Set = 0;.}../*.*
f7b0: 2a 20 53 65 74 20 74 68 65 20 6e 75 6d 62 65 72  * Set the number
f7c0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
f7d0: 6e 73 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  ns that will be 
f7e0: 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69 73  returned by this
f7f0: 20 53 51 4c 0a 2a 2a 20 73 74 61 74 65 6d 65 6e   SQL.** statemen
f800: 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 77 20 73  t. This is now s
f810: 65 74 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  et at compile ti
f820: 6d 65 2c 20 72 61 74 68 65 72 20 74 68 61 6e 20  me, rather than 
f830: 64 75 72 69 6e 67 0a 2a 2a 20 65 78 65 63 75 74  during.** execut
f840: 69 6f 6e 20 6f 66 20 74 68 65 20 76 64 62 65 20  ion of the vdbe 
f850: 70 72 6f 67 72 61 6d 20 73 6f 20 74 68 61 74 20  program so that 
f860: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
f870: 6f 75 6e 74 28 29 20 63 61 6e 0a 2a 2a 20 62 65  ount() can.** be
f880: 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e 20 53 51   called on an SQ
f890: 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 66 6f  L statement befo
f8a0: 72 65 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  re sqlite3_step(
f8b0: 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  )..*/.void sqlit
f8c0: 65 33 56 64 62 65 53 65 74 4e 75 6d 43 6f 6c 73  e3VdbeSetNumCols
f8d0: 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 6e 52  (Vdbe *p, int nR
f8e0: 65 73 43 6f 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d  esColumn){.  Mem
f8f0: 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e   *pColName;.  in
f900: 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  t n;.  sqlite3 *
f910: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 72  db = p->db;..  r
f920: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
f930: 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e  ->aColName, p->n
f940: 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d  ResColumn*COLNAM
f950: 45 5f 4e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44  E_N);.  sqlite3D
f960: 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 43 6f  bFree(db, p->aCo
f970: 6c 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 6e 52  lName);.  n = nR
f980: 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45  esColumn*COLNAME
f990: 5f 4e 3b 0a 20 20 70 2d 3e 6e 52 65 73 43 6f 6c  _N;.  p->nResCol
f9a0: 75 6d 6e 20 3d 20 28 75 31 36 29 6e 52 65 73 43  umn = (u16)nResC
f9b0: 6f 6c 75 6d 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c  olumn;.  p->aCol
f9c0: 4e 61 6d 65 20 3d 20 70 43 6f 6c 4e 61 6d 65 20  Name = pColName 
f9d0: 3d 20 28 4d 65 6d 2a 29 73 71 6c 69 74 65 33 44  = (Mem*)sqlite3D
f9e0: 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20  bMallocZero(db, 
f9f0: 73 69 7a 65 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b  sizeof(Mem)*n );
fa00: 0a 20 20 69 66 28 20 70 2d 3e 61 43 6f 6c 4e 61  .  if( p->aColNa
fa10: 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  me==0 ) return;.
fa20: 20 20 77 68 69 6c 65 28 20 6e 2d 2d 20 3e 20 30    while( n-- > 0
fa30: 20 29 7b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65   ){.    pColName
fa40: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
fa50: 6c 6c 3b 0a 20 20 20 20 70 43 6f 6c 4e 61 6d 65  ll;.    pColName
fa60: 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
fa70: 20 20 70 43 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20    pColName++;.  
fa80: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  }.}../*.** Set t
fa90: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
faa0: 64 78 27 74 68 20 63 6f 6c 75 6d 6e 20 74 6f 20  dx'th column to 
fab0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  be returned by t
fac0: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
fad0: 2e 0a 2a 2a 20 7a 4e 61 6d 65 20 6d 75 73 74 20  ..** zName must 
fae0: 62 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  be a pointer to 
faf0: 61 20 6e 75 6c 20 74 65 72 6d 69 6e 61 74 65 64  a nul terminated
fb00: 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54   string..**.** T
fb10: 68 69 73 20 63 61 6c 6c 20 6d 75 73 74 20 62 65  his call must be
fb20: 20 6d 61 64 65 20 61 66 74 65 72 20 61 20 63 61   made after a ca
fb30: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 56 64 62  ll to sqlite3Vdb
fb40: 65 53 65 74 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a  eSetNumCols()..*
fb50: 2a 0a 2a 2a 20 54 68 65 20 66 69 6e 61 6c 20 70  *.** The final p
fb60: 61 72 61 6d 65 74 65 72 2c 20 78 44 65 6c 2c 20  arameter, xDel, 
fb70: 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 53  must be one of S
fb80: 51 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 53  QLITE_DYNAMIC, S
fb90: 51 4c 49 54 45 5f 53 54 41 54 49 43 0a 2a 2a 20  QLITE_STATIC.** 
fba0: 6f 72 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  or SQLITE_TRANSI
fbb0: 45 4e 54 2e 20 49 66 20 69 74 20 69 73 20 53 51  ENT. If it is SQ
fbc0: 4c 49 54 45 5f 44 59 4e 41 4d 49 43 2c 20 74 68  LITE_DYNAMIC, th
fbd0: 65 6e 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  en the buffer po
fbe0: 69 6e 74 65 64 0a 2a 2a 20 74 6f 20 62 79 20 7a  inted.** to by z
fbf0: 4e 61 6d 65 20 77 69 6c 6c 20 62 65 20 66 72 65  Name will be fre
fc00: 65 64 20 62 79 20 73 71 6c 69 74 65 33 44 62 46  ed by sqlite3DbF
fc10: 72 65 65 28 29 20 77 68 65 6e 20 74 68 65 20 76  ree() when the v
fc20: 64 62 65 20 69 73 20 64 65 73 74 72 6f 79 65 64  dbe is destroyed
fc30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fc40: 56 64 62 65 53 65 74 43 6f 6c 4e 61 6d 65 28 0a  VdbeSetColName(.
fc50: 20 20 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20    Vdbe *p,      
fc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fc70: 20 20 20 2f 2a 20 56 64 62 65 20 62 65 69 6e 67     /* Vdbe being
fc80: 20 63 6f 6e 66 69 67 75 72 65 64 20 2a 2f 0a 20   configured */. 
fc90: 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20 20   int idx,       
fca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcb0: 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f    /* Index of co
fcc0: 6c 75 6d 6e 20 7a 4e 61 6d 65 20 61 70 70 6c 69  lumn zName appli
fcd0: 65 73 20 74 6f 20 2a 2f 0a 20 20 69 6e 74 20 76  es to */.  int v
fce0: 61 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ar,             
fcf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
fd00: 6e 65 20 6f 66 20 74 68 65 20 43 4f 4c 4e 41 4d  ne of the COLNAM
fd10: 45 5f 2a 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  E_* constants */
fd20: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
fd30: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  Name,           
fd40: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
fd50: 6f 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  o buffer contain
fd60: 69 6e 67 20 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f  ing name */.  vo
fd70: 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
fd80: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  )              /
fd90: 2a 20 4d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d  * Memory managem
fda0: 65 6e 74 20 73 74 72 61 74 65 67 79 20 66 6f 72  ent strategy for
fdb0: 20 7a 4e 61 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69   zName */.){.  i
fdc0: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 20 2a 70 43  nt rc;.  Mem *pC
fdd0: 6f 6c 4e 61 6d 65 3b 0a 20 20 61 73 73 65 72 74  olName;.  assert
fde0: 28 20 69 64 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c  ( idx<p->nResCol
fdf0: 75 6d 6e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  umn );.  assert(
fe00: 20 76 61 72 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29   var<COLNAME_N )
fe10: 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d  ;.  if( p->db->m
fe20: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fe30: 20 20 20 61 73 73 65 72 74 28 20 21 7a 4e 61 6d     assert( !zNam
fe40: 65 20 7c 7c 20 78 44 65 6c 21 3d 53 51 4c 49 54  e || xDel!=SQLIT
fe50: 45 5f 44 59 4e 41 4d 49 43 20 29 3b 0a 20 20 20  E_DYNAMIC );.   
fe60: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
fe70: 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
fe80: 20 61 73 73 65 72 74 28 20 70 2d 3e 61 43 6f 6c   assert( p->aCol
fe90: 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 70 43 6f  Name!=0 );.  pCo
fea0: 6c 4e 61 6d 65 20 3d 20 26 28 70 2d 3e 61 43 6f  lName = &(p->aCo
feb0: 6c 4e 61 6d 65 5b 69 64 78 2b 76 61 72 2a 70 2d  lName[idx+var*p-
fec0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20  >nResColumn]);. 
fed0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
fee0: 65 4d 65 6d 53 65 74 53 74 72 28 70 43 6f 6c 4e  eMemSetStr(pColN
fef0: 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20  ame, zName, -1, 
ff00: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 78 44 65  SQLITE_UTF8, xDe
ff10: 6c 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  l);.  assert( rc
ff20: 21 3d 30 20 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c  !=0 || !zName ||
ff30: 20 28 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67   (pColName->flag
ff40: 73 26 4d 45 4d 5f 54 65 72 6d 29 21 3d 30 20 29  s&MEM_Term)!=0 )
ff50: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
ff60: 0a 0a 2f 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6f  ../*.** A read o
ff70: 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
ff80: 69 6f 6e 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ion may or may n
ff90: 6f 74 20 62 65 20 61 63 74 69 76 65 20 6f 6e 20  ot be active on 
ffa0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
ffb0: 2a 2a 20 64 62 2e 20 49 66 20 61 20 74 72 61 6e  ** db. If a tran
ffc0: 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
ffd0: 65 2c 20 63 6f 6d 6d 69 74 20 69 74 2e 20 49 66  e, commit it. If
ffe0: 20 74 68 65 72 65 20 69 73 20 61 0a 2a 2a 20 77   there is a.** w
fff0: 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10000 20 73 70 61 6e 6e 69 6e 67 20 6d 6f 72 65 20 74   spanning more t
10010 68 61 6e 20 6f 6e 65 20 64 61 74 61 62 61 73 65  han one database
10020 20 66 69 6c 65 2c 20 74 68 69 73 20 72 6f 75 74   file, this rout
10030 69 6e 65 0a 2a 2a 20 74 61 6b 65 73 20 63 61 72  ine.** takes car
10040 65 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72 20  e of the master 
10050 6a 6f 75 72 6e 61 6c 20 74 72 69 63 6b 65 72 79  journal trickery
10060 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10070 76 64 62 65 43 6f 6d 6d 69 74 28 73 71 6c 69 74  vdbeCommit(sqlit
10080 65 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29  e3 *db, Vdbe *p)
10090 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
100a0 20 6e 54 72 61 6e 73 20 3d 20 30 3b 20 20 2f 2a   nTrans = 0;  /*
100b0 20 4e 75 6d 62 65 72 20 6f 66 20 64 61 74 61 62   Number of datab
100c0 61 73 65 73 20 77 69 74 68 20 61 6e 20 61 63 74  ases with an act
100d0 69 76 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61  ive write-transa
100e0 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
100f0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
10100 20 61 72 65 20 63 61 6e 64 69 64 61 74 65 73 20   are candidates 
10110 66 6f 72 20 61 20 74 77 6f 2d 70 68 61 73 65 20  for a two-phase 
10120 63 6f 6d 6d 69 74 20 75 73 69 6e 67 20 61 0a 20  commit using a. 
10130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10140 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72    ** master-jour
10150 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  nal */.  int rc 
10160 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
10170 6e 74 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d  nt needXcommit =
10180 20 30 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   0;..#ifdef SQLI
10190 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
101a0 41 42 4c 45 0a 20 20 2f 2a 20 57 69 74 68 20 74  ABLE.  /* With t
101b0 68 69 73 20 6f 70 74 69 6f 6e 2c 20 73 71 6c 69  his option, sqli
101c0 74 65 33 56 74 61 62 53 79 6e 63 28 29 20 69 73  te3VtabSync() is
101d0 20 64 65 66 69 6e 65 64 20 74 6f 20 62 65 20 73   defined to be s
101e0 69 6d 70 6c 79 20 0a 20 20 2a 2a 20 53 51 4c 49  imply .  ** SQLI
101f0 54 45 5f 4f 4b 20 73 6f 20 70 20 69 73 20 6e 6f  TE_OK so p is no
10200 74 20 75 73 65 64 2e 20 0a 20 20 2a 2f 0a 20 20  t used. .  */.  
10210 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
10220 28 70 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  (p);.#endif..  /
10230 2a 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  * Before doing a
10240 6e 79 74 68 69 6e 67 20 65 6c 73 65 2c 20 63 61  nything else, ca
10250 6c 6c 20 74 68 65 20 78 53 79 6e 63 28 29 20 63  ll the xSync() c
10260 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 79 0a  allback for any.
10270 20 20 2a 2a 20 76 69 72 74 75 61 6c 20 6d 6f 64    ** virtual mod
10280 75 6c 65 20 74 61 62 6c 65 73 20 77 72 69 74 74  ule tables writt
10290 65 6e 20 69 6e 20 74 68 69 73 20 74 72 61 6e 73  en in this trans
102a0 61 63 74 69 6f 6e 2e 20 54 68 69 73 20 68 61 73  action. This has
102b0 20 74 6f 0a 20 20 2a 2a 20 62 65 20 64 6f 6e 65   to.  ** be done
102c0 20 62 65 66 6f 72 65 20 64 65 74 65 72 6d 69 6e   before determin
102d0 69 6e 67 20 77 68 65 74 68 65 72 20 61 20 6d 61  ing whether a ma
102e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
102f0 65 20 69 73 20 0a 20 20 2a 2a 20 72 65 71 75 69  e is .  ** requi
10300 72 65 64 2c 20 61 73 20 61 6e 20 78 53 79 6e 63  red, as an xSync
10310 28 29 20 63 61 6c 6c 62 61 63 6b 20 6d 61 79 20  () callback may 
10320 61 64 64 20 61 6e 20 61 74 74 61 63 68 65 64 20  add an attached 
10330 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 74 6f  database.  ** to
10340 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10350 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
10360 6c 69 74 65 33 56 74 61 62 53 79 6e 63 28 64 62  lite3VtabSync(db
10370 2c 20 70 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  , p);..  /* This
10380 20 6c 6f 6f 70 20 64 65 74 65 72 6d 69 6e 65 73   loop determines
10390 20 28 61 29 20 69 66 20 74 68 65 20 63 6f 6d 6d   (a) if the comm
103a0 69 74 20 68 6f 6f 6b 20 73 68 6f 75 6c 64 20 62  it hook should b
103b0 65 20 69 6e 76 6f 6b 65 64 20 61 6e 64 0a 20 20  e invoked and.  
103c0 2a 2a 20 28 62 29 20 68 6f 77 20 6d 61 6e 79 20  ** (b) how many 
103d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 68  database files h
103e0 61 76 65 20 6f 70 65 6e 20 77 72 69 74 65 20 74  ave open write t
103f0 72 61 6e 73 61 63 74 69 6f 6e 73 2c 20 6e 6f 74  ransactions, not
10400 20 0a 20 20 2a 2a 20 69 6e 63 6c 75 64 69 6e 67   .  ** including
10410 20 74 68 65 20 74 65 6d 70 20 64 61 74 61 62 61   the temp databa
10420 73 65 2e 20 28 62 29 20 69 73 20 69 6d 70 6f 72  se. (b) is impor
10430 74 61 6e 74 20 62 65 63 61 75 73 65 20 69 66 20  tant because if 
10440 6d 6f 72 65 20 74 68 61 6e 20 0a 20 20 2a 2a 20  more than .  ** 
10450 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
10460 65 20 68 61 73 20 61 6e 20 6f 70 65 6e 20 77 72  e has an open wr
10470 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ite transaction,
10480 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
10490 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 72  l.  ** file is r
104a0 65 71 75 69 72 65 64 20 66 6f 72 20 61 6e 20 61  equired for an a
104b0 74 6f 6d 69 63 20 63 6f 6d 6d 69 74 2e 0a 20 20  tomic commit..  
104c0 2a 2f 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 72  */ .  for(i=0; r
104d0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
104e0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
104f0 20 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74   .    Btree *pBt
10500 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
10510 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
10520 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
10530 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 2f  (pBt) ){.      /
10540 2a 20 57 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  * Whether or not
10550 20 61 20 64 61 74 61 62 61 73 65 20 6d 69 67 68   a database migh
10560 74 20 6e 65 65 64 20 61 20 6d 61 73 74 65 72 20  t need a master 
10570 6a 6f 75 72 6e 61 6c 20 64 65 70 65 6e 64 73 20  journal depends 
10580 75 70 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 69 74  upon.      ** it
10590 73 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 28  s journal mode (
105a0 61 6d 6f 6e 67 20 6f 74 68 65 72 20 74 68 69 6e  among other thin
105b0 67 73 29 2e 20 20 54 68 69 73 20 6d 61 74 72 69  gs).  This matri
105c0 78 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 69  x determines whi
105d0 63 68 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72  ch.      ** jour
105e0 6e 61 6c 20 6d 6f 64 65 73 20 75 73 65 20 61 20  nal modes use a 
105f0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
10600 6e 64 20 77 68 69 63 68 20 64 6f 20 6e 6f 74 20  nd which do not 
10610 2a 2f 0a 20 20 20 20 20 20 73 74 61 74 69 63 20  */.      static 
10620 63 6f 6e 73 74 20 75 38 20 61 4d 4a 4e 65 65 64  const u8 aMJNeed
10630 65 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  ed[] = {.       
10640 20 2f 2a 20 44 45 4c 45 54 45 20 20 20 2a 2f 20   /* DELETE   */ 
10650 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 50   1,.        /* P
10660 45 52 53 49 53 54 20 20 20 2a 2f 20 31 2c 0a 20  ERSIST   */ 1,. 
10670 20 20 20 20 20 20 20 2f 2a 20 4f 46 46 20 20 20         /* OFF   
10680 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20      */ 0,.      
10690 20 20 2f 2a 20 54 52 55 4e 43 41 54 45 20 20 2a    /* TRUNCATE  *
106a0 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20  / 1,.        /* 
106b0 4d 45 4d 4f 52 59 20 20 20 20 2a 2f 20 30 2c 0a  MEMORY    */ 0,.
106c0 20 20 20 20 20 20 20 20 2f 2a 20 57 41 4c 20 20          /* WAL  
106d0 20 20 20 20 20 2a 2f 20 30 0a 20 20 20 20 20 20       */ 0.      
106e0 7d 3b 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a  };.      Pager *
106f0 70 50 61 67 65 72 3b 20 20 20 2f 2a 20 50 61 67  pPager;   /* Pag
10700 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
10710 74 68 20 70 42 74 20 2a 2f 0a 20 20 20 20 20 20  th pBt */.      
10720 6e 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 31 3b  needXcommit = 1;
10730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
10740 72 65 65 45 6e 74 65 72 28 70 42 74 29 3b 0a 20  reeEnter(pBt);. 
10750 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
10760 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
10770 70 42 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  pBt);.      if( 
10780 64 62 2d 3e 61 44 62 5b 69 5d 2e 73 61 66 65 74  db->aDb[i].safet
10790 79 5f 6c 65 76 65 6c 21 3d 50 41 47 45 52 5f 53  y_level!=PAGER_S
107a0 59 4e 43 48 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20  YNCHRONOUS_OFF. 
107b0 20 20 20 20 20 20 26 26 20 61 4d 4a 4e 65 65 64        && aMJNeed
107c0 65 64 5b 73 71 6c 69 74 65 33 50 61 67 65 72 47  ed[sqlite3PagerG
107d0 65 74 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 70 50  etJournalMode(pP
107e0 61 67 65 72 29 5d 0a 20 20 20 20 20 20 29 7b 20  ager)].      ){ 
107f0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
10800 20 69 21 3d 31 20 29 3b 0a 20 20 20 20 20 20 20   i!=1 );.       
10810 20 6e 54 72 61 6e 73 2b 2b 3b 0a 20 20 20 20 20   nTrans++;.     
10820 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
10830 6c 69 74 65 33 50 61 67 65 72 45 78 63 6c 75 73  lite3PagerExclus
10840 69 76 65 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  iveLock(pPager);
10850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
10860 72 65 65 4c 65 61 76 65 28 70 42 74 29 3b 0a 20  reeLeave(pBt);. 
10870 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
10880 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
108a0 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72   }..  /* If ther
108b0 65 20 61 72 65 20 61 6e 79 20 77 72 69 74 65 2d  e are any write-
108c0 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 74 20  transactions at 
108d0 61 6c 6c 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20  all, invoke the 
108e0 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20  commit hook */. 
108f0 20 69 66 28 20 6e 65 65 64 58 63 6f 6d 6d 69 74   if( needXcommit
10900 20 26 26 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43   && db->xCommitC
10910 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 72  allback ){.    r
10920 63 20 3d 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43  c = db->xCommitC
10930 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 43 6f 6d  allback(db->pCom
10940 6d 69 74 41 72 67 29 3b 0a 20 20 20 20 69 66 28  mitArg);.    if(
10950 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74   rc ){.      ret
10960 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  urn SQLITE_CONST
10970 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b  RAINT_COMMITHOOK
10980 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10990 2a 20 54 68 65 20 73 69 6d 70 6c 65 20 63 61 73  * The simple cas
109a0 65 20 2d 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e  e - no more than
109b0 20 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69   one database fi
109c0 6c 65 20 28 6e 6f 74 20 63 6f 75 6e 74 69 6e 67  le (not counting
109d0 20 74 68 65 0a 20 20 2a 2a 20 54 45 4d 50 20 64   the.  ** TEMP d
109e0 61 74 61 62 61 73 65 29 20 68 61 73 20 61 20 74  atabase) has a t
109f0 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74 69 76  ransaction activ
10a00 65 2e 20 20 20 54 68 65 72 65 20 69 73 20 6e 6f  e.   There is no
10a10 20 6e 65 65 64 20 66 6f 72 20 74 68 65 0a 20 20   need for the.  
10a20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
10a30 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  l..  **.  ** If 
10a40 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
10a50 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
10a60 47 65 74 46 69 6c 65 6e 61 6d 65 28 29 20 69 73  GetFilename() is
10a70 20 61 20 7a 65 72 6f 20 6c 65 6e 67 74 68 0a 20   a zero length. 
10a80 20 2a 2a 20 73 74 72 69 6e 67 2c 20 69 74 20 6d   ** string, it m
10a90 65 61 6e 73 20 74 68 65 20 6d 61 69 6e 20 64 61  eans the main da
10aa0 74 61 62 61 73 65 20 69 73 20 3a 6d 65 6d 6f 72  tabase is :memor
10ab0 79 3a 20 6f 72 20 61 20 74 65 6d 70 20 66 69 6c  y: or a temp fil
10ac0 65 2e 20 20 49 6e 20 0a 20 20 2a 2a 20 74 68 61  e.  In .  ** tha
10ad0 74 20 63 61 73 65 20 77 65 20 64 6f 20 6e 6f 74  t case we do not
10ae0 20 73 75 70 70 6f 72 74 20 61 74 6f 6d 69 63 20   support atomic 
10af0 6d 75 6c 74 69 2d 66 69 6c 65 20 63 6f 6d 6d 69  multi-file commi
10b00 74 73 2c 20 73 6f 20 75 73 65 20 74 68 65 20 0a  ts, so use the .
10b10 20 20 2a 2a 20 73 69 6d 70 6c 65 20 63 61 73 65    ** simple case
10b20 20 74 68 65 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   then too..  */.
10b30 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
10b40 53 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  Strlen30(sqlite3
10b50 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65  BtreeGetFilename
10b60 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
10b70 29 0a 20 20 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d  ).   || nTrans<=
10b80 31 0a 20 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  1.  ){.    for(i
10b90 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
10ba0 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  K && i<db->nDb; 
10bb0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65  i++){.      Btre
10bc0 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62  e *pBt = db->aDb
10bd0 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69  [i].pBt;.      i
10be0 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20  f( pBt ){.      
10bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10c00 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
10c10 65 28 70 42 74 2c 20 30 29 3b 0a 20 20 20 20 20  e(pBt, 0);.     
10c20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
10c30 20 44 6f 20 74 68 65 20 63 6f 6d 6d 69 74 20 6f   Do the commit o
10c40 6e 6c 79 20 69 66 20 61 6c 6c 20 64 61 74 61 62  nly if all datab
10c50 61 73 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  ases successfull
10c60 79 20 63 6f 6d 70 6c 65 74 65 20 70 68 61 73 65  y complete phase
10c70 20 31 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 6f   1. .    ** If o
10c80 6e 65 20 6f 66 20 74 68 65 20 42 74 72 65 65 43  ne of the BtreeC
10c90 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
10ca0 63 61 6c 6c 73 20 66 61 69 6c 73 2c 20 74 68 69  calls fails, thi
10cb0 73 20 69 6e 64 69 63 61 74 65 73 20 61 6e 0a 20  s indicates an. 
10cc0 20 20 20 2a 2a 20 49 4f 20 65 72 72 6f 72 20 77     ** IO error w
10cd0 68 69 6c 65 20 64 65 6c 65 74 69 6e 67 20 6f 72  hile deleting or
10ce0 20 74 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f   truncating a jo
10cf0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20 69  urnal file. It i
10d00 73 20 75 6e 6c 69 6b 65 6c 79 2c 0a 20 20 20 20  s unlikely,.    
10d10 2a 2a 20 62 75 74 20 63 6f 75 6c 64 20 68 61 70  ** but could hap
10d20 70 65 6e 2e 20 49 6e 20 74 68 69 73 20 63 61 73  pen. In this cas
10d30 65 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  e abandon proces
10d40 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
10d50 74 68 65 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a  the error..    *
10d60 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72  /.    for(i=0; r
10d70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
10d80 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
10d90 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
10da0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
10db0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
10dc0 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  t ){.        rc 
10dd0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  = sqlite3BtreeCo
10de0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74  mmitPhaseTwo(pBt
10df0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
10e00 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
10e10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10e20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43 6f     sqlite3VtabCo
10e30 6d 6d 69 74 28 64 62 29 3b 0a 20 20 20 20 7d 0a  mmit(db);.    }.
10e40 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 63 6f    }..  /* The co
10e50 6d 70 6c 65 78 20 63 61 73 65 20 2d 20 54 68 65  mplex case - The
10e60 72 65 20 69 73 20 61 20 6d 75 6c 74 69 2d 66 69  re is a multi-fi
10e70 6c 65 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63  le write-transac
10e80 74 69 6f 6e 20 61 63 74 69 76 65 2e 0a 20 20 2a  tion active..  *
10e90 2a 20 54 68 69 73 20 72 65 71 75 69 72 65 73 20  * This requires 
10ea0 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
10eb0 20 66 69 6c 65 20 74 6f 20 65 6e 73 75 72 65 20   file to ensure 
10ec0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
10ed0 69 73 0a 20 20 2a 2a 20 63 6f 6d 6d 69 74 74 65  is.  ** committe
10ee0 64 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20  d atomically..  
10ef0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10f00 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
10f10 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
10f20 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 64 62  3_vfs *pVfs = db
10f30 2d 3e 70 56 66 73 3b 0a 20 20 20 20 63 68 61 72  ->pVfs;.    char
10f40 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
10f50 20 2f 2a 20 46 69 6c 65 2d 6e 61 6d 65 20 66 6f   /* File-name fo
10f60 72 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  r the master jou
10f70 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 63 68 61 72  rnal */.    char
10f80 20 63 6f 6e 73 74 20 2a 7a 4d 61 69 6e 46 69 6c   const *zMainFil
10f90 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
10fa0 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e  GetFilename(db->
10fb0 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 20  aDb[0].pBt);.   
10fc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
10fd0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
10fe0 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
10ff0 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20      int res;.   
11000 20 69 6e 74 20 72 65 74 72 79 43 6f 75 6e 74 20   int retryCount 
11010 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4d 61  = 0;.    int nMa
11020 69 6e 46 69 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20  inFile;..    /* 
11030 53 65 6c 65 63 74 20 61 20 6d 61 73 74 65 72 20  Select a master 
11040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
11050 65 20 2a 2f 0a 20 20 20 20 6e 4d 61 69 6e 46 69  e */.    nMainFi
11060 6c 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  le = sqlite3Strl
11070 65 6e 33 30 28 7a 4d 61 69 6e 46 69 6c 65 29 3b  en30(zMainFile);
11080 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 73  .    zMaster = s
11090 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
110a0 2c 20 22 25 73 2d 6d 6a 58 58 58 58 58 58 39 58  , "%s-mjXXXXXX9X
110b0 58 7a 22 2c 20 7a 4d 61 69 6e 46 69 6c 65 29 3b  Xz", zMainFile);
110c0 0a 20 20 20 20 69 66 28 20 7a 4d 61 73 74 65 72  .    if( zMaster
110d0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
110e0 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
110f0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 75      do {.      u
11100 33 32 20 69 52 61 6e 64 6f 6d 3b 0a 20 20 20 20  32 iRandom;.    
11110 20 20 69 66 28 20 72 65 74 72 79 43 6f 75 6e 74    if( retryCount
11120 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
11130 72 65 74 72 79 43 6f 75 6e 74 3e 31 30 30 20 29  retryCount>100 )
11140 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
11150 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46  te3_log(SQLITE_F
11160 55 4c 4c 2c 20 22 4d 4a 20 64 65 6c 65 74 65 3a  ULL, "MJ delete:
11170 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
11180 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11190 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
111a0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
111b0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
111c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
111d0 72 65 74 72 79 43 6f 75 6e 74 3d 3d 31 20 29 7b  retryCount==1 ){
111e0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
111f0 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55  e3_log(SQLITE_FU
11200 4c 4c 2c 20 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a  LL, "MJ collide:
11210 20 25 73 22 2c 20 7a 4d 61 73 74 65 72 29 3b 0a   %s", zMaster);.
11220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11230 7d 0a 20 20 20 20 20 20 72 65 74 72 79 43 6f 75  }.      retryCou
11240 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69  nt++;.      sqli
11250 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
11260 69 7a 65 6f 66 28 69 52 61 6e 64 6f 6d 29 2c 20  izeof(iRandom), 
11270 26 69 52 61 6e 64 6f 6d 29 3b 0a 20 20 20 20 20  &iRandom);.     
11280 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
11290 66 28 31 33 2c 20 26 7a 4d 61 73 74 65 72 5b 6e  f(13, &zMaster[n
112a0 4d 61 69 6e 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25  MainFile], "-mj%
112b0 30 36 58 39 25 30 32 58 22 2c 0a 20 20 20 20 20  06X9%02X",.     
112c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112d0 20 20 20 20 20 20 20 20 20 20 28 69 52 61 6e 64            (iRand
112e0 6f 6d 3e 3e 38 29 26 30 78 66 66 66 66 66 66 2c  om>>8)&0xffffff,
112f0 20 69 52 61 6e 64 6f 6d 26 30 78 66 66 29 3b 0a   iRandom&0xff);.
11300 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61 6e 74        /* The ant
11310 69 70 65 6e 75 6c 74 69 6d 61 74 65 20 63 68 61  ipenultimate cha
11320 72 61 63 74 65 72 20 6f 66 20 74 68 65 20 6d 61  racter of the ma
11330 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
11340 65 20 6d 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e must.      ** 
11350 62 65 20 22 39 22 20 74 6f 20 61 76 6f 69 64 20  be "9" to avoid 
11360 6e 61 6d 65 20 63 6f 6c 6c 69 73 69 6f 6e 73 20  name collisions 
11370 77 68 65 6e 20 75 73 69 6e 67 20 38 2b 33 20 66  when using 8+3 f
11380 69 6c 65 6e 61 6d 65 73 2e 20 2a 2f 0a 20 20 20  ilenames. */.   
11390 20 20 20 61 73 73 65 72 74 28 20 7a 4d 61 73 74     assert( zMast
113a0 65 72 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  er[sqlite3Strlen
113b0 33 30 28 7a 4d 61 73 74 65 72 29 2d 33 5d 3d 3d  30(zMaster)-3]==
113c0 27 39 27 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  '9' );.      sql
113d0 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
113e0 7a 4d 61 69 6e 46 69 6c 65 2c 20 7a 4d 61 73 74  zMainFile, zMast
113f0 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  er);.      rc = 
11400 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
11410 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53  pVfs, zMaster, S
11420 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
11430 53 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 20 20  STS, &res);.    
11440 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49  }while( rc==SQLI
11450 54 45 5f 4f 4b 20 26 26 20 72 65 73 20 29 3b 0a  TE_OK && res );.
11460 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11470 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f  TE_OK ){.      /
11480 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  * Open the maste
11490 72 20 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  r journal. */.  
114a0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
114b0 4f 73 4f 70 65 6e 4d 61 6c 6c 6f 63 28 70 56 66  OsOpenMalloc(pVf
114c0 73 2c 20 7a 4d 61 73 74 65 72 2c 20 26 70 4d 61  s, zMaster, &pMa
114d0 73 74 65 72 2c 20 0a 20 20 20 20 20 20 20 20 20  ster, .         
114e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
114f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
11500 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
11510 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11520 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54  _EXCLUSIVE|SQLIT
11530 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
11540 55 52 4e 41 4c 2c 20 30 0a 20 20 20 20 20 20 29  URNAL, 0.      )
11550 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
11560 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
11580 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11590 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
115a0 72 63 3b 0a 20 20 20 20 7d 0a 20 0a 20 20 20 20  rc;.    }. .    
115b0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d  /* Write the nam
115c0 65 20 6f 66 20 65 61 63 68 20 64 61 74 61 62 61  e of each databa
115d0 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 74  se file in the t
115e0 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 74 6f 20  ransaction into 
115f0 74 68 65 20 6e 65 77 0a 20 20 20 20 2a 2a 20 6d  the new.    ** m
11600 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11610 6c 65 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  le. If an error 
11620 6f 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70  occurs at this p
11630 6f 69 6e 74 20 63 6c 6f 73 65 0a 20 20 20 20 2a  oint close.    *
11640 2a 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  * and delete the
11650 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11660 66 69 6c 65 2e 20 41 6c 6c 20 74 68 65 20 69 6e  file. All the in
11670 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
11680 20 66 69 6c 65 73 0a 20 20 20 20 2a 2a 20 73 74   files.    ** st
11690 69 6c 6c 20 68 61 76 65 20 27 6e 75 6c 6c 27 20  ill have 'null' 
116a0 61 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  as the master jo
116b0 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 2c 20 73  urnal pointer, s
116c0 6f 20 74 68 65 79 20 77 69 6c 6c 20 72 6f 6c 6c  o they will roll
116d0 0a 20 20 20 20 2a 2a 20 62 61 63 6b 20 69 6e 64  .    ** back ind
116e0 65 70 65 6e 64 65 6e 74 6c 79 20 69 66 20 61 20  ependently if a 
116f0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
11700 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11710 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
11720 2b 2b 29 7b 0a 20 20 20 20 20 20 42 74 72 65 65  ++){.      Btree
11730 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
11740 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
11750 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ( sqlite3BtreeIs
11760 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b 0a  InTrans(pBt) ){.
11770 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
11780 73 74 20 2a 7a 46 69 6c 65 20 3d 20 73 71 6c 69  st *zFile = sqli
11790 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
117a0 61 6c 6e 61 6d 65 28 70 42 74 29 3b 0a 20 20 20  alname(pBt);.   
117b0 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 3d 3d       if( zFile==
117c0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  0 ){.          c
117d0 6f 6e 74 69 6e 75 65 3b 20 20 2f 2a 20 49 67 6e  ontinue;  /* Ign
117e0 6f 72 65 20 54 45 4d 50 20 61 6e 64 20 3a 6d 65  ore TEMP and :me
117f0 6d 6f 72 79 3a 20 64 61 74 61 62 61 73 65 73 20  mory: databases 
11800 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  */.        }.   
11810 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69       assert( zFi
11820 6c 65 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 20 20  le[0]!=0 );.    
11830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11840 4f 73 57 72 69 74 65 28 70 4d 61 73 74 65 72 2c  OsWrite(pMaster,
11850 20 7a 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 53   zFile, sqlite3S
11860 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31  trlen30(zFile)+1
11870 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 20  , offset);.     
11880 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 73 71 6c     offset += sql
11890 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
118a0 6c 65 29 2b 31 3b 0a 20 20 20 20 20 20 20 20 69  le)+1;.        i
118b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
118c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
118d0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65  lite3OsCloseFree
118e0 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  (pMaster);.     
118f0 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65       sqlite3OsDe
11900 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
11910 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  er, 0);.        
11920 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11930 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11940 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
11950 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
11960 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11970 2f 2a 20 53 79 6e 63 20 74 68 65 20 6d 61 73 74  /* Sync the mast
11980 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11990 20 49 66 20 74 68 65 20 49 4f 43 41 50 5f 53 45   If the IOCAP_SE
119a0 51 55 45 4e 54 49 41 4c 20 64 65 76 69 63 65 0a  QUENTIAL device.
119b0 20 20 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73      ** flag is s
119c0 65 74 20 74 68 69 73 20 69 73 20 6e 6f 74 20 72  et this is not r
119d0 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  equired..    */.
119e0 20 20 20 20 69 66 28 20 30 3d 3d 28 73 71 6c 69      if( 0==(sqli
119f0 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61  te3OsDeviceChara
11a00 63 74 65 72 69 73 74 69 63 73 28 70 4d 61 73 74  cteristics(pMast
11a10 65 72 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  er)&SQLITE_IOCAP
11a20 5f 53 45 51 55 45 4e 54 49 41 4c 29 0a 20 20 20  _SEQUENTIAL).   
11a30 20 20 26 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d    && SQLITE_OK!=
11a40 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  (rc = sqlite3OsS
11a50 79 6e 63 28 70 4d 61 73 74 65 72 2c 20 53 51 4c  ync(pMaster, SQL
11a60 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29  ITE_SYNC_NORMAL)
11a70 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  ).    ){.      s
11a80 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65  qlite3OsCloseFre
11a90 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
11aa0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
11ab0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11ac0 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
11ad0 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61  e3DbFree(db, zMa
11ae0 73 74 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74  ster);.      ret
11af0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11b00 20 20 20 2f 2a 20 53 79 6e 63 20 61 6c 6c 20 74     /* Sync all t
11b10 68 65 20 64 62 20 66 69 6c 65 73 20 69 6e 76 6f  he db files invo
11b20 6c 76 65 64 20 69 6e 20 74 68 65 20 74 72 61 6e  lved in the tran
11b30 73 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 61 6d  saction. The sam
11b40 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 65  e call.    ** se
11b50 74 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ts the master jo
11b60 75 72 6e 61 6c 20 70 6f 69 6e 74 65 72 20 69 6e  urnal pointer in
11b70 20 65 61 63 68 20 69 6e 64 69 76 69 64 75 61 6c   each individual
11b80 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
11b90 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   ** an error occ
11ba0 75 72 73 20 68 65 72 65 2c 20 64 6f 20 6e 6f 74  urs here, do not
11bb0 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11bc0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11bd0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
11be0 66 20 74 68 65 20 65 72 72 6f 72 20 6f 63 63 75  f the error occu
11bf0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 66 69  rs during the fi
11c00 72 73 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  rst call to.    
11c10 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
11c20 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 2c  ommitPhaseOne(),
11c30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   then there is a
11c40 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
11c50 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a  .    ** master j
11c60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c  ournal file will
11c70 20 62 65 20 6f 72 70 68 61 6e 65 64 2e 20 42 75   be orphaned. Bu
11c80 74 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 6c 65  t we cannot dele
11c90 74 65 20 69 74 2c 0a 20 20 20 20 2a 2a 20 69 6e  te it,.    ** in
11ca0 20 63 61 73 65 20 74 68 65 20 6d 61 73 74 65 72   case the master
11cb0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
11cc0 6d 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 69  me was written i
11cd0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a  nto the journal.
11ce0 20 20 20 20 2a 2a 20 66 69 6c 65 20 62 65 66 6f      ** file befo
11cf0 72 65 20 74 68 65 20 66 61 69 6c 75 72 65 20 6f  re the failure o
11d00 63 63 75 72 72 65 64 2e 0a 20 20 20 20 2a 2f 0a  ccurred..    */.
11d10 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d      for(i=0; rc=
11d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c  =SQLITE_OK && i<
11d30 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a  db->nDb; i++){ .
11d40 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
11d50 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
11d60 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
11d70 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11d80 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
11d90 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c  mitPhaseOne(pBt,
11da0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
11db0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
11dc0 69 74 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28  ite3OsCloseFree(
11dd0 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
11de0 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
11df0 5f 42 55 53 59 20 29 3b 0a 20 20 20 20 69 66 28  _BUSY );.    if(
11e00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11e10 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  {.      sqlite3D
11e20 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65  bFree(db, zMaste
11e30 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
11e40 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11e50 2f 2a 20 44 65 6c 65 74 65 20 74 68 65 20 6d 61  /* Delete the ma
11e60 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11e70 65 2e 20 54 68 69 73 20 63 6f 6d 6d 69 74 73 20  e. This commits 
11e80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
11e90 20 41 66 74 65 72 0a 20 20 20 20 2a 2a 20 64 6f   After.    ** do
11ea0 69 6e 67 20 74 68 69 73 20 74 68 65 20 64 69 72  ing this the dir
11eb0 65 63 74 6f 72 79 20 69 73 20 73 79 6e 63 65 64  ectory is synced
11ec0 20 61 67 61 69 6e 20 62 65 66 6f 72 65 20 61 6e   again before an
11ed0 79 20 69 6e 64 69 76 69 64 75 61 6c 0a 20 20 20  y individual.   
11ee0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
11ef0 66 69 6c 65 73 20 61 72 65 20 64 65 6c 65 74 65  files are delete
11f00 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  d..    */.    rc
11f10 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65   = sqlite3OsDele
11f20 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  te(pVfs, zMaster
11f30 2c 20 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 1);.    sqlite
11f40 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
11f50 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
11f60 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
11f70 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
11f80 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
11f90 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 6e   /* All files an
11fa0 64 20 64 69 72 65 63 74 6f 72 69 65 73 20 68 61  d directories ha
11fb0 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ve already been 
11fc0 73 79 6e 63 65 64 2c 20 73 6f 20 74 68 65 20 66  synced, so the f
11fd0 6f 6c 6c 6f 77 69 6e 67 0a 20 20 20 20 2a 2a 20  ollowing.    ** 
11fe0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
11ff0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12000 54 77 6f 28 29 20 61 72 65 20 6f 6e 6c 79 20 63  Two() are only c
12010 6c 6f 73 69 6e 67 20 66 69 6c 65 73 20 61 6e 64  losing files and
12020 0a 20 20 20 20 2a 2a 20 64 65 6c 65 74 69 6e 67  .    ** deleting
12030 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 6a   or truncating j
12040 6f 75 72 6e 61 6c 73 2e 20 49 66 20 73 6f 6d 65  ournals. If some
12050 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
12060 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
12070 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
12080 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79 20  we don't really 
12090 63 61 72 65 2e 20 54 68 65 20 69 6e 74 65 67 72  care. The integr
120a0 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  ity of the.    *
120b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  * transaction is
120c0 20 61 6c 72 65 61 64 79 20 67 75 61 72 61 6e 74   already guarant
120d0 65 65 64 2c 20 62 75 74 20 73 6f 6d 65 20 73 74  eed, but some st
120e0 72 61 79 20 27 63 6f 6c 64 27 20 6a 6f 75 72 6e  ray 'cold' journ
120f0 61 6c 73 0a 20 20 20 20 2a 2a 20 6d 61 79 20 62  als.    ** may b
12100 65 20 6c 79 69 6e 67 20 61 72 6f 75 6e 64 2e 20  e lying around. 
12110 52 65 74 75 72 6e 69 6e 67 20 61 6e 20 65 72 72  Returning an err
12120 6f 72 20 63 6f 64 65 20 77 6f 6e 27 74 20 68 65  or code won't he
12130 6c 70 20 6d 61 74 74 65 72 73 2e 0a 20 20 20 20  lp matters..    
12140 2a 2f 0a 20 20 20 20 64 69 73 61 62 6c 65 5f 73  */.    disable_s
12150 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
12160 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  rs();.    sqlite
12170 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
12180 6f 63 28 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oc();.    for(i=
12190 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
121a0 2b 29 7b 20 0a 20 20 20 20 20 20 42 74 72 65 65  +){ .      Btree
121b0 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b   *pBt = db->aDb[
121c0 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66  i].pBt;.      if
121d0 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  ( pBt ){.       
121e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
121f0 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2c  mitPhaseTwo(pBt,
12200 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
12210 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e   }.    sqlite3En
12220 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
12230 0a 20 20 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75  .    enable_simu
12240 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
12250 29 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 56  );..    sqlite3V
12260 74 61 62 43 6f 6d 6d 69 74 28 64 62 29 3b 0a 20  tabCommit(db);. 
12270 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
12280 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a  urn rc;.}../* .*
12290 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
122a0 68 65 63 6b 73 20 74 68 61 74 20 74 68 65 20 73  hecks that the s
122b0 71 6c 69 74 65 33 2e 6e 56 64 62 65 41 63 74 69  qlite3.nVdbeActi
122c0 76 65 20 63 6f 75 6e 74 20 76 61 72 69 61 62 6c  ve count variabl
122d0 65 0a 2a 2a 20 6d 61 74 63 68 65 73 20 74 68 65  e.** matches the
122e0 20 6e 75 6d 62 65 72 20 6f 66 20 76 64 62 65 27   number of vdbe'
122f0 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 73 71  s in the list sq
12300 6c 69 74 65 33 2e 70 56 64 62 65 20 74 68 61 74  lite3.pVdbe that
12310 20 61 72 65 0a 2a 2a 20 63 75 72 72 65 6e 74 6c   are.** currentl
12320 79 20 61 63 74 69 76 65 2e 20 41 6e 20 61 73 73  y active. An ass
12330 65 72 74 69 6f 6e 20 66 61 69 6c 73 20 69 66 20  ertion fails if 
12340 74 68 65 20 74 77 6f 20 63 6f 75 6e 74 73 20 64  the two counts d
12350 6f 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 20  o not match..** 
12360 54 68 69 73 20 69 73 20 61 6e 20 69 6e 74 65 72  This is an inter
12370 6e 61 6c 20 73 65 6c 66 2d 63 68 65 63 6b 20 6f  nal self-check o
12380 6e 6c 79 20 2d 20 69 74 20 69 73 20 6e 6f 74 20  nly - it is not 
12390 61 6e 20 65 73 73 65 6e 74 69 61 6c 20 70 72 6f  an essential pro
123a0 63 65 73 73 69 6e 67 0a 2a 2a 20 73 74 65 70 2e  cessing.** step.
123b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
123c0 20 6e 6f 2d 6f 70 20 69 66 20 4e 44 45 42 55 47   no-op if NDEBUG
123d0 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
123e0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73  #ifndef NDEBUG.s
123f0 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b  tatic void check
12400 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 73 71  ActiveVdbeCnt(sq
12410 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64  lite3 *db){.  Vd
12420 62 65 20 2a 70 3b 0a 20 20 69 6e 74 20 63 6e 74  be *p;.  int cnt
12430 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 57 72 69   = 0;.  int nWri
12440 74 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52  te = 0;.  int nR
12450 65 61 64 20 3d 20 30 3b 0a 20 20 70 20 3d 20 64  ead = 0;.  p = d
12460 62 2d 3e 70 56 64 62 65 3b 0a 20 20 77 68 69 6c  b->pVdbe;.  whil
12470 65 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20  e( p ){.    if( 
12480 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
12490 79 28 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  y((sqlite3_stmt*
124a0 29 70 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74  )p) ){.      cnt
124b0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ++;.      if( p-
124c0 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e  >readOnly==0 ) n
124d0 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 20 20 69  Write++;.      i
124e0 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20  f( p->bIsReader 
124f0 29 20 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 7d  ) nRead++;.    }
12500 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78  .    p = p->pNex
12510 74 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  t;.  }.  assert(
12520 20 63 6e 74 3d 3d 64 62 2d 3e 6e 56 64 62 65 41   cnt==db->nVdbeA
12530 63 74 69 76 65 20 29 3b 0a 20 20 61 73 73 65 72  ctive );.  asser
12540 74 28 20 6e 57 72 69 74 65 3d 3d 64 62 2d 3e 6e  t( nWrite==db->n
12550 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20 20 61  VdbeWrite );.  a
12560 73 73 65 72 74 28 20 6e 52 65 61 64 3d 3d 64 62  ssert( nRead==db
12570 2d 3e 6e 56 64 62 65 52 65 61 64 20 29 3b 0a 7d  ->nVdbeRead );.}
12580 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63  .#else.#define c
12590 68 65 63 6b 41 63 74 69 76 65 56 64 62 65 43 6e  heckActiveVdbeCn
125a0 74 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  t(x).#endif../*.
125b0 2a 2a 20 49 66 20 74 68 65 20 56 64 62 65 20 70  ** If the Vdbe p
125c0 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
125d0 73 74 20 61 72 67 75 6d 65 6e 74 20 6f 70 65 6e  st argument open
125e0 65 64 20 61 20 73 74 61 74 65 6d 65 6e 74 2d 74  ed a statement-t
125f0 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63  ransaction,.** c
12600 6c 6f 73 65 20 69 74 20 6e 6f 77 2e 20 41 72 67  lose it now. Arg
12610 75 6d 65 6e 74 20 65 4f 70 20 6d 75 73 74 20 62  ument eOp must b
12620 65 20 65 69 74 68 65 72 20 53 41 56 45 50 4f 49  e either SAVEPOI
12630 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a  NT_ROLLBACK or.*
12640 2a 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  * SAVEPOINT_RELE
12650 41 53 45 2e 20 49 66 20 69 74 20 69 73 20 53 41  ASE. If it is SA
12660 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12670 2c 20 74 68 65 6e 20 74 68 65 20 73 74 61 74 65  , then the state
12680 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
12690 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
126a0 63 6b 2e 20 49 66 20 65 4f 70 20 69 73 20 53 41  ck. If eOp is SA
126b0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
126c0 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 73 74   then the .** st
126d0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
126e0 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
126f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  ..**.** If an IO
12700 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
12710 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58  n SQLITE_IOERR_X
12720 58 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  XX error code is
12730 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f   returned. .** O
12740 74 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f  therwise SQLITE_
12750 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
12760 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61 74 65  e3VdbeCloseState
12770 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 69 6e  ment(Vdbe *p, in
12780 74 20 65 4f 70 29 7b 0a 20 20 73 71 6c 69 74 65  t eOp){.  sqlite
12790 33 20 2a 63 6f 6e 73 74 20 64 62 20 3d 20 70 2d  3 *const db = p-
127a0 3e 64 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  >db;.  int rc = 
127b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
127c0 20 49 66 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e   If p->iStatemen
127d0 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  t is greater tha
127e0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n zero, then thi
127f0 73 20 56 64 62 65 20 6f 70 65 6e 65 64 20 61 20  s Vdbe opened a 
12800 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  .  ** statement 
12810 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68 61 74  transaction that
12820 20 73 68 6f 75 6c 64 20 62 65 20 63 6c 6f 73 65   should be close
12830 64 20 68 65 72 65 2e 20 54 68 65 20 6f 6e 6c 79  d here. The only
12840 20 65 78 63 65 70 74 69 6f 6e 0a 20 20 2a 2a 20   exception.  ** 
12850 69 73 20 74 68 61 74 20 61 6e 20 49 4f 20 65 72  is that an IO er
12860 72 6f 72 20 6d 61 79 20 68 61 76 65 20 6f 63 63  ror may have occ
12870 75 72 72 65 64 2c 20 63 61 75 73 69 6e 67 20 61  urred, causing a
12880 6e 20 65 6d 65 72 67 65 6e 63 79 20 72 6f 6c 6c  n emergency roll
12890 62 61 63 6b 2e 0a 20 20 2a 2a 20 49 6e 20 74 68  back..  ** In th
128a0 69 73 20 63 61 73 65 20 28 64 62 2d 3e 6e 53 74  is case (db->nSt
128b0 61 74 65 6d 65 6e 74 3d 3d 30 29 2c 20 61 6e 64  atement==0), and
128c0 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
128d0 67 20 74 6f 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20  g to do..  */.  
128e0 69 66 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  if( db->nStateme
128f0 6e 74 20 26 26 20 70 2d 3e 69 53 74 61 74 65 6d  nt && p->iStatem
12900 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ent ){.    int i
12910 3b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  ;.    const int 
12920 69 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 2d 3e  iSavepoint = p->
12930 69 53 74 61 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20  iStatement-1;.. 
12940 20 20 20 61 73 73 65 72 74 28 20 65 4f 70 3d 3d     assert( eOp==
12950 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12960 43 4b 20 7c 7c 20 65 4f 70 3d 3d 53 41 56 45 50  CK || eOp==SAVEP
12970 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 3b 0a 20  OINT_RELEASE);. 
12980 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
12990 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b 0a 20  Statement>0 );. 
129a0 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 53     assert( p->iS
129b0 74 61 74 65 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e  tatement==(db->n
129c0 53 74 61 74 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53  Statement+db->nS
129d0 61 76 65 70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20  avepoint) );..  
129e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
129f0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
12a00 20 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c     int rc2 = SQL
12a10 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 42 74  ITE_OK;.      Bt
12a20 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
12a30 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
12a40 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
12a50 20 20 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56      if( eOp==SAV
12a60 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20  EPOINT_ROLLBACK 
12a70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
12a80 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
12a90 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
12aa0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
12ab0 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , iSavepoint);. 
12ac0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12ad0 20 69 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45   if( rc2==SQLITE
12ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
12af0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 42 74   rc2 = sqlite3Bt
12b00 72 65 65 53 61 76 65 70 6f 69 6e 74 28 70 42 74  reeSavepoint(pBt
12b10 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  , SAVEPOINT_RELE
12b20 41 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29  ASE, iSavepoint)
12b30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12b40 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
12b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12b60 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
12b70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12b80 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6e 53 74     }.    db->nSt
12b90 61 74 65 6d 65 6e 74 2d 2d 3b 0a 20 20 20 20 70  atement--;.    p
12ba0 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->iStatement = 0
12bb0 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ;..    if( rc==S
12bc0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12bd0 20 20 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50    if( eOp==SAVEP
12be0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b  OINT_ROLLBACK ){
12bf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12c00 6c 69 74 65 33 56 74 61 62 53 61 76 65 70 6f 69  lite3VtabSavepoi
12c10 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49 4e 54  nt(db, SAVEPOINT
12c20 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65  _ROLLBACK, iSave
12c30 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  point);.      }.
12c40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
12c50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56     rc = sqlite3V
12c70 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c  tabSavepoint(db,
12c80 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
12c90 53 45 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  SE, iSavepoint);
12ca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12cb0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
12cc0 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12cd0 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  ion is being rol
12ce0 6c 65 64 20 62 61 63 6b 2c 20 61 6c 73 6f 20 72  led back, also r
12cf0 65 73 74 6f 72 65 20 74 68 65 20 0a 20 20 20 20  estore the .    
12d00 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
12d10 6c 65 73 20 64 65 66 65 72 72 65 64 20 63 6f 6e  les deferred con
12d20 73 74 72 61 69 6e 74 20 63 6f 75 6e 74 65 72 20  straint counter 
12d30 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 74 20  to the value it 
12d40 68 61 64 20 77 68 65 6e 20 0a 20 20 20 20 2a 2a  had when .    **
12d50 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
12d60 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6f  ransaction was o
12d70 70 65 6e 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  pened.  */.    i
12d80 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  f( eOp==SAVEPOIN
12d90 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20  T_ROLLBACK ){.  
12da0 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65      db->nDeferre
12db0 64 43 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74  dCons = p->nStmt
12dc0 44 65 66 43 6f 6e 73 3b 0a 20 20 20 20 20 20 64  DefCons;.      d
12dd0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
12de0 6f 6e 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65  ons = p->nStmtDe
12df0 66 49 6d 6d 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a  fImmCons;.    }.
12e00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
12e10 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
12e20 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
12e30 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  d when a transac
12e40 74 69 6f 6e 20 6f 70 65 6e 65 64 20 62 79 20 74  tion opened by t
12e50 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20  he database .** 
12e60 68 61 6e 64 6c 65 20 61 73 73 6f 63 69 61 74 65  handle associate
12e70 64 20 77 69 74 68 20 74 68 65 20 56 4d 20 70 61  d with the VM pa
12e80 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
12e90 65 6e 74 20 69 73 20 61 62 6f 75 74 20 74 6f 20  ent is about to 
12ea0 62 65 20 0a 2a 2a 20 63 6f 6d 6d 69 74 74 65 64  be .** committed
12eb0 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  . If there are o
12ec0 75 74 73 74 61 6e 64 69 6e 67 20 64 65 66 65 72  utstanding defer
12ed0 72 65 64 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  red foreign key 
12ee0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 76 69  constraint.** vi
12ef0 6f 6c 61 74 69 6f 6e 73 2c 20 72 65 74 75 72 6e  olations, return
12f00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 20 4f   SQLITE_ERROR. O
12f10 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
12f20 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  _OK..**.** If th
12f30 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
12f40 69 6e 67 20 46 4b 20 76 69 6f 6c 61 74 69 6f 6e  ing FK violation
12f50 73 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  s and this funct
12f60 69 6f 6e 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ion returns .** 
12f70 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 73 65  SQLITE_ERROR, se
12f80 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  t the result of 
12f90 74 68 65 20 56 4d 20 74 6f 20 53 51 4c 49 54 45  the VM to SQLITE
12fa0 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45  _CONSTRAINT_FORE
12fb0 49 47 4e 4b 45 59 0a 2a 2a 20 61 6e 64 20 77 72  IGNKEY.** and wr
12fc0 69 74 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ite an error mes
12fd0 73 61 67 65 20 74 6f 20 69 74 2e 20 54 68 65 6e  sage to it. Then
12fe0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
12ff0 52 52 4f 52 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  RROR..*/.#ifndef
13000 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4f 52   SQLITE_OMIT_FOR
13010 45 49 47 4e 5f 4b 45 59 0a 69 6e 74 20 73 71 6c  EIGN_KEY.int sql
13020 69 74 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28  ite3VdbeCheckFk(
13030 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 64 65 66  Vdbe *p, int def
13040 65 72 72 65 64 29 7b 0a 20 20 73 71 6c 69 74 65  erred){.  sqlite
13050 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
13060 20 69 66 28 20 28 64 65 66 65 72 72 65 64 20 26   if( (deferred &
13070 26 20 28 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  & (db->nDeferred
13080 43 6f 6e 73 2b 64 62 2d 3e 6e 44 65 66 65 72 72  Cons+db->nDeferr
13090 65 64 49 6d 6d 43 6f 6e 73 29 3e 30 29 20 0a 20  edImmCons)>0) . 
130a0 20 20 7c 7c 20 28 21 64 65 66 65 72 72 65 64 20    || (!deferred 
130b0 26 26 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  && p->nFkConstra
130c0 69 6e 74 3e 30 29 20 0a 20 20 29 7b 0a 20 20 20  int>0) .  ){.   
130d0 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f   p->rc = SQLITE_
130e0 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49  CONSTRAINT_FOREI
130f0 47 4e 4b 45 59 3b 0a 20 20 20 20 70 2d 3e 65 72  GNKEY;.    p->er
13100 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45 5f 41  rorAction = OE_A
13110 62 6f 72 74 3b 0a 20 20 20 20 73 71 6c 69 74 65  bort;.    sqlite
13120 33 56 64 62 65 45 72 72 6f 72 28 70 2c 20 22 46  3VdbeError(p, "F
13130 4f 52 45 49 47 4e 20 4b 45 59 20 63 6f 6e 73 74  OREIGN KEY const
13140 72 61 69 6e 74 20 66 61 69 6c 65 64 22 29 3b 0a  raint failed");.
13150 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13160 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  E_ERROR;.  }.  r
13170 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
13180 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
13190 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
131a0 20 63 61 6c 6c 65 64 20 74 68 65 20 77 68 65 6e   called the when
131b0 20 61 20 56 44 42 45 20 74 72 69 65 73 20 74 6f   a VDBE tries to
131c0 20 68 61 6c 74 2e 20 20 49 66 20 74 68 65 20 56   halt.  If the V
131d0 44 42 45 0a 2a 2a 20 68 61 73 20 6d 61 64 65 20  DBE.** has made 
131e0 63 68 61 6e 67 65 73 20 61 6e 64 20 69 73 20 69  changes and is i
131f0 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64  n autocommit mod
13200 65 2c 20 74 68 65 6e 20 63 6f 6d 6d 69 74 20 74  e, then commit t
13210 68 6f 73 65 0a 2a 2a 20 63 68 61 6e 67 65 73 2e  hose.** changes.
13220 20 20 49 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20    If a rollback 
13230 69 73 20 6e 65 65 64 65 64 2c 20 74 68 65 6e 20  is needed, then 
13240 64 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e  do the rollback.
13250 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
13260 69 6e 65 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  ine is the only 
13270 77 61 79 20 74 6f 20 6d 6f 76 65 20 74 68 65 20  way to move the 
13280 73 74 61 74 65 20 6f 66 20 61 20 56 4d 20 66 72  state of a VM fr
13290 6f 6d 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 41 47  om.** SQLITE_MAG
132a0 49 43 5f 52 55 4e 20 74 6f 20 53 51 4c 49 54 45  IC_RUN to SQLITE
132b0 5f 4d 41 47 49 43 5f 48 41 4c 54 2e 20 20 49 74  _MAGIC_HALT.  It
132c0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 74 6f 0a   is harmless to.
132d0 2a 2a 20 63 61 6c 6c 20 74 68 69 73 20 6f 6e 20  ** call this on 
132e0 61 20 56 4d 20 74 68 61 74 20 69 73 20 69 6e 20  a VM that is in 
132f0 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  the SQLITE_MAGIC
13300 5f 48 41 4c 54 20 73 74 61 74 65 2e 0a 2a 2a 0a  _HALT state..**.
13310 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  ** Return an err
13320 6f 72 20 63 6f 64 65 2e 20 20 49 66 20 74 68 65  or code.  If the
13330 20 63 6f 6d 6d 69 74 20 63 6f 75 6c 64 20 6e 6f   commit could no
13340 74 20 63 6f 6d 70 6c 65 74 65 20 62 65 63 61 75  t complete becau
13350 73 65 20 6f 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  se of.** lock co
13360 6e 74 65 6e 74 69 6f 6e 2c 20 72 65 74 75 72 6e  ntention, return
13370 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 49   SQLITE_BUSY.  I
13380 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  f SQLITE_BUSY is
13390 20 72 65 74 75 72 6e 65 64 2c 20 69 74 0a 2a 2a   returned, it.**
133a0 20 6d 65 61 6e 73 20 74 68 65 20 63 6c 6f 73 65   means the close
133b0 20 64 69 64 20 6e 6f 74 20 68 61 70 70 65 6e 20   did not happen 
133c0 61 6e 64 20 6e 65 65 64 73 20 74 6f 20 62 65 20  and needs to be 
133d0 72 65 70 65 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74  repeated..*/.int
133e0 20 73 71 6c 69 74 65 33 56 64 62 65 48 61 6c 74   sqlite3VdbeHalt
133f0 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74  (Vdbe *p){.  int
13400 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
13410 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13420 55 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 72  Used to store tr
13430 61 6e 73 69 65 6e 74 20 72 65 74 75 72 6e 20 63  ansient return c
13440 6f 64 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  odes */.  sqlite
13450 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
13460 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69    /* This functi
13470 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  on contains the 
13480 6c 6f 67 69 63 20 74 68 61 74 20 64 65 74 65 72  logic that deter
13490 6d 69 6e 65 73 20 69 66 20 61 20 73 74 61 74 65  mines if a state
134a0 6d 65 6e 74 20 6f 72 0a 20 20 2a 2a 20 74 72 61  ment or.  ** tra
134b0 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65  nsaction will be
134c0 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f   committed or ro
134d0 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
134e0 65 73 75 6c 74 20 6f 66 20 74 68 65 0a 20 20 2a  esult of the.  *
134f0 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
13500 68 69 73 20 76 69 72 74 75 61 6c 20 6d 61 63 68  his virtual mach
13510 69 6e 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ine. .  **.  ** 
13520 49 66 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  If any of the fo
13530 6c 6c 6f 77 69 6e 67 20 65 72 72 6f 72 73 20 6f  llowing errors o
13540 63 63 75 72 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ccur:.  **.  ** 
13550 20 20 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d      SQLITE_NOMEM
13560 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  .  **     SQLITE
13570 5f 49 4f 45 52 52 0a 20 20 2a 2a 20 20 20 20 20  _IOERR.  **     
13580 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a  SQLITE_FULL.  **
13590 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4e 54 45       SQLITE_INTE
135a0 52 52 55 50 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20  RRUPT.  **.  ** 
135b0 54 68 65 6e 20 74 68 65 20 69 6e 74 65 72 6e 61  Then the interna
135c0 6c 20 63 61 63 68 65 20 6d 69 67 68 74 20 68 61  l cache might ha
135d0 76 65 20 62 65 65 6e 20 6c 65 66 74 20 69 6e 20  ve been left in 
135e0 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 0a  an inconsistent.
135f0 20 20 2a 2a 20 73 74 61 74 65 2e 20 20 57 65 20    ** state.  We 
13600 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  need to rollback
13610 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
13620 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 66 20 74  ransaction, if t
13630 68 65 72 65 20 69 73 0a 20 20 2a 2a 20 6f 6e 65  here is.  ** one
13640 2c 20 6f 72 20 74 68 65 20 63 6f 6d 70 6c 65 74  , or the complet
13650 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  e transaction if
13660 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 74 61   there is no sta
13670 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13680 6f 6e 2e 0a 20 20 2a 2f 0a 0a 20 20 69 66 28 20  on..  */..  if( 
13690 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
136a0 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20   ){.    p->rc = 
136b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
136c0 54 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41 6c  T;.  }.  closeAl
136d0 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20 69  lCursors(p);.  i
136e0 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44 42  f( p->magic!=VDB
136f0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a 20  E_MAGIC_RUN ){. 
13700 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
13710 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63 6b  _OK;.  }.  check
13720 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64 62  ActiveVdbeCnt(db
13730 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d 6d  );..  /* No comm
13740 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e  it or rollback n
13750 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72 6f  eeded if the pro
13760 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72 74  gram never start
13770 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20 2a  ed or if the.  *
13780 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  * SQL statement 
13790 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f 72  does not read or
137a0 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61 73   write a databas
137b0 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69 66  e file.  */.  if
137c0 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70 2d  ( p->pc>=0 && p-
137d0 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20 20  >bIsReader ){.  
137e0 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a 20    int mrc;   /* 
137f0 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63 6f  Primary error co
13800 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a 2f  de from p->rc */
13810 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 6d  .    int eStatem
13820 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20 69  entOp = 0;.    i
13830 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f  nt isSpecialErro
13840 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
13850 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66 20   Set to true if 
13860 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72 6f  a 'special' erro
13870 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f 63  r */..    /* Loc
13880 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73 65  k all btrees use
13890 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d 65  d by the stateme
138a0 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  nt */.    sqlite
138b0 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a 0a  3VdbeEnter(p);..
138c0 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
138d0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
138e0 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20  ial errors */.  
138f0 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26 20    mrc = p->rc & 
13900 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65 63  0xff;.    isSpec
13910 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d 3d  ialError = mrc==
13920 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c 20  SQLITE_NOMEM || 
13930 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  mrc==SQLITE_IOER
13940 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R.              
13950 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d 53         || mrc==S
13960 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20  QLITE_INTERRUPT 
13970 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46  || mrc==SQLITE_F
13980 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73 53  ULL;.    if( isS
13990 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a 20  pecialError ){. 
139a0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 71       /* If the q
139b0 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f 6e  uery was read-on
139c0 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  ly and the error
139d0 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45 5f   code is SQLITE_
139e0 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20 20  INTERRUPT, .    
139f0 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b    ** no rollback
13a00 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20 4f   is necessary. O
13a10 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65 61  therwise, at lea
13a20 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20 0a  st a savepoint .
13a30 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
13a40 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f 6c  tion must be rol
13a50 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73 74  led back to rest
13a60 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ore the database
13a70 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a 20   to a .      ** 
13a80 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74 65  consistent state
13a90 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
13aa0 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65 20   ** Even if the 
13ab0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 61  statement is rea
13ac0 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69 6d  d-only, it is im
13ad0 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66 6f  portant to perfo
13ae0 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73 74  rm.      ** a st
13af0 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e 73  atement or trans
13b00 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b 20  action rollback 
13b10 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74 68  operation. If th
13b20 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20 2a  e error .      *
13b30 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65  * occurred while
13b40 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
13b50 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f 75  journal, sub-jou
13b60 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73 65  rnal or database
13b70 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 61  .      ** file a
13b80 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66 66  s part of an eff
13b90 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20 63  ort to free up c
13ba0 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65 20  ache space (see 
13bb0 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a  function.      *
13bc0 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29 20  * pagerStress() 
13bd0 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68 65  in pager.c), the
13be0 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65 71   rollback is req
13bf0 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72 65  uired to restore
13c00 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 70   .      ** the p
13c10 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69 73  ager to a consis
13c20 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20  tent state..    
13c30 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21    */.      if( !
13c40 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20 6d  p->readOnly || m
13c50 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45 52  rc!=SQLITE_INTER
13c60 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20 20  RUPT ){.        
13c70 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54 45  if( (mrc==SQLITE
13c80 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53  _NOMEM || mrc==S
13c90 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20 70  QLITE_FULL) && p
13ca0 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
13cb0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65  l ){.          e
13cc0 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41  StatementOp = SA
13cd0 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
13ce0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13cf0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
13d00 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20 72   are forced to r
13d10 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63 74  oll back the act
13d20 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
13d30 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20 20   Before doing.  
13d40 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 61          ** so, a
13d50 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20 73  bort any other s
13d60 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20 68  tatements this h
13d70 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79 20  andle currently 
13d80 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20 20  has active..    
13d90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13da0 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61     sqlite3Rollba
13db0 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45  ckAll(db, SQLITE
13dc0 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29  _ABORT_ROLLBACK)
13dd0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13de0 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
13df0 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20  ts(db);.        
13e00 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
13e10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
13e20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
13e30 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13e40 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
13e50 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64 69  Check for immedi
13e60 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ate foreign key 
13e70 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a 20  violations. */. 
13e80 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51     if( p->rc==SQ
13e90 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13ea0 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65 63   sqlite3VdbeChec
13eb0 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  kFk(p, 0);.    }
13ec0 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  .  .    /* If th
13ed0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
13ee0 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
13ef0 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61  is is the only a
13f00 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20 20  ctive writer .  
13f10 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77 65    ** VM, then we
13f20 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f 6d   do either a com
13f30 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
13f40 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  of the current t
13f50 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20 20  ransaction. .   
13f60 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 3a   **.    ** Note:
13f70 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73 6f   This block also
13f80 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66 20   runs if one of 
13f90 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
13fa0 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20 20  rs handled .    
13fb0 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63 63  ** above has occ
13fc0 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a 20  urred. .    */. 
13fd0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 56     if( !sqlite3V
13fe0 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a 20  tabInSync(db) . 
13ff0 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f 43      && db->autoC
14000 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20 64  ommit .     && d
14010 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d 28  b->nVdbeWrite==(
14020 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29 20  p->readOnly==0) 
14030 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 66  .    ){.      if
14040 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f  ( p->rc==SQLITE_
14050 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72 41  OK || (p->errorA
14060 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20 26  ction==OE_Fail &
14070 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72 6f  & !isSpecialErro
14080 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
14090 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 68   = sqlite3VdbeCh
140a0 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20 20  eckFk(p, 1);.   
140b0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
140c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
140d0 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d      if( NEVER(p-
140e0 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20 20  >readOnly) ){.  
140f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14100 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14110 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
14120 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
14130 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
14140 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14150 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
14160 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20 20  EIGNKEY;.       
14170 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20 20   }else{ .       
14180 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d 63     /* The auto-c
14190 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74 72  ommit flag is tr
141a0 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72 6f  ue, the vdbe pro
141b0 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73 73  gram was success
141c0 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20 2a  ful .          *
141d0 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52 20  * or hit an 'OR 
141e0 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e 74  FAIL' constraint
141f0 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 6e   and there are n
14200 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65 69  o deferred forei
14210 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  gn.          ** 
14220 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
14230 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20 74  to hold up the t
14240 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69 73  ransaction. This
14250 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74 20   means a commit 
14260 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73  .          ** is
14270 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20   required. */.  
14280 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64 62          rc = vdb
14290 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b 0a  eCommit(db, p);.
142a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
142b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
142c0 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61 64  _BUSY && p->read
142d0 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Only ){.        
142e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
142f0 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
14300 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
14310 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  USY;.        }el
14320 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
14330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
14340 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20    p->rc = rc;.  
14350 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
14360 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
14370 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20  QLITE_OK);.     
14380 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20       p->nChange 
14390 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 0;.        }el
143a0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64 62  se{.          db
143b0 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20  ->nDeferredCons 
143c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64  = 0;.          d
143d0 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43  b->nDeferredImmC
143e0 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ons = 0;.       
143f0 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20     db->flags &= 
14400 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73  ~SQLITE_DeferFKs
14410 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
14420 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e 61  te3CommitInterna
14430 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20 20  lChanges(db);.  
14440 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
14450 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
14460 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
14470 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
14480 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
14490 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ge = 0;.      }.
144a0 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65        db->nState
144b0 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ment = 0;.    }e
144c0 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d 65  lse if( eStateme
144d0 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ntOp==0 ){.     
144e0 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
144f0 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72 6f  TE_OK || p->erro
14500 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c  rAction==OE_Fail
14510 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61   ){.        eSta
14520 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50  tementOp = SAVEP
14530 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20 20  OINT_RELEASE;.  
14540 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d      }else if( p-
14550 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45  >errorAction==OE
14560 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20  _Abort ){.      
14570 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d    eStatementOp =
14580 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
14590 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ACK;.      }else
145a0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
145b0 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c  3RollbackAll(db,
145c0 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
145d0 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20 20  LLBACK);.       
145e0 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
145f0 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20 20  epoints(db);.   
14600 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d       db->autoCom
14610 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  mit = 1;.       
14620 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14640 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74 61   .    /* If eSta
14650 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e 2d  tementOp is non-
14660 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74 61  zero, then a sta
14670 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14680 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20  on needs to.    
14690 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 20  ** be committed 
146a0 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  or rolled back. 
146b0 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62 65  Call sqlite3Vdbe
146c0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 29  CloseStatement()
146d0 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f   to.    ** do so
146e0 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61 74  . If this operat
146f0 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20 65  ion returns an e
14700 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63 75  rror, and the cu
14710 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 0a  rrent statement.
14720 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f 64      ** error cod
14730 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  e is SQLITE_OK o
14740 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  r SQLITE_CONSTRA
14750 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f 74  INT, then promot
14760 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75 72  e the.    ** cur
14770 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 65  rent statement e
14780 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20 2a  rror code..    *
14790 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74 65  /.    if( eState
147a0 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20 20  mentOp ){.      
147b0 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
147c0 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 70  CloseStatement(p
147d0 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29 3b  , eStatementOp);
147e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
147f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
14800 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14810 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d 53   (p->rc&0xff)==S
14820 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
14830 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 2d   ){.          p-
14840 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  >rc = rc;.      
14850 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
14860 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
14870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
14880 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
14890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
148a0 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
148b0 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42 4f  l(db, SQLITE_ABO
148c0 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  RT_ROLLBACK);.  
148d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f        sqlite3Clo
148e0 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
148f0 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75  ;.        db->au
14900 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
14910 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14920 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14930 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
14940 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e 53   this was an INS
14950 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44  ERT, UPDATE or D
14960 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74 61  ELETE and no sta
14970 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
14980 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65  on.    ** has be
14990 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20  en rolled back, 
149a0 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61 62  update the datab
149b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63  ase connection c
149c0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 0a  hange-counter. .
149d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
149e0 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29 7b  ->changeCntOn ){
149f0 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61 74  .      if( eStat
14a00 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f 49  ementOp!=SAVEPOI
14a10 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
14a20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
14a30 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62 2c  beSetChanges(db,
14a40 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20 20   p->nChange);.  
14a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14a60 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65     sqlite3VdbeSe
14a70 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29 3b  tChanges(db, 0);
14a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
14a90 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20  ->nChange = 0;. 
14aa0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
14ab0 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20 2a  ease the locks *
14ac0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  /.    sqlite3Vdb
14ad0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 0a  eLeave(p);.  }..
14ae0 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75 63    /* We have suc
14af0 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65 64  cessfully halted
14b00 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65 20   and closed the 
14b10 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69 73  VM.  Record this
14b20 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28 20   fact. */.  if( 
14b30 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20 20  p->pc>=0 ){.    
14b40 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 2d  db->nVdbeActive-
14b50 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e 72  -;.    if( !p->r
14b60 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e 56  eadOnly ) db->nV
14b70 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20 20  dbeWrite--;.    
14b80 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65 72  if( p->bIsReader
14b90 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61 64   ) db->nVdbeRead
14ba0 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  --;.    assert( 
14bb0 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 3e  db->nVdbeActive>
14bc0 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20 29  =db->nVdbeRead )
14bd0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  ;.    assert( db
14be0 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62 2d  ->nVdbeRead>=db-
14bf0 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a 20  >nVdbeWrite );. 
14c00 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e     assert( db->n
14c10 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b 0a  VdbeWrite>=0 );.
14c20 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d    }.  p->magic =
14c30 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
14c40 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56  ;.  checkActiveV
14c50 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69 66  dbeCnt(db);.  if
14c60 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
14c70 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ed ){.    p->rc 
14c80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42  = SQLITE_NOMEM_B
14c90 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  KPT;.  }..  /* I
14ca0 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69  f the auto-commi
14cb0 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f  t flag is set to
14cc0 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79 20   true, then any 
14cd0 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65 20  locks that were 
14ce0 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f 6e  held.  ** by con
14cf0 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65 20  nection db have 
14d00 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73 65  now been release
14d10 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 43  d. Call sqlite3C
14d20 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b 65  onnectionUnlocke
14d30 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e 76  d() .  ** to inv
14d40 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65 64  oke any required
14d50 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63   unlock-notify c
14d60 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20  allbacks..  */. 
14d70 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f 6d   if( db->autoCom
14d80 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mit ){.    sqlit
14d90 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f  e3ConnectionUnlo
14da0 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a 20  cked(db);.  }.. 
14db0 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64   assert( db->nVd
14dc0 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64 62  beActive>0 || db
14dd0 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30 20  ->autoCommit==0 
14de0 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  || db->nStatemen
14df0 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  t==0 );.  return
14e00 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f   (p->rc==SQLITE_
14e10 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42 55  BUSY ? SQLITE_BU
14e20 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  SY : SQLITE_OK);
14e30 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68 20  .}.../*.** Each 
14e40 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20 72  VDBE holds the r
14e50 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f 73  esult of the mos
14e60 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
14e70 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a 20  _step() call.** 
14e80 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73 20  in p->rc.  This 
14e90 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 61  routine sets tha
14ea0 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74 6f  t result back to
14eb0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 76   SQLITE_OK..*/.v
14ec0 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 52  oid sqlite3VdbeR
14ed0 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28 56  esetStepResult(V
14ee0 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72 63  dbe *p){.  p->rc
14ef0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a   = SQLITE_OK;.}.
14f00 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
14f10 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 65  error code and e
14f20 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65 6c  rror message bel
14f30 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56 44  onging to the VD
14f40 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20  BE passed.** as 
14f50 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
14f60 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62 61  nt to its databa
14f70 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74 68  se handle (so th
14f80 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  at they will be 
14f90 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79 20  .** returned by 
14fa0 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
14fb0 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20 73  _errcode() and s
14fc0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 29  qlite3_errmsg())
14fd0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
14fe0 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 63  ction does not c
14ff0 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65 72  lear the VDBE er
15000 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73 73  ror code or mess
15010 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f 70  age, just.** cop
15020 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65 20  ies them to the 
15030 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
15040 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
15050 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f 72  dbeTransferError
15060 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c  (Vdbe *p){.  sql
15070 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
15080 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d 3e  ;.  int rc = p->
15090 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45 72  rc;.  if( p->zEr
150a0 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d 3e  rMsg ){.    db->
150b0 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b 3b  bBenignMalloc++;
150c0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
150d0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
150e0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45 72  .    if( db->pEr
150f0 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72 20  r==0 ) db->pErr 
15100 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
15110 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
15120 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
15130 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e 7a  ->pErr, -1, p->z
15140 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f 55  ErrMsg, SQLITE_U
15150 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e  TF8, SQLITE_TRAN
15160 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69  SIENT);.    sqli
15170 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
15180 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62 42  oc();.    db->bB
15190 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a 20  enignMalloc--;. 
151a0 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 3d     db->errCode =
151b0 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   rc;.  }else{.  
151c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
151d0 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  b, rc);.  }.  re
151e0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
151f0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15200 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49 66  _SQLLOG./*.** If
15210 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   an SQLITE_CONFI
15220 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69 73  G_SQLLOG hook is
15230 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64 20   registered and 
15240 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e 20  the VM has been 
15250 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20  run, .** invoke 
15260 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
15270 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c  id vdbeInvokeSql
15280 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  log(Vdbe *v){.  
15290 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
152a0 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
152b0 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  && v->rc==SQLITE
152c0 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20 26  _OK && v->zSql &
152d0 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20  & v->pc>=0 ){.  
152e0 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64 65    char *zExpande
152f0 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45  d = sqlite3VdbeE
15300 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e 7a  xpandSql(v, v->z
15310 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Sql);.    assert
15320 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75  ( v->db->init.bu
15330 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  sy==0 );.    if(
15340 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20 20   zExpanded ){.  
15350 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
15360 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
15370 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15380 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
15390 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64 62  SqllogArg, v->db
153a0 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a 20  , zExpanded, 1. 
153b0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73 71       );.      sq
153c0 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e 64  lite3DbFree(v->d
153d0 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a 20  b, zExpanded);. 
153e0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65     }.  }.}.#else
153f0 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49 6e  .# define vdbeIn
15400 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23 65  vokeSqllog(x).#e
15410 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  ndif../*.** Clea
15420 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74 65  n up a VDBE afte
15430 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74 20  r execution but 
15440 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68  do not delete th
15450 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74 2e  e VDBE just yet.
15460 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65 72  .** Write any er
15470 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e 74  ror messages int
15480 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52 65  o *pzErrMsg.  Re
15490 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74 20  turn the result 
154a0 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  code..**.** Afte
154b0 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
154c0 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45 20  s run, the VDBE 
154d0 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79 20  should be ready 
154e0 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a 2a  to be executed.*
154f0 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20 54  * again..**.** T
15500 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e 6f  o look at it ano
15510 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20 72  ther way, this r
15520 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74 68  outine resets th
15530 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a 2a  e state of the.*
15540 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e  * virtual machin
15550 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47 49  e from VDBE_MAGI
15560 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d 41  C_RUN or VDBE_MA
15570 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74 6f  GIC_HALT back to
15580 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f 49  .** VDBE_MAGIC_I
15590 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NIT..*/.int sqli
155a0 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64 62  te3VdbeReset(Vdb
155b0 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
155c0 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d 3e   *db;.  db = p->
155d0 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  db;..  /* If the
155e0 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e 20   VM did not run 
155f0 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f 72  to completion or
15600 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65 72   if it encounter
15610 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f 72  ed an.  ** error
15620 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
15630 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68 61  not have been ha
15640 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20 20  lted properly.  
15650 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74 20  So halt.  ** it 
15660 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  now..  */.  sqli
15670 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b 0a  te3VdbeHalt(p);.
15680 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44 42  .  /* If the VDB
15690 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76 65  E has be run eve
156a0 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68 65  n partially, the
156b0 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20 65  n transfer the e
156c0 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
156d0 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  nd error message
156e0 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20 69   from the VDBE i
156f0 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61 74  nto the main dat
15700 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65 2e  abase structure.
15710 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74 68    But.  ** if th
15720 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74 20  e VDBE has just 
15730 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e 20  been set to run 
15740 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74 75  but has not actu
15750 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61 6e  ally executed an
15760 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69  y.  ** instructi
15770 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20 74  ons yet, leave t
15780 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
15790 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74 69   error informati
157a0 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  on unchanged..  
157b0 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d  */.  if( p->pc>=
157c0 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e 76  0 ){.    vdbeInv
157d0 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20 20  okeSqllog(p);.  
157e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72 61    sqlite3VdbeTra
157f0 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a 20  nsferError(p);. 
15800 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
15810 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
15820 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
15830 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d   = 0;.    if( p-
15840 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20 70  >runOnlyOnce ) p
15850 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
15860 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72 63   }else if( p->rc
15870 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20 29   && p->expired )
15880 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  {.    /* The exp
15890 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73 65  ired flag was se
158a0 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62 65  t on the VDBE be
158b0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 63  fore the first c
158c0 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71  all.    ** to sq
158d0 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46 6f  lite3_step(). Fo
158e0 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28 73  r consistency (s
158f0 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74 65  ince sqlite3_ste
15900 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20 63  p() was.    ** c
15910 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65 20  alled), set the 
15920 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
15930 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20 77  n this case as w
15940 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ell..    */.    
15950 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
15960 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20 70  Msg(db, p->rc, p
15970 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  ->zErrMsg ? "%s"
15980 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73 67   : 0, p->zErrMsg
15990 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
159a0 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72  Free(db, p->zErr
159b0 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72  Msg);.    p->zEr
159c0 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  rMsg = 0;.  }.. 
159d0 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c 20   /* Reclaim all 
159e0 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20 74  memory used by t
159f0 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20 43  he VDBE.  */.  C
15a00 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f 2a  leanup(p);..  /*
15a10 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67 20   Save profiling 
15a20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
15a30 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e 0a   this VDBE run..
15a40 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42 45    */.#ifdef VDBE
15a50 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20 20  _PROFILE.  {.   
15a60 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f 70   FILE *out = fop
15a70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c 65  en("vdbe_profile
15a80 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20 20  .out", "a");.   
15a90 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20   if( out ){.    
15aa0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 66    int i;.      f
15ab0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 2d  printf(out, "---
15ac0 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  - ");.      for(
15ad0 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69  i=0; i<p->nOp; i
15ae0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70 72  ++){.        fpr
15af0 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78 22  intf(out, "%02x"
15b00 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63 6f  , p->aOp[i].opco
15b10 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  de);.      }.   
15b20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20     fprintf(out, 
15b30 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "\n");.      if(
15b40 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20 20   p->zSql ){.    
15b50 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20 3d      char c, pc =
15b60 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72 69   0;.        fpri
15b70 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29 3b  ntf(out, "-- ");
15b80 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
15b90 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b 69  ; (c = p->zSql[i
15ba0 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  ])!=0; i++){.   
15bb0 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 27         if( pc=='
15bc0 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15bd0 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20  t, "-- ");.     
15be0 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75 74       putc(c, out
15bf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63 20  );.          pc 
15c00 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = c;.        }. 
15c10 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d 27         if( pc!='
15c20 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f 75  \n' ) fprintf(ou
15c30 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t, "\n");.      
15c40 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
15c50 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b   i<p->nOp; i++){
15c60 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 48  .        char zH
15c70 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20 20  dr[100];.       
15c80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
15c90 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c 20  f(sizeof(zHdr), 
15ca0 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c 6c  zHdr, "%6u %12ll
15cb0 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20 20  u %8llu ",.     
15cc0 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e        p->aOp[i].
15cd0 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  cnt,.           
15ce0 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
15cf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  ,.           p->
15d00 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20 70  aOp[i].cnt>0 ? p
15d10 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73 2f  ->aOp[i].cycles/
15d20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a 20  p->aOp[i].cnt : 
15d30 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  0.        );.   
15d40 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15d50 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a 20  , "%s", zHdr);. 
15d60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
15d70 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20 69  bePrintOp(out, i
15d80 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a 20  , &p->aOp[i]);. 
15d90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63 6c       }.      fcl
15da0 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d 0a  ose(out);.    }.
15db0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e    }.#endif.  p->
15dc0 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20 30  iCurrentTime = 0
15dd0 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  ;.  p->magic = V
15de0 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b 0a  DBE_MAGIC_INIT;.
15df0 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20 26    return p->rc &
15e00 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a   db->errMask;.}.
15e10 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70   ./*.** Clean up
15e20 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56 44   and delete a VD
15e30 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74 69  BE after executi
15e40 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 69  on.  Return an i
15e50 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 0a  nteger which is.
15e60 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f  ** the result co
15e70 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20 65  de.  Write any e
15e80 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65 78  rror message tex
15e90 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73 67  t into *pzErrMsg
15ea0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15eb0 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64 62  VdbeFinalize(Vdb
15ec0 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20  e *p){.  int rc 
15ed0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
15ee0 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42  f( p->magic==VDB
15ef0 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20 70  E_MAGIC_RUN || p
15f00 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41  ->magic==VDBE_MA
15f10 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20 20  GIC_HALT ){.    
15f20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  rc = sqlite3Vdbe
15f30 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61 73  Reset(p);.    as
15f40 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e 64  sert( (rc & p->d
15f50 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63 20  b->errMask)==rc 
15f60 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
15f70 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a 20  VdbeDelete(p);. 
15f80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15f90 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
15fa0 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74 68  r iOp is less th
15fb0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69 6e  an zero, then in
15fc0 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63  voke the destruc
15fd0 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20 61  tor for.** all a
15fe0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
15ff0 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c 79  inters currently
16000 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20 56   cached by the V
16010 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20 74  M passed as.** t
16020 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
16030 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20  t..**.** Or, if 
16040 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20 74  iOp is greater t
16050 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20  han or equal to 
16060 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 64  zero, then the d
16070 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a 20  estructor is.** 
16080 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f 72  only invoked for
16090 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72 79   those auxiliary
160a0 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
160b0 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75 73  reated by the us
160c0 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  er .** function 
160d0 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 4f  invoked by the O
160e0 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f 64  P_Function opcod
160f0 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f 6e  e at instruction
16100 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20 70   iOp of .** VM p
16110 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  Vdbe, and only t
16120 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  hen if:.**.**   
16130 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74 65   * the associate
16140 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d  d function param
16150 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e 64  eter is the 32nd
16160 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e 74   or later (count
16170 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  ing.**      from
16180 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29 2c   left to right),
16190 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74   or.**.**    * t
161a0 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
161b0 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e 74   bit in argument
161c0 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20 28   mask is clear (
161d0 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74 0a  where the first.
161e0 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e  **      function
161f0 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72 65   parameter corre
16200 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30 20  sponds to bit 0 
16210 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  etc.)..*/.void s
16220 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
16230 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33 20  AuxData(sqlite3 
16240 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a 70  *db, AuxData **p
16250 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74 20  p, int iOp, int 
16260 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28 20  mask){.  while( 
16270 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44 61  *pp ){.    AuxDa
16280 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b 0a  ta *pAux = *pp;.
16290 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29 0a      if( (iOp<0).
162a0 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e 69       || (pAux->i
162b0 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75 78  Op==iOp && (pAux
162c0 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28 6d  ->iArg>31 || !(m
162d0 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32 28  ask & MASKBIT32(
162e0 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a 20  pAux->iArg)))). 
162f0 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74     ){.      test
16300 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72 67  case( pAux->iArg
16310 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69 66  ==31 );.      if
16320 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65 20  ( pAux->xDelete 
16330 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78 2d  ){.        pAux-
16340 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e 70  >xDelete(pAux->p
16350 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Aux);.      }.  
16360 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d 3e      *pp = pAux->
16370 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c  pNext;.      sql
16380 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16390 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Aux);.    }else{
163a0 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75 78  .      pp= &pAux
163b0 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
163c0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
163d0 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73 6f   all memory asso
163e0 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
163f0 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20 74  Vdbe passed as t
16400 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
16410 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66 6f  nt,.** except fo
16420 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66 2c  r object itself,
16430 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65 72   which is preser
16440 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  ved..**.** The d
16450 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
16460 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
16470 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65 44  and sqlite3VdbeD
16480 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74 0a  elete() is that.
16490 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29 20  ** VdbeDelete() 
164a0 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68 65  also unlinks the
164b0 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20 6c   Vdbe from the l
164c0 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f 63  ist of VMs assoc
164d0 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68  iated with.** th
164e0 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
164f0 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73 20  ction and frees 
16500 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65 6c  the object itsel
16510 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
16520 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63  e3VdbeClearObjec
16530 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 56  t(sqlite3 *db, V
16540 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50 72  dbe *p){.  SubPr
16550 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70 4e  ogram *pSub, *pN
16560 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ext;.  int i;.  
16570 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d 30  assert( p->db==0
16580 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29 3b   || p->db==db );
16590 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
165a0 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e 6e  ay(p->aVar, p->n
165b0 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65 4d  Var);.  releaseM
165c0 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e  emArray(p->aColN
165d0 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75  ame, p->nResColu
165e0 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20  mn*COLNAME_N);. 
165f0 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50 72   for(pSub=p->pPr
16600 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53 75  ogram; pSub; pSu
16610 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e  b=pNext){.    pN
16620 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65 78  ext = pSub->pNex
16630 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65 4f  t;.    vdbeFreeO
16640 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62 2d  pArray(db, pSub-
16650 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70 29  >aOp, pSub->nOp)
16660 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
16670 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a 20  ree(db, pSub);. 
16680 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 7a   }.  for(i=p->nz
16690 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d  Var-1; i>=0; i--
166a0 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
166b0 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d 29  db, p->azVar[i])
166c0 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
166d0 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 29 3b  e(db, p->azVar);
166e0 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72 72  .  vdbeFreeOpArr
166f0 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20 70  ay(db, p->aOp, p
16700 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74 65  ->nOp);.  sqlite
16710 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16720 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c 69  ColName);.  sqli
16730 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16740 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  >zSql);.  sqlite
16750 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 70  3DbFree(db, p->p
16760 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53 51  Free);.#ifdef SQ
16770 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
16780 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66 6f  _SCANSTATUS.  fo
16790 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63 61  r(i=0; i<p->nSca
167a0 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  n; i++){.    sql
167b0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
167c0 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d 65  ->aScan[i].zName
167d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
167e0 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61 53  DbFree(db, p->aS
167f0 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  can);.#endif.}..
16800 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
16810 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f 0a  entire VDBE..*/.
16820 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
16830 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29 7b  Delete(Vdbe *p){
16840 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
16850 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d  .  if( NEVER(p==
16860 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 64  0) ) return;.  d
16870 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
16880 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
16890 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
168a0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  x) );.  sqlite3V
168b0 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28 64  dbeClearObject(d
168c0 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  b, p);.  if( p->
168d0 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d 3e  pPrev ){.    p->
168e0 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
168f0 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73 65  ->pNext;.  }else
16900 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
16910 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20 20  ->pVdbe==p );.  
16920 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70 2d    db->pVdbe = p-
16930 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
16940 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ( p->pNext ){.  
16950 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65    p->pNext->pPre
16960 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20 20  v = p->pPrev;.  
16970 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20 56  }.  p->magic = V
16980 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b 0a  DBE_MAGIC_DEAD;.
16990 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 73    p->db = 0;.  s
169a0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
169b0 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   p);.}../*.** Th
169c0 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61 73  e cursor "p" has
169d0 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b 20   a pending seek 
169e0 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20 68  operation that h
169f0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a  as not yet been.
16a00 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e 20  ** carried out. 
16a10 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f 72   Seek the cursor
16a20 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72 72   now.  If an err
16a30 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72  or occurs, retur
16a40 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72  n.** the appropr
16a50 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  iate error code.
16a60 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
16a70 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 68  QLITE_NOINLINE h
16a80 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
16a90 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20 2a  eto(VdbeCursor *
16aa0 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20 72  p){.  int res, r
16ab0 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  c;.#ifdef SQLITE
16ac0 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20 69  _TEST.  extern i
16ad0 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63  nt sqlite3_searc
16ae0 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66 0a  h_count;.#endif.
16af0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65 66    assert( p->def
16b00 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a 20  erredMoveto );. 
16b10 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54 61   assert( p->isTa
16b20 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ble );.  assert(
16b30 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
16b40 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20  RTYPE_BTREE );. 
16b50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
16b60 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64  eeMovetoUnpacked
16b70 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c 20  (p->uc.pCursor, 
16b80 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72 67  0, p->movetoTarg
16b90 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20 20  et, 0, &res);.  
16ba0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
16bb0 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d 30  rc;.  if( res!=0
16bc0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
16bd0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 23  _CORRUPT_BKPT;.#
16be0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16bf0 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61 72  T.  sqlite3_sear
16c00 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  ch_count++;.#end
16c10 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65 64  if.  p->deferred
16c20 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70 2d  Moveto = 0;.  p-
16c30 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20 43  >cacheStatus = C
16c40 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72 65  ACHE_STALE;.  re
16c50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16c60 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68 69  }../*.** Somethi
16c70 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75 72  ng has moved cur
16c80 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20 70  sor "p" out of p
16c90 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68 65  lace.  Maybe the
16ca0 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20 70   row it was.** p
16cb0 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64 65  ointed to was de
16cc0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
16cd0 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61 79  nder it.  Or may
16ce0 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61 73  be the btree was
16cf0 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e 20  .** rebalanced. 
16d00 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63 61   Whatever the ca
16d10 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73 74  use, try to rest
16d20 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20 70  ore "p" to the p
16d30 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73 75  lace it.** is su
16d40 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f 69  pposed to be poi
16d50 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72  nting.  If the r
16d60 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f  ow was deleted o
16d70 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
16d80 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65 74  e.** cursor, set
16d90 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70   the cursor to p
16da0 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20 72  oint to a NULL r
16db0 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ow..*/.static in
16dc0 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e  t SQLITE_NOINLIN
16dd0 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72  E handleMovedCur
16de0 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20 2a  sor(VdbeCursor *
16df0 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66 66  p){.  int isDiff
16e00 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20 20  erentRow, rc;.  
16e10 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72 54  assert( p->eCurT
16e20 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
16e30 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  EE );.  assert( 
16e40 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d 30  p->uc.pCursor!=0
16e50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
16e60 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72  lite3BtreeCursor
16e70 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70  HasMoved(p->uc.p
16e80 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63 20  Cursor) );.  rc 
16e90 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  = sqlite3BtreeCu
16ea0 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e 75  rsorRestore(p->u
16eb0 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44 69  c.pCursor, &isDi
16ec0 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20 70  fferentRow);.  p
16ed0 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
16ee0 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 69  CACHE_STALE;.  i
16ef0 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f  f( isDifferentRo
16f00 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20 3d  w ) p->nullRow =
16f10 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   1;.  return rc;
16f20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
16f30 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
16f40 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61 6c  he cursor is val
16f50 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68 65  id.  Restore the
16f60 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e 65   cursor.** if ne
16f70 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20 61  ed be.  Return a
16f80 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72 6f  ny I/O error fro
16f90 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f 70  m the restore op
16fa0 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  eration..*/.int 
16fb0 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f  sqlite3VdbeCurso
16fc0 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75 72  rRestore(VdbeCur
16fd0 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  sor *p){.  asser
16fe0 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d  t( p->eCurType==
16ff0 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b  CURTYPE_BTREE );
17000 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74  .  if( sqlite3Bt
17010 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65  reeCursorHasMove
17020 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29  d(p->uc.pCursor)
17030 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
17040 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
17050 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  (p);.  }.  retur
17060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17070 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
17080 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73 20  the cursor p is 
17090 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f 72  ready to read or
170a0 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20 74   write the row t
170b0 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77 61  o which it.** wa
170c0 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e 65  s last positione
170d0 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72  d.  Return an er
170e0 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20 4f  ror code if an O
170f0 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f 20  OM fault or I/O 
17100 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e 74  error.** prevent
17110 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74 69  s us from positi
17120 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72  oning the cursor
17130 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74 20   to its correct 
17140 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  position..**.** 
17150 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65 72  If a MoveTo oper
17160 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e 67  ation is pending
17170 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63 75   on the given cu
17180 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74 68  rsor, then do th
17190 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f 77  at.** MoveTo now
171a0 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69 73  .  If no move is
171b0 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b 20   pending, check 
171c0 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 6f  to see if the ro
171d0 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64 65  w has been.** de
171e0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
171f0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 20  nder the cursor 
17200 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20 6d  and if it has, m
17210 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a 2a  ark the row as.*
17220 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2a  * a NULL row..**
17230 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f  .** If the curso
17240 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 69  r is already poi
17250 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f 72  nting to the cor
17260 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68 61  rect row and tha
17270 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f 74  t row has.** not
17280 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f 75   been deleted ou
17290 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
172a0 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74 68   cursor, then th
172b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
172c0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
172d0 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72 4d  lite3VdbeCursorM
172e0 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72  oveto(VdbeCursor
172f0 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43 6f   **pp, int *piCo
17300 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f 72  l){.  VdbeCursor
17310 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 66 28   *p = *pp;.  if(
17320 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55   p->eCurType==CU
17330 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a 20  RTYPE_BTREE ){. 
17340 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72 72     if( p->deferr
17350 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20 20  edMoveto ){.    
17360 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20 20    int iMap;.    
17370 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61 70    if( p->aAltMap
17380 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e 61   && (iMap = p->a
17390 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c 5d  AltMap[1+*piCol]
173a0 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  )>0 ){.        *
173b0 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72 73  pp = p->pAltCurs
173c0 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69 43  or;.        *piC
173d0 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a 20  ol = iMap - 1;. 
173e0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
173f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
17400 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68 61  .      return ha
17410 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76 65  ndleDeferredMove
17420 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20  to(p);.    }.   
17430 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
17440 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64 28  eCursorHasMoved(
17450 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20 29  p->uc.pCursor) )
17460 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  {.      return h
17470 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f 72  andleMovedCursor
17480 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  (p);.    }.  }. 
17490 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
174a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  K;.}../*.** The 
174b0 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69  following functi
174c0 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74  ons:.**.** sqlit
174d0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
174e0 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
174f0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
17500 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53  .** sqlite3VdbeS
17510 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73 71  erialLen().** sq
17520 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 50  lite3VdbeSerialP
17530 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56  ut().** sqlite3V
17540 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a 2a  dbeSerialGet().*
17550 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74 65  *.** encapsulate
17560 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20 73   the code that s
17570 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65 73  erializes values
17580 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e 20   for storage in 
17590 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20 61  SQLite.** data a
175a0 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64 73  nd index records
175b0 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a 65  . Each serialize
175c0 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74 73  d value consists
175d0 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61 6c   of a.** 'serial
175e0 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c 6f  -type' and a blo
175f0 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20 73  b of data. The s
17600 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61 6e  erial type is an
17610 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65 64   8-byte unsigned
17620 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74 6f  .** integer, sto
17630 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74 2e  red as a varint.
17640 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51 4c  .**.** In an SQL
17650 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64  ite index record
17660 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79 70  , the serial typ
17670 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72 65  e is stored dire
17680 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20 74  ctly before.** t
17690 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61 20  he blob of data 
176a0 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70 6f  that it correspo
176b0 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61 62  nds to. In a tab
176c0 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20 73  le record, all s
176d0 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20 61  erial.** types a
176e0 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68 65  re stored at the
176f0 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72 65   start of the re
17700 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62 6c  cord, and the bl
17710 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a 2a  obs of data at.*
17720 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63 65  * the end. Hence
17730 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e 73   these functions
17740 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c 65   allow the calle
17750 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 0a  r to handle the.
17760 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20 61  ** serial-type a
17770 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65 70  nd data blob sep
17780 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  arately..**.** T
17790 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62  he following tab
177a0 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65  le describes the
177b0 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67 65   various storage
177c0 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61 74   classes for dat
177d0 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69 61  a:.**.**   seria
177e0 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62 79  l type        by
177f0 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20 20  tes of data     
17800 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d   type.**   -----
17810 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
17820 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
17830 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
17840 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20 20  .**      0      
17850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17860 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c 4c              NULL
17870 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20 20  .**      1      
17880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
17890 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
178a0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
178b0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
178c0 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
178d0 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
178e0 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20 20  eger.**      3  
178f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17900 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
17910 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a  signed integer.*
17920 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  *      4        
17930 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20 20               4  
17940 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65 64            signed
17950 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20   integer.**     
17960 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20 20   5              
17970 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20 20         6        
17980 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17990 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20 20  er.**      6    
179a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
179b0 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73 69   8            si
179c0 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
179d0 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20 20       7          
179e0 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20 20             8    
179f0 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c 6f          IEEE flo
17a00 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20 20  at.**      8    
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e   0            In
17a30 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 30  teger constant 0
17a40 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20 20  .**      9      
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
17a60 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74 65              Inte
17a70 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a 2a  ger constant 1.*
17a80 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20 20  *     10,11     
17a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17aa0 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72 76            reserv
17ab0 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  ed for expansion
17ac0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e 64  .**    N>=12 and
17ad0 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d 31   even       (N-1
17ae0 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f 42  2)/2        BLOB
17af0 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e 64  .**    N>=13 and
17b00 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d 31   odd        (N-1
17b10 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78 74  3)/2        text
17b20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e 64  .**.** The 8 and
17b30 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61 64   9 types were ad
17b40 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66 69  ded in 3.3.0, fi
17b50 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50 72  le format 4.  Pr
17b60 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a 20  ior versions.** 
17b70 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20 6e  of SQLite will n
17b80 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68  ot understand th
17b90 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65 73  ose serial types
17ba0 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ..*/../*.** Retu
17bb0 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74 79  rn the serial-ty
17bc0 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65  pe for the value
17bd0 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 2e   stored in pMem.
17be0 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56  .*/.u32 sqlite3V
17bf0 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d 65  dbeSerialType(Me
17c00 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69 6c  m *pMem, int fil
17c10 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a 70  e_format, u32 *p
17c20 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61 67  Len){.  int flag
17c30 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 3b  s = pMem->flags;
17c40 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73 73  .  u32 n;..  ass
17c50 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b 0a  ert( pLen!=0 );.
17c60 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f    if( flags&MEM_
17c70 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65  Null ){.    *pLe
17c80 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72  n = 0;.    retur
17c90 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  n 0;.  }.  if( f
17ca0 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b 0a  lags&MEM_Int ){.
17cb0 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
17cc0 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73 65  t whether to use
17cd0 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20 38   1, 2, 4, 6 or 8
17ce0 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20 64   bytes. */.#   d
17cf0 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45 20  efine MAX_6BYTE 
17d00 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38 30  ((((i64)0x000080
17d10 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20 20  00)<<32)-1).    
17d20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75 2e  i64 i = pMem->u.
17d30 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20 20  i;.    u64 u;.  
17d40 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20 20    if( i<0 ){.   
17d50 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20 7d     u = ~i;.    }
17d60 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d 20  else{.      u = 
17d70 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  i;.    }.    if(
17d80 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20 20   u<=127 ){.     
17d90 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26 26   if( (i&1)==i &&
17da0 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34 20   file_format>=4 
17db0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65 6e  ){.        *pLen
17dc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
17dd0 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a 20  turn 8+(u32)u;. 
17de0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
17df0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a 20      *pLen = 1;. 
17e00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
17e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17e20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37 20     if( u<=32767 
17e30 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72 65  ){ *pLen = 2; re
17e40 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69 66  turn 2; }.    if
17e50 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b 20  ( u<=8388607 ){ 
17e60 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75 72  *pLen = 3; retur
17e70 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 3; }.    if( u
17e80 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b 20  <=2147483647 ){ 
17e90 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75 72  *pLen = 4; retur
17ea0 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20 75  n 4; }.    if( u
17eb0 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20 2a  <=MAX_6BYTE ){ *
17ec0 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72 6e  pLen = 6; return
17ed0 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e 20   5; }.    *pLen 
17ee0 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 8;.    return 
17ef0 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  6;.  }.  if( fla
17f00 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a 20  gs&MEM_Real ){. 
17f10 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20     *pLen = 8;.  
17f20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d 0a    return 7;.  }.
17f30 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
17f40 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17f50 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f 53   || flags&(MEM_S
17f60 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b 0a  tr|MEM_Blob) );.
17f70 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e    assert( pMem->
17f80 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28 75  n>=0 );.  n = (u
17f90 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69 66  32)pMem->n;.  if
17fa0 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65  ( flags & MEM_Ze
17fb0 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20 70  ro ){.    n += p
17fc0 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  Mem->u.nZero;.  
17fd0 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a 20  }.  *pLen = n;. 
17fe0 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20 2b   return ((n*2) +
17ff0 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d 45   12 + ((flags&ME
18000 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a 0a  M_Str)!=0));.}..
18010 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73 20  /*.** The sizes 
18020 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65 73  for serial types
18030 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a 2a   less than 128.*
18040 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
18050 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  8 sqlite3SmallTy
18060 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20 20  peSizes[] = {.  
18070 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31 20        /*  0   1 
18080 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35 20    2   3   4   5 
18090 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39 20    6   7   8   9 
180a0 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f 20  */   ./*   0 */ 
180b0 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33 2c    0,  1,  2,  3,
180c0 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38 2c    4,  6,  8,  8,
180d0 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30 20    0,  0,./*  10 
180e0 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c 20  */   0,  0,  0, 
180f0 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c 20   0,  1,  1,  2, 
18100 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20 20   2,  3,  3,./*  
18110 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20 20  20 */   4,  4,  
18120 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20 20  5,  5,  6,  6,  
18130 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a 2f  7,  7,  8,  8,./
18140 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20 39  *  30 */   9,  9
18150 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31 31  , 10, 10, 11, 11
18160 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31 33  , 12, 12, 13, 13
18170 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34 2c  ,./*  40 */  14,
18180 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36 2c   14, 15, 15, 16,
18190 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38 2c   16, 17, 17, 18,
181a0 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20 20   18,./*  50 */  
181b0 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c 20  19, 19, 20, 20, 
181c0 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c 20  21, 21, 22, 22, 
181d0 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20 2a  23, 23,./*  60 *
181e0 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20 32  /  24, 24, 25, 2
181f0 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20 32  5, 26, 26, 27, 2
18200 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20 37  7, 28, 28,./*  7
18210 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33 30  0 */  29, 29, 30
18220 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33 32  , 30, 31, 31, 32
18230 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f 2a  , 32, 33, 33,./*
18240 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34 2c    80 */  34, 34,
18250 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36 2c   35, 35, 36, 36,
18260 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38 2c   37, 37, 38, 38,
18270 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c 20  ./*  90 */  39, 
18280 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c 20  39, 40, 40, 41, 
18290 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c 20  41, 42, 42, 43, 
182a0 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20 34  43,./* 100 */  4
182b0 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20 34  4, 44, 45, 45, 4
182c0 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20 34  6, 46, 47, 47, 4
182d0 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a 2f  8, 48,./* 110 */
182e0 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35 30    49, 49, 50, 50
182f0 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35 32  , 51, 51, 52, 52
18300 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32 30  , 53, 53,./* 120
18310 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35 2c   */  54, 54, 55,
18320 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37 2c   55, 56, 56, 57,
18330 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   57.};../*.** Re
18340 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20  turn the length 
18350 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72 72  of the data corr
18360 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
18370 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61 6c   supplied serial
18380 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73 71  -type..*/.u32 sq
18390 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
183a0 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69 61  ypeLen(u32 seria
183b0 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20 73  l_type){.  if( s
183c0 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38 20  erial_type>=128 
183d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 73  ){.    return (s
183e0 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f 32  erial_type-12)/2
183f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
18400 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79  ssert( serial_ty
18410 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20 20  pe<12 .         
18420 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d 61     || sqlite3Sma
18430 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69  llTypeSizes[seri
18440 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69 61  al_type]==(seria
18450 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20 29  l_type - 12)/2 )
18460 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  ;.    return sql
18470 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a  ite3SmallTypeSiz
18480 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b  es[serial_type];
18490 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74 65  .  }.}.u8 sqlite
184a0 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72 69  3VdbeOneByteSeri
184b0 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65 72  alTypeLen(u8 ser
184c0 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73 73  ial_type){.  ass
184d0 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70 65  ert( serial_type
184e0 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72 6e  <128 );.  return
184f0 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70   sqlite3SmallTyp
18500 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79  eSizes[serial_ty
18510 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pe];  .}../*.** 
18520 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e 20  If we are on an 
18530 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69 74  architecture wit
18540 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20 66  h mixed-endian f
18550 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69 6e  loating .** poin
18560 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74 68  ts (ex: ARM7) th
18570 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77 65  en swap the lowe
18580 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20 74  r 4 bytes with t
18590 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20 62  he .** upper 4 b
185a0 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74 68  ytes.  Return th
185b0 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20  e result..**.** 
185c0 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74 65  For most archite
185d0 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73 20  ctures, this is 
185e0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 28  a no-op..**.** (
185f0 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20 72  later):  It is r
18600 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74 68  eported to me th
18610 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e 64  at the mixed-end
18620 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 6f  ian problem.** o
18630 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73 73  n ARM7 is an iss
18640 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f 74  ue with GCC, not
18650 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20 63   with the ARM7 c
18660 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a 2a  hip.  It seems.*
18670 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65 72  * that early ver
18680 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74 6f  sions of GCC sto
18690 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72 64  red the two word
186a0 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a 2a  s of a 64-bit.**
186b0 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77 72   float in the wr
186c0 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64 20  ong order.  And 
186d0 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20 62  that error has b
186e0 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a 2a  een propagated.*
186f0 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20 54  * ever since.  T
18700 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74 20  he blame is not 
18710 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74 68  necessarily with
18720 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a 2a   GCC, though..**
18730 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65 20   GCC might have 
18740 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68 65  just copying the
18750 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61 20   problem from a 
18760 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e 0a  prior compiler..
18770 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f 6c  ** I am also tol
18780 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65 72  d that newer ver
18790 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68 61  sions of GCC tha
187a0 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66 65  t follow a diffe
187b0 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74 20  rent.** ABI get 
187c0 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20 72  the byte order r
187d0 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76 65  ight..**.** Deve
187e0 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51 4c  lopers using SQL
187f0 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20 73  ite on an ARM7 s
18800 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61 6e  hould compile an
18810 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20 61  d run their.** a
18820 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e 67  pplication using
18830 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47 3d   -DSQLITE_DEBUG=
18840 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 2e  1 at least once.
18850 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a 20    With DEBUG.** 
18860 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61 73  enabled, some as
18870 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c 6c  serts below will
18880 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
18890 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a 2a   byte order of.*
188a0 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  * floating point
188b0 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72 65   values is corre
188c0 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37 2d  ct..**.** (2007-
188d0 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76 61  08-30)  Frank va
188e0 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64 69  n Vugt has studi
188f0 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 20  ed this problem 
18900 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20 68  closely.** and h
18910 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e 64  as send his find
18920 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c 69  ings to the SQLi
18930 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20 20  te developers.  
18940 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73 20  Frank.** writes 
18950 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78 20  that some Linux 
18960 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66 6c  kernels offer fl
18970 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61 72  oating point har
18980 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74 69  dware.** emulati
18990 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e 6c  on that uses onl
189a0 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73 73  y 32-bit mantiss
189b0 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61 20  as instead of a 
189c0 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74 73  full .** 48-bits
189d0 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79 20   as required by 
189e0 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61 72  the IEEE standar
189f0 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68 65  d.  (This is the
18a00 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f 46  .** CONFIG_FPE_F
18a10 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29 20  ASTFPE option.) 
18a20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d 73   On such systems
18a30 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  , floating point
18a40 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69 6e  .** byte swappin
18a50 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20 63  g becomes very c
18a60 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f 20  omplicated.  To 
18a70 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c 0a  avoid problems,.
18a80 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72 79  ** the necessary
18a90 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20 69   byte swapping i
18aa0 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75 73  s carried out us
18ab0 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e 74  ing a 64-bit int
18ac0 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74  eger.** rather t
18ad0 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f  han a 64-bit flo
18ae0 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75 72  at.  Frank assur
18af0 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20 63  es us that the c
18b00 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72 6b  ode here.** work
18b10 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c 20  s for him.  We, 
18b20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c 20  the developers, 
18b30 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20 69  have no way to i
18b40 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a 20  ndependently.** 
18b50 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75 74  verify this, but
18b60 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f 20   Frank seems to 
18b70 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73 20  know what he is 
18b80 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a 2a  talking about.**
18b90 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69 6d   so we trust him
18ba0 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
18bb0 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f  TE_MIXED_ENDIAN_
18bc0 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61 74  64BIT_FLOAT.stat
18bd0 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61 70  ic u64 floatSwap
18be0 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69 6f  (u64 in){.  unio
18bf0 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a 20  n {.    u64 r;. 
18c00 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20 7d     u32 i[2];.  }
18c10 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20 20   u;.  u32 t;..  
18c20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d 20  u.r = in;.  t = 
18c30 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30 5d  u.i[0];.  u.i[0]
18c40 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e 69   = u.i[1];.  u.i
18c50 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75 72  [1] = t;.  retur
18c60 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69 6e  n u.r;.}.# defin
18c70 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61  e swapMixedEndia
18c80 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20 66  nFloat(X)  X = f
18c90 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c 73  loatSwap(X).#els
18ca0 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d  e.# define swapM
18cb0 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28  ixedEndianFloat(
18cc0 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
18cd0 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69 61   Write the seria
18ce0 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62 20  lized data blob 
18cf0 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73 74  for the value st
18d00 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e 74  ored in pMem int
18d10 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69 73  o .** buf. It is
18d20 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
18d30 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 6c  e caller has all
18d40 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65 6e  ocated sufficien
18d50 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74 75  t space..** Retu
18d60 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
18d70 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e 0a   bytes written..
18d80 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74 68  **.** nBuf is th
18d90 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61 63  e amount of spac
18da0 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d 2e  e left in buf[].
18db0 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20    The caller is 
18dc0 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20 66  responsible.** f
18dd0 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65 6e  or allocating en
18de0 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62 75  ough space to bu
18df0 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  f[] to hold the 
18e00 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65 78  entire field, ex
18e10 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74 68  clusive.** of th
18e20 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 20  e pMem->u.nZero 
18e30 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d 5f  bytes for a MEM_
18e40 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  Zero value..**.*
18e50 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
18e60 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
18e70 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69 6e  ually written in
18e80 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 6e  to buf[].  The n
18e90 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74 65  umber.** of byte
18ea0 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66 69  s in the zero-fi
18eb0 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e 63  lled tail is inc
18ec0 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65 74  luded in the ret
18ed0 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a 2a  urn value only.*
18ee0 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65 73  * if those bytes
18ef0 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e 20   were zeroed in 
18f00 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20 73  buf[]..*/ .u32 s
18f10 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
18f20 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65 6d  Put(u8 *buf, Mem
18f30 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72 69   *pMem, u32 seri
18f40 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32 20  al_type){.  u32 
18f50 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 67  len;..  /* Integ
18f60 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a 20  er and Real */. 
18f70 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
18f80 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74 79  <=7 && serial_ty
18f90 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34 20  pe>0 ){.    u64 
18fa0 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20 20  v;.    u32 i;.  
18fb0 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
18fc0 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61 73  e==7 ){.      as
18fd0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29 3d  sert( sizeof(v)=
18fe0 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75 2e  =sizeof(pMem->u.
18ff0 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  r) );.      memc
19000 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75 2e  py(&v, &pMem->u.
19010 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a 20  r, sizeof(v));. 
19020 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e       swapMixedEn
19030 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20 20  dianFloat(v);.  
19040 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 76    }else{.      v
19050 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20   = pMem->u.i;.  
19060 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69 20    }.    len = i 
19070 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  = sqlite3SmallTy
19080 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
19090 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  ype];.    assert
190a0 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f 7b  ( i>0 );.    do{
190b0 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d 20  .      buf[--i] 
190c0 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b 0a  = (u8)(v&0xFF);.
190d0 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a 20        v >>= 8;. 
190e0 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b 0a     }while( i );.
190f0 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b 0a      return len;.
19100 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e 67    }..  /* String
19110 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69 66   or blob */.  if
19120 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31  ( serial_type>=1
19130 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  2 ){.    assert(
19140 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d 65   pMem->n + ((pMe
19150 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  m->flags & MEM_Z
19160 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a 65  ero)?pMem->u.nZe
19170 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20 20  ro:0).          
19180 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69 74     == (int)sqlit
19190 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
191a0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
191b0 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70 4d   );.    len = pM
191c0 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20 6c  em->n;.    if( l
191d0 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62 75  en>0 ) memcpy(bu
191e0 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e 29  f, pMem->z, len)
191f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e  ;.    return len
19200 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c 4c  ;.  }..  /* NULL
19210 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30 20   or constants 0 
19220 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72 6e  or 1 */.  return
19230 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74 20   0;.}../* Input 
19240 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e 63  "x" is a sequenc
19250 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63 68  e of unsigned ch
19260 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72 65  aracters that re
19270 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69 67  present a.** big
19280 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 2e  -endian integer.
19290 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71 75    Return the equ
192a0 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20 69  ivalent native i
192b0 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  nteger.*/.#defin
192c0 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 78  e ONE_BYTE_INT(x
192d0 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30 5d  )    ((i8)(x)[0]
192e0 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42 59  ).#define TWO_BY
192f0 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32 35  TE_INT(x)    (25
19300 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28  6*(i8)((x)[0])|(
19310 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20 54  x)[1]).#define T
19320 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78 29  HREE_BYTE_INT(x)
19330 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28 78    (65536*(i8)((x
19340 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c 38  )[0])|((x)[1]<<8
19350 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69 6e  )|(x)[2]).#defin
19360 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  e FOUR_BYTE_UINT
19370 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29 5b  (x)  (((u32)(x)[
19380 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d 3c  0]<<24)|((x)[1]<
19390 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38 29  <16)|((x)[2]<<8)
193a0 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e 65  |(x)[3]).#define
193b0 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 78   FOUR_BYTE_INT(x
193c0 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38 29  ) (16777216*(i8)
193d0 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d  ((x)[0])|((x)[1]
193e0 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
193f0 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a 2a  )|(x)[3])../*.**
19400 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68 65   Deserialize the
19410 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e 74   data blob point
19420 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73 20  ed to by buf as 
19430 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72 69  serial type seri
19440 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20 73  al_type.** and s
19450 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 20  tore the result 
19460 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72 6e  in pMem.  Return
19470 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19480 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ytes read..**.**
19490 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
194a0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
194b0 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72 6f   two separate ro
194c0 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66 6f  utines for perfo
194d0 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 66  rmance..** The f
194e0 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72 65  ew cases that re
194f0 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72 69  quire local vari
19500 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65 6e  ables are broken
19510 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70 61   out into a sepa
19520 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  rate.** routine 
19530 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74 20  so that in most 
19540 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68 65  cases the overhe
19550 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68 65  ad of moving the
19560 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a 2a   stack pointer.*
19570 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a 2f  * is avoided..*/
19580 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51 4c   .static u32 SQL
19590 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65 72  ITE_NOINLINE ser
195a0 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74 20  ialGet(.  const 
195b0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 62  unsigned char *b
195c0 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66 65  uf,     /* Buffe
195d0 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65  r to deserialize
195e0 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 73   from */.  u32 s
195f0 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20 20  erial_type,     
19600 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69           /* Seri
19610 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65 72  al type to deser
19620 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20  ialize */.  Mem 
19630 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20 20  *pMem           
19640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d            /* Mem
19650 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69 74  ory cell to writ
19660 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a  e value into */.
19670 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f 55  ){.  u64 x = FOU
19680 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 29  R_BYTE_UINT(buf)
19690 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55 52  ;.  u32 y = FOUR
196a0 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 34  _BYTE_UINT(buf+4
196b0 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32 29  );.  x = (x<<32)
196c0 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72 69   + y;.  if( seri
196d0 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20 20  al_type==6 ){.  
196e0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
196f0 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32 20  : R-29851-52272 
19700 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
19710 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20 20  ndian 64-bit.   
19720 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d   ** twos-complem
19730 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a  ent integer. */.
19740 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19750 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 70  *(i64*)&x;.    p
19760 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d  Mem->flags = MEM
19770 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63 61  _Int;.    testca
19780 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
19790 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
197a0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
197b0 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56 61  R-57343-49114 Va
197c0 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64  lue is a big-end
197d0 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30 30  ian IEEE 754-200
197e0 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a 20  8 64-bit.    ** 
197f0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 6e  floating point n
19800 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21 64  umber. */.#if !d
19810 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 26  efined(NDEBUG) &
19820 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
19830 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19840 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56 65  POINT).    /* Ve
19850 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67 65  rify that intege
19860 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67 20  rs and floating 
19870 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73 65  point values use
19880 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a 2a   the same.    **
19890 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f 72   byte order.  Or
198a0 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54 45  , that if SQLITE
198b0 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36 34  _MIXED_ENDIAN_64
198c0 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20 20  BIT_FLOAT is.   
198d0 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61 74   ** defined that
198e0 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e 67   64-bit floating
198f0 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72 65   point values re
19900 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a 20  ally are mixed. 
19910 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20 20     ** endian..  
19920 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20    */.    static 
19930 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20 28  const u64 t1 = (
19940 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30 29  (u64)0x3ff00000)
19950 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69 63  <<32;.    static
19960 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72 31   const double r1
19970 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34 20   = 1.0;.    u64 
19980 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77 61  t2 = t1;.    swa
19990 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
199a0 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65 72  t(t2);.    asser
199b0 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d 73  t( sizeof(r1)==s
199c0 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65 6d  izeof(t2) && mem
199d0 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73 69  cmp(&r1, &t2, si
199e0 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b 0a  zeof(r1))==0 );.
199f0 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72  #endif.    asser
19a00 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20  t( sizeof(x)==8 
19a10 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e  && sizeof(pMem->
19a20 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20 73  u.r)==8 );.    s
19a30 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c  wapMixedEndianFl
19a40 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d 63  oat(x);.    memc
19a50 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20 26  py(&pMem->u.r, &
19a60 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a 20  x, sizeof(x));. 
19a70 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19a80 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70 4d   sqlite3IsNaN(pM
19a90 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f 4e  em->u.r) ? MEM_N
19aa0 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b 0a  ull : MEM_Real;.
19ab0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b 0a    }.  return 8;.
19ac0 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  }.u32 sqlite3Vdb
19ad0 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63 6f  eSerialGet(.  co
19ae0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
19af0 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20 42  r *buf,     /* B
19b00 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69 61  uffer to deseria
19b10 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  lize from */.  u
19b20 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  32 serial_type, 
19b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b40 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20 64  Serial type to d
19b50 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20  eserialize */.  
19b60 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20 20  Mem *pMem       
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b80 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20   Memory cell to 
19b90 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74 6f  write value into
19ba0 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68 28   */.){.  switch(
19bb0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a   serial_type ){.
19bc0 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20 2f      case 10:   /
19bd0 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20 66  * Reserved for f
19be0 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20  uture use */.   
19bf0 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20 52   case 11:   /* R
19c00 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74 75  eserved for futu
19c10 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63 61  re use */.    ca
19c20 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c 6c  se 0: {  /* Null
19c30 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49   */.      /* EVI
19c40 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30 37  DENCE-OF: R-2407
19c50 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69 73  8-09375 Value is
19c60 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20   a NULL. */.    
19c70 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19c80 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20 20  MEM_Null;.      
19c90 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
19ca0 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20 20   case 1: {.     
19cb0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
19cc0 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20 56   R-44885-25196 V
19cd0 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69 74  alue is an 8-bit
19ce0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19cf0 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  .      ** intege
19d00 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d  r. */.      pMem
19d10 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54 45  ->u.i = ONE_BYTE
19d20 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
19d30 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19d40 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
19d50 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
19d60 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
19d70 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
19d80 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d   case 2: { /* 2-
19d90 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
19da0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
19db0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34  EVIDENCE-OF: R-4
19dc0 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75 65  9794-35026 Value
19dd0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19de0 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   16-bit.      **
19df0 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
19e00 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
19e10 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54     pMem->u.i = T
19e20 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66 29  WO_BYTE_INT(buf)
19e30 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c  ;.      pMem->fl
19e40 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20  ags = MEM_Int;. 
19e50 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
19e60 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20  Mem->u.i<0 );.  
19e70 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20      return 2;.  
19e80 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
19e90 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67 6e  { /* 3-byte sign
19ea0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
19eb0 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
19ec0 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33 30  OF: R-37839-5430
19ed0 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67  1 Value is a big
19ee0 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a 20  -endian 24-bit. 
19ef0 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d       ** twos-com
19f00 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e  plement integer.
19f10 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19f20 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54 45  u.i = THREE_BYTE
19f30 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20  _INT(buf);.     
19f40 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d   pMem->flags = M
19f50 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65  EM_Int;.      te
19f60 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e  stcase( pMem->u.
19f70 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  i<0 );.      ret
19f80 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 3;.    }.   
19f90 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34 2d   case 4: { /* 4-
19fa0 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65  byte signed inte
19fb0 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ger */.      /* 
19fc0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30  EVIDENCE-OF: R-0
19fd0 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75 65  1849-26079 Value
19fe0 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e   is a big-endian
19ff0 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a   32-bit.      **
1a000 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74   twos-complement
1a010 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20   integer. */.   
1a020 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46     pMem->u.i = F
1a030 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  OUR_BYTE_INT(buf
1a040 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f 63  );.#ifdef __HP_c
1a050 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72 6b  c .      /* Work
1a060 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d 65   around a sign-e
1a070 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e 20  xtension bug in 
1a080 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72 20  the HP compiler 
1a090 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20 20  for HP/UX */.   
1a0a0 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30 78     if( buf[0]&0x
1a0b0 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20 7c  80 ) pMem->u.i |
1a0c0 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30 30  = 0xffffffff8000
1a0d0 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a 20  0000LL;.#endif. 
1a0e0 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73       pMem->flags
1a0f0 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20   = MEM_Int;.    
1a100 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
1a110 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20  ->u.i<0 );.     
1a120 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20 7d   return 4;.    }
1a130 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20 2f  .    case 5: { /
1a140 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64 20  * 6-byte signed 
1a150 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20  integer */.     
1a160 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
1a170 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20 56   R-50385-09674 V
1a180 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
1a190 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20 20  dian 48-bit.    
1a1a0 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
1a1b0 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
1a1c0 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69  .      pMem->u.i
1a1d0 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e   = FOUR_BYTE_UIN
1a1e0 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69 36  T(buf+2) + (((i6
1a1f0 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59  4)1)<<32)*TWO_BY
1a200 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20  TE_INT(buf);.   
1a210 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
1a220 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20   MEM_Int;.      
1a230 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e  testcase( pMem->
1a240 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72  u.i<0 );.      r
1a250 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a 20  eturn 6;.    }. 
1a260 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a 20     case 6:   /* 
1a270 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e  8-byte signed in
1a280 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61 73  teger */.    cas
1a290 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20 66  e 7: { /* IEEE f
1a2a0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a 2f  loating point */
1a2b0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65 20  .      /* These 
1a2c0 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61 62  use local variab
1a2d0 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d 20  les, so do them 
1a2e0 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72 6f  in a separate ro
1a2f0 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20 74  utine.      ** t
1a300 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20 74  o avoid having t
1a310 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d 65  o move the frame
1a320 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20   pointer in the 
1a330 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
1a340 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72 69       return seri
1a350 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61 6c  alGet(buf,serial
1a360 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20 20  _type,pMem);.   
1a370 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20 20   }.    case 8:  
1a380 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20 2a    /* Integer 0 *
1a390 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b 20  /.    case 9: { 
1a3a0 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a 2f   /* Integer 1 */
1a3b0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a3c0 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d 32  CE-OF: R-12976-2
1a3d0 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74 68  2893 Value is th
1a3e0 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f 0a  e integer 0. */.
1a3f0 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
1a400 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31 32  E-OF: R-18143-12
1a410 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68 65  121 Value is the
1a420 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a 20   integer 1. */. 
1a430 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d       pMem->u.i =
1a440 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b 0a   serial_type-8;.
1a450 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a460 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a470 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
1a480 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
1a490 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  {.      /* EVIDE
1a4a0 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36 2d  NCE-OF: R-14606-
1a4b0 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20 61  31564 Value is a
1a4c0 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28 4e   BLOB that is (N
1a4d0 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e 0a  -12)/2 bytes in.
1a4e0 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68 2e        ** length.
1a4f0 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e  .      ** EVIDEN
1a500 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d 30  CE-OF: R-28401-0
1a510 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61 20  0140 Value is a 
1a520 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74 65  string in the te
1a530 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64 0a  xt encoding and.
1a540 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29 2f        ** (N-13)/
1a550 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  2 bytes in lengt
1a560 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61 74  h. */.      stat
1a570 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46 6c  ic const u16 aFl
1a580 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c 6f  ag[] = { MEM_Blo
1a590 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45 4d  b|MEM_Ephem, MEM
1a5a0 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20 7d  _Str|MEM_Ephem }
1a5b0 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20  ;.      pMem->z 
1a5c0 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a 20  = (char *)buf;. 
1a5d0 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 28       pMem->n = (
1a5e0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
1a5f0 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  2;.      pMem->f
1a600 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65 72  lags = aFlag[ser
1a610 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20 20  ial_type&1];.   
1a620 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d 3e     return pMem->
1a630 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  n;.    }.  }.  r
1a640 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a 2a  eturn 0;.}./*.**
1a650 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1a660 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   used to allocat
1a670 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61  e sufficient spa
1a680 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63 6b  ce for an Unpack
1a690 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75  edRecord.** stru
1a6a0 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f 75  cture large enou
1a6b0 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77 69  gh to be used wi
1a6c0 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  th sqlite3VdbeRe
1a6d0 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66 0a  cordUnpack() if.
1a6e0 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 67  ** the first arg
1a6f0 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
1a700 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73 74  er to KeyInfo st
1a710 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66 6f  ructure pKeyInfo
1a720 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61 63  ..**.** The spac
1a730 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c 6f  e is either allo
1a740 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c 69  cated using sqli
1a750 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 29  te3DbMallocRaw()
1a760 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e 0a   or from within.
1a770 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  ** the unaligned
1a780 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20 76   buffer passed v
1a790 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61 6e  ia the second an
1a7a0 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  d third argument
1a7b0 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a 2a  s (presumably.**
1a7c0 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20 49   stack space). I
1a7d0 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74 68  f the former, th
1a7e0 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73 65  en *ppFree is se
1a7f0 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  t to a pointer t
1a800 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  hat should.** be
1a810 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
1a820 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
1a830 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62 46  using sqlite3DbF
1a840 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74 68  ree(). Or, if th
1a850 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f 6e  e .** allocation
1a860 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65 20   comes from the 
1a870 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20 62  pSpace/szSpace b
1a880 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20 69  uffer, *ppFree i
1a890 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1a8a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1a8b0 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 4f  g..**.** If an O
1a8c0 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  OM error occurs,
1a8d0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1a8e0 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52 65  d..*/.UnpackedRe
1a8f0 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64 62  cord *sqlite3Vdb
1a900 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52 65  eAllocUnpackedRe
1a910 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f 20  cord(.  KeyInfo 
1a920 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
1a930 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63 72          /* Descr
1a940 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72 65  iption of the re
1a950 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  cord */.  char *
1a960 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20 20  pSpace,         
1a970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 61            /* Una
1a980 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76 61  ligned space ava
1a990 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  ilable */.  int 
1a9a0 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  szSpace,        
1a9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1a9c0 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d 20  ize of pSpace[] 
1a9d0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63 68  in bytes */.  ch
1a9e0 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20 20  ar **ppFree     
1a9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa00 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68 6f   OUT: Caller sho
1aa10 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70 6f  uld free this po
1aa20 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55 6e  inter */.){.  Un
1aa30 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 3b  packedRecord *p;
1aa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1aa50 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   Unpacked record
1aa60 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
1aa70 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20 20  int nOff;       
1aa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa90 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53 70  /* Increment pSp
1aaa0 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20 61  ace by nOff to a
1aab0 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e 74  lign it */.  int
1aac0 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20 20   nByte;         
1aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1aae0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1aaf0 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70 20  required for *p 
1ab00 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e 74  */..  /* We want
1ab10 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70 6f   to shift the po
1ab20 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70 20  inter pSpace up 
1ab30 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73 20  such that it is 
1ab40 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e 0a  8-byte aligned..
1ab50 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e 65    ** Thus, we ne
1ab60 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65 20  ed to calculate 
1ab70 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20 62  a value, nOff, b
1ab80 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c 20  etween 0 and 7, 
1ab90 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20 69  to shift .  ** i
1aba0 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63 65  t by.  If pSpace
1abb0 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62 79   is already 8-by
1abc0 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66 66  te aligned, nOff
1abd0 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f 2e   should be zero.
1abe0 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20 28  .  */.  nOff = (
1abf0 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52 5f  8 - (SQLITE_PTR_
1ac00 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20 26  TO_INT(pSpace) &
1ac10 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79 74   7)) & 7;.  nByt
1ac20 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f  e = ROUND8(sizeo
1ac30 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  f(UnpackedRecord
1ac40 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d 29  )) + sizeof(Mem)
1ac50 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65  *(pKeyInfo->nFie
1ac60 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42 79  ld+1);.  if( nBy
1ac70 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66 20  te>szSpace+nOff 
1ac80 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70 61  ){.    p = (Unpa
1ac90 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71 6c  ckedRecord *)sql
1aca0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1acb0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e 42  pKeyInfo->db, nB
1acc0 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72 65  yte);.    *ppFre
1acd0 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a 20  e = (char *)p;. 
1ace0 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74 75     if( !p ) retu
1acf0 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  rn 0;.  }else{. 
1ad00 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65 64     p = (Unpacked
1ad10 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65 5b  Record*)&pSpace[
1ad20 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46 72  nOff];.    *ppFr
1ad30 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 70  ee = 0;.  }..  p
1ad40 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29 26  ->aMem = (Mem*)&
1ad50 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e 44  ((char*)p)[ROUND
1ad60 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b 65  8(sizeof(Unpacke
1ad70 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61 73  dRecord))];.  as
1ad80 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e  sert( pKeyInfo->
1ad90 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29 3b  aSortOrder!=0 );
1ada0 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d  .  p->pKeyInfo =
1adb0 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d 3e   pKeyInfo;.  p->
1adc0 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e 66  nField = pKeyInf
1add0 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a 20  o->nField + 1;. 
1ade0 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1adf0 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 4b  .** Given the nK
1ae00 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e 67  ey-byte encoding
1ae10 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e 20   of a record in 
1ae20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74 65  pKey[], populate
1ae30 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b 65   the .** Unpacke
1ae40 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72  dRecord structur
1ae50 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20 74  e indicated by t
1ae60 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d 65  he fourth argume
1ae70 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 63  nt with the.** c
1ae80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
1ae90 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a 2a  ecoded record..*
1aea0 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  / .void sqlite3V
1aeb0 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b 28  dbeRecordUnpack(
1aec0 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  .  KeyInfo *pKey
1aed0 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e 66  Info,     /* Inf
1aee0 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
1aef0 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61 74  he record format
1af00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20   */.  int nKey, 
1af10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1af20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e 61  Size of the bina
1af30 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ry record */.  c
1af40 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
1af50 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69 6e        /* The bin
1af60 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1af70 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1af80 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61  p      /* Popula
1af90 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75 72  te this structur
1afa0 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1afb0 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ng. */.){.  cons
1afc0 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1afd0 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75  *aKey = (const u
1afe0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70  nsigned char *)p
1aff0 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a 20  Key;.  int d; . 
1b000 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20 20   u32 idx;       
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61 4b   /* Offset in aK
1b030 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72 6f  ey[] to read fro
1b040 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20 20  m */.  u16 u;   
1b050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b060 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e         /* Unsign
1b070 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  ed loop counter 
1b080 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a  */.  u32 szHdr;.
1b090 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70 2d    Mem *pMem = p-
1b0a0 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65 66  >aMem;..  p->def
1b0b0 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20 61  ault_rc = 0;.  a
1b0c0 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54  ssert( EIGHT_BYT
1b0d0 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65 6d  E_ALIGNMENT(pMem
1b0e0 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  ) );.  idx = get
1b0f0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1b100 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a 48  zHdr);.  d = szH
1b110 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20 77  dr;.  u = 0;.  w
1b120 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72 20  hile( idx<szHdr 
1b130 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20 20  && d<=nKey ){.  
1b140 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70    u32 serial_typ
1b150 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20 67  e;..    idx += g
1b160 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
1b170 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74 79  [idx], serial_ty
1b180 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 65  pe);.    pMem->e
1b190 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1b1a0 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64 62  nc;.    pMem->db
1b1b0 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b   = pKeyInfo->db;
1b1c0 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66 6c  .    /* pMem->fl
1b1d0 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c 69  ags = 0; // sqli
1b1e0 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1b1f0 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69 73  () will set this
1b200 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20 70   for us */.    p
1b210 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20  Mem->szMalloc = 
1b220 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  0;.    pMem->z =
1b230 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71 6c   0;.    d += sql
1b240 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b250 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72 69  t(&aKey[d], seri
1b260 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b 0a  al_type, pMem);.
1b270 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20 20      pMem++;.    
1b280 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e 46  if( (++u)>=p->nF
1b290 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20 20  ield ) break;.  
1b2a0 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d 70  }.  assert( u<=p
1b2b0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20  KeyInfo->nField 
1b2c0 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69 65  + 1 );.  p->nFie
1b2d0 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20 53  ld = u;.}..#if S
1b2e0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
1b2f0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1b300 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e 64  compares two ind
1b310 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63 6f  ex or table reco
1b320 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20 73  rd keys in the s
1b330 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74 68  ame way.** as th
1b340 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  e sqlite3VdbeRec
1b350 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f 75  ordCompare() rou
1b360 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64 62  tine. Unlike Vdb
1b370 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
1b380 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  ,.** this functi
1b390 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20  on deserializes 
1b3a0 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61 6c  and compares val
1b3b0 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a  ues using the.**
1b3c0 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1b3d0 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  alGet() and sqli
1b3e0 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29 20  te3MemCompare() 
1b3f0 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69 73  functions. It is
1b400 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73 65   used.** in asse
1b410 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
1b420 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
1b430 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f 64  he optimized cod
1b440 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 56  e in.** sqlite3V
1b450 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1b460 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75 6c  () returns resul
1b470 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74 77  ts with these tw
1b480 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a 2a  o primitives..**
1b490 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
1b4a0 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  if the result of
1b4b0 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 65   comparison is e
1b4c0 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65 73  quivalent to des
1b4d0 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20 52  iredResult..** R
1b4e0 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20 74  eturn false if t
1b4f0 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67 72  here is a disagr
1b500 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  eement..*/.stati
1b510 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64  c int vdbeRecord
1b520 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20 20  CompareDebug(.  
1b530 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1b540 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a   void *pKey1, /*
1b550 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 63   Left key */.  c
1b560 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65 63  onst UnpackedRec
1b570 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a 20  ord *pPKey2, /* 
1b580 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1b590 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c 74  nt desiredResult
1b5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b5b0 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20 2a  Correct answer *
1b5c0 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20 20  /.){.  u32 d1;  
1b5d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
1b5e0 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20  set into aKey[] 
1b5f0 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65  of next data ele
1b600 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69 64  ment */.  u32 id
1b610 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  x1;          /* 
1b620 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79  Offset into aKey
1b630 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64 65  [] of next heade
1b640 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20 75  r element */.  u
1b650 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1b660 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
1b670 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20 2a  ytes in header *
1b680 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  /.  int i = 0;. 
1b690 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63   int rc = 0;.  c
1b6a0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
1b6b0 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e  ar *aKey1 = (con
1b6c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b6d0 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79 49   *)pKey1;.  KeyI
1b6e0 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a 20  nfo *pKeyInfo;. 
1b6f0 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70 4b   Mem mem1;..  pK
1b700 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d  eyInfo = pPKey2-
1b710 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66 28  >pKeyInfo;.  if(
1b720 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 30   pKeyInfo->db==0
1b730 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 6d   ) return 1;.  m
1b740 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49 6e  em1.enc = pKeyIn
1b750 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31 2e  fo->enc;.  mem1.
1b760 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64  db = pKeyInfo->d
1b770 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c 61  b;.  /* mem1.fla
1b780 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c 6c  gs = 0;  // Will
1b790 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   be initialized 
1b7a0 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  by sqlite3VdbeSe
1b7b0 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20 56  rialGet() */.  V
1b7c0 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73 7a  VA_ONLY( mem1.sz
1b7d0 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f 2a  Malloc = 0; ) /*
1b7e0 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79 20   Only needed by 
1b7f0 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
1b800 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f 6d  nts */..  /* Com
1b810 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70 6c  pilers may compl
1b820 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75 2e  ain that mem1.u.
1b830 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c 79  i is potentially
1b840 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a   uninitialized..
1b850 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69 6e    ** We could in
1b860 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73 20  itialize it, as 
1b870 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20 73  shown here, to s
1b880 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f 6d  ilence those com
1b890 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42 75  plaints..  ** Bu
1b8a0 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31 2e  t in fact, mem1.
1b8b0 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20 61  u.i will never a
1b8c0 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64 20  ctually be used 
1b8d0 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 61  uninitialized, a
1b8e0 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20 74  nd doing .  ** t
1b8f0 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20 69  he unnecessary i
1b900 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68 61  nitialization ha
1b910 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20 6e  s a measurable n
1b920 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d 61  egative performa
1b930 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74 2c  nce.  ** impact,
1b940 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75 74   since this rout
1b950 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68 69  ine is a very hi
1b960 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64 20  gh runner.  And 
1b970 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20 20  so, we choose.  
1b980 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  ** to ignore the
1b990 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e   compiler warnin
1b9a0 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68 69  gs and leave thi
1b9b0 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e 69  s variable unini
1b9c0 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20  tialized..  */. 
1b9d0 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d 20   /*  mem1.u.i = 
1b9e0 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64 65  0;  // not neede
1b9f0 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65 6e  d, here to silen
1ba00 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e  ce compiler warn
1ba10 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78 31  ing */.  .  idx1
1ba20 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1ba30 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1ba40 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33 30   if( szHdr1>9830
1ba50 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  7 ) return SQLIT
1ba60 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31 20  E_CORRUPT;.  d1 
1ba70 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73 65  = szHdr1;.  asse
1ba80 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  rt( pKeyInfo->nF
1ba90 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ield+pKeyInfo->n
1baa0 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1bab0 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55 50  nField || CORRUP
1bac0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1bad0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1bae0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1baf0 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1bb00 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1bb10 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1bb20 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1bb30 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1bb40 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31 3b  32 serial_type1;
1bb50 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
1bb60 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20 66  e serial types f
1bb70 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65 6d  or the next elem
1bb80 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79 2e  ent in each key.
1bb90 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d 20   */.    idx1 += 
1bba0 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b 65  getVarint32( aKe
1bbb0 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c 5f  y1+idx1, serial_
1bbc0 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f 2a  type1 );..    /*
1bbd0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
1bbe0 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65 79  re is enough key
1bbf0 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e 67   space remaining
1bc00 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a 2a   to avoid.    **
1bc10 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72 65   a buffer overre
1bc20 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65 72  ad.  The "d1+ser
1bc30 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75 62  ial_type1+2" sub
1bc40 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 0a  expression will.
1bc50 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62 65      ** always be
1bc60 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72   greater than or
1bc70 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61 6d   equal to the am
1bc80 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65 64  ount of required
1bc90 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20 20   key space..    
1bca0 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70 72  ** Use that appr
1bcb0 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76 6f  oximation to avo
1bcc0 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70 65  id the more expe
1bcd0 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20 20  nsive call to.  
1bce0 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65    ** sqlite3Vdbe
1bcf0 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29 20  SerialTypeLen() 
1bd00 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1bd10 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  se..    */.    i
1bd20 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79 70  f( d1+serial_typ
1bd30 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31 0a  e1+2>(u32)nKey1.
1bd40 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69 74       && d1+sqlit
1bd50 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1bd60 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 31  Len(serial_type1
1bd70 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20 20  )>(u32)nKey1 .  
1bd80 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b    ){.      break
1bd90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1bda0 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c 75  Extract the valu
1bdb0 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72 65  es to be compare
1bdc0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 31  d..    */.    d1
1bdd0 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53   += sqlite3VdbeS
1bde0 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b  erialGet(&aKey1[
1bdf0 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  d1], serial_type
1be00 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20 20  1, &mem1);..    
1be10 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61 72  /* Do the compar
1be20 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ison.    */.    
1be30 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d 43  rc = sqlite3MemC
1be40 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26 70  ompare(&mem1, &p
1be50 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c 20  PKey2->aMem[i], 
1be60 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b  pKeyInfo->aColl[
1be70 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  i]);.    if( rc!
1be80 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1be90 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  rt( mem1.szMallo
1bea0 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65 20  c==0 );  /* See 
1beb0 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a 2f  comment below */
1bec0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
1bed0 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
1bee0 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  i] ){.        rc
1bef0 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76 65   = -rc;  /* Inve
1bf00 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66 6f  rt the result fo
1bf10 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64 65  r DESC sort orde
1bf20 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  r. */.      }.  
1bf30 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43 6f      goto debugCo
1bf40 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d 0a  mpareEnd;.    }.
1bf50 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69 6c      i++;.  }whil
1bf60 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20 26  e( idx1<szHdr1 &
1bf70 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65  & i<pPKey2->nFie
1bf80 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d  ld );..  /* No m
1bf90 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
1bfa0 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f 6e   is ever used on
1bfb0 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74 68   mem1.  Prove th
1bfc0 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68  is using.  ** th
1bfd0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65  e following asse
1bfe0 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61 73  rt().  If the as
1bff0 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69 74  sert() fails, it
1c000 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20 2a   indicates a.  *
1c010 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e  * memory leak an
1c020 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  d a need to call
1c030 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52   sqlite3VdbeMemR
1c040 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a 20  elease(&mem1).. 
1c050 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d 65   */.  assert( me
1c060 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29  m1.szMalloc==0 )
1c070 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68 65  ;..  /* rc==0 he
1c080 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f 6e  re means that on
1c090 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72 61  e of the keys ra
1c0a0 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73 20  n out of fields 
1c0b0 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68 65  and.  ** all the
1c0c0 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74 68   fields up to th
1c0d0 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65 71  at point were eq
1c0e0 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65 20  ual. Return the 
1c0f0 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a 20  default_rc.  ** 
1c100 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63 20  value.  */.  rc 
1c110 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
1c120 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d 70  t_rc;..debugComp
1c130 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64 65  areEnd:.  if( de
1c140 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20 26  siredResult==0 &
1c150 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72 6e  & rc==0 ) return
1c160 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72 65   1;.  if( desire
1c170 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63 3c  dResult<0 && rc<
1c180 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1c190 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75 6c  if( desiredResul
1c1a0 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72 65  t>0 && rc>0 ) re
1c1b0 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43 4f  turn 1;.  if( CO
1c1c0 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75 72  RRUPT_DB ) retur
1c1d0 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79 49  n 1;.  if( pKeyI
1c1e0 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1c1f0 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20 31  ailed ) return 1
1c200 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1c210 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
1c220 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 43  TE_DEBUG./*.** C
1c230 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
1c240 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e 61  of fields (a.k.a
1c250 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74 68  . columns) in th
1c260 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 62  e record given b
1c270 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e 20  y.** pKey,nKey. 
1c280 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61 74   The verify that
1c290 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20 6c   this count is l
1c2a0 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ess than or equa
1c2b0 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d 69  l to the.** limi
1c2c0 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79 49  t given by pKeyI
1c2d0 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70 4b  nfo->nField + pK
1c2e0 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 2e  eyInfo->nXField.
1c2f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 63  .**.** If this c
1c300 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f 74  onstraint is not
1c310 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20 6d   satisfied, it m
1c320 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68 69  eans that the hi
1c330 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62 65  gh-speed.** vdbe
1c340 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
1c350 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f 72  () and vdbeRecor
1c360 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28 29  dCompareString()
1c370 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a 2a   routines will.*
1c380 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65  * not work corre
1c390 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20 61  ctly.  If this a
1c3a0 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69 72  ssert() ever fir
1c3b0 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79 20  es, it probably 
1c3c0 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74 68  means.** that th
1c3d0 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64  e KeyInfo.nField
1c3e0 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46 69   or KeyInfo.nXFi
1c3f0 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65 20  eld values were 
1c400 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63 6f  computed.** inco
1c410 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74  rrectly..*/.stat
1c420 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73 65  ic void vdbeAsse
1c430 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c440 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74 20  inLimits(.  int 
1c450 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69 64  nKey, const void
1c460 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68 65   *pKey,   /* The
1c470 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69 66   record to verif
1c480 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b 65  y */ .  const Ke
1c490 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20  yInfo *pKeyInfo 
1c4a0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72 65        /* Compare
1c4b0 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73 20   size with this 
1c4c0 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20 20  KeyInfo */.){.  
1c4d0 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b 0a  int nField = 0;.
1c4e0 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20 75    u32 szHdr;.  u
1c4f0 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e 6f  32 idx;.  u32 no
1c500 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20 75  tUsed;.  const u
1c510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b  nsigned char *aK
1c520 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69  ey = (const unsi
1c530 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79 3b  gned char*)pKey;
1c540 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f  ..  if( CORRUPT_
1c550 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  DB ) return;.  i
1c560 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1c570 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1c580 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d 30   assert( nKey>=0
1c590 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
1c5a0 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20 29  Hdr<=(u32)nKey )
1c5b0 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c 73  ;.  while( idx<s
1c5c0 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78 20  zHdr ){.    idx 
1c5d0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61  += getVarint32(a
1c5e0 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65 64  Key+idx, notUsed
1c5f0 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b 3b  );.    nField++;
1c600 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
1c610 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e 66  Field <= pKeyInf
1c620 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49 6e  o->nField+pKeyIn
1c630 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a 7d  fo->nXField );.}
1c640 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
1c650 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c660 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c670 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a 0a  (A,B,C).#endif..
1c680 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65 6d  /*.** Both *pMem
1c690 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f 6e  1 and *pMem2 con
1c6a0 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c 75  tain string valu
1c6b0 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65 20  es. Compare the 
1c6c0 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75 73  two values.** us
1c6d0 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  ing the collatio
1c6e0 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c  n sequence pColl
1c6f0 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74 75  . As usual, retu
1c700 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c 20  rn a negative , 
1c710 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69 74  zero.** or posit
1c720 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70 4d  ive value if *pM
1c730 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61 6e  em1 is less than
1c740 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67 72  , equal to or gr
1c750 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20 2a  eater than .** *
1c760 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69 76  pMem2, respectiv
1c770 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e 20  ely. Similar in 
1c780 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d 20  spirit to "rc = 
1c790 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d 65  (*pMem1) - (*pMe
1c7a0 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  m2);"..*/.static
1c7b0 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72 65   int vdbeCompare
1c7c0 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f 6e  MemString(.  con
1c7d0 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a 20  st Mem *pMem1,. 
1c7e0 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d   const Mem *pMem
1c7f0 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  2,.  const CollS
1c800 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38 20  eq *pColl,.  u8 
1c810 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20 20  *prcErr         
1c820 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c830 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72 73  If an OOM occurs
1c840 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  , set to SQLITE_
1c850 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69 66  NOMEM */.){.  if
1c860 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 43  ( pMem1->enc==pC
1c870 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
1c880 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20 61  /* The strings a
1c890 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  re already in th
1c8a0 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64 69  e correct encodi
1c8b0 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20 20  ng.  Call the.  
1c8c0 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
1c8d0 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63 74   function direct
1c8e0 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ly */.    return
1c8f0 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f   pColl->xCmp(pCo
1c900 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31 2d  ll->pUser,pMem1-
1c910 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65 6d  >n,pMem1->z,pMem
1c920 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b 0a  2->n,pMem2->z);.
1c930 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1c940 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20 76   rc;.    const v
1c950 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20 20  oid *v1, *v2;.  
1c960 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20 20    int n1, n2;.  
1c970 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d 65    Mem c1;.    Me
1c980 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74 65  m c2;.    sqlite
1c990 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63 31  3VdbeMemInit(&c1
1c9a0 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45 4d  , pMem1->db, MEM
1c9b0 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c 69  _Null);.    sqli
1c9c0 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
1c9d0 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d  c2, pMem1->db, M
1c9e0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71  EM_Null);.    sq
1c9f0 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c  lite3VdbeMemShal
1ca00 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d 65  lowCopy(&c1, pMe
1ca10 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a  m1, MEM_Ephem);.
1ca20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ca30 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26 63  emShallowCopy(&c
1ca40 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45 70  2, pMem2, MEM_Ep
1ca50 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20 73  hem);.    v1 = s
1ca60 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28  qlite3ValueText(
1ca70 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29  (sqlite3_value*)
1ca80 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29  &c1, pColl->enc)
1ca90 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d 30  ;.    n1 = v1==0
1caa0 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20 20   ? 0 : c1.n;.   
1cab0 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61 6c   v2 = sqlite3Val
1cac0 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33 5f  ueText((sqlite3_
1cad0 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f 6c  value*)&c2, pCol
1cae0 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32 20  l->enc);.    n2 
1caf0 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63 32  = v2==0 ? 0 : c2
1cb00 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43 6f  .n;.    rc = pCo
1cb10 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e  ll->xCmp(pColl->
1cb20 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20 6e  pUser, n1, v1, n
1cb30 32 2c 20 76 32 29 3b 0a 20 20 20 20 69 66 28 20  2, v2);.    if( 
1cb40 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30 29  (v1==0 || v2==0)
1cb50 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70 72   && prcErr ) *pr
1cb60 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  cErr = SQLITE_NO
1cb70 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73 71  MEM_BKPT;.    sq
1cb80 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1cb90 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73 71  ase(&c1);.    sq
1cba0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1cbb0 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72 65  ase(&c2);.    re
1cbc0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a 0a  turn rc;.  }.}..
1cbd0 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74 20  /*.** The input 
1cbe0 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e 74  pBlob is guarant
1cbf0 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f 62  eed to be a Blob
1cc00 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61 72   that is not mar
1cc10 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d 5f  ked.** with MEM_
1cc20 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74 72  Zero.  Return tr
1cc30 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20 62  ue if it could b
1cc40 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a 2a  e a zero-blob..*
1cc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 41  /.static int isA
1cc60 6c 6c 5a 65 72 6f 28 63 6f 6e 73 74 20 63 68 61  llZero(const cha
1cc70 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20  r *z, int n){.  
1cc80 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1cc90 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
1cca0 20 69 66 28 20 7a 5b 69 5d 20 29 20 72 65 74 75   if( z[i] ) retu
1ccb0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
1ccc0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1ccd0 6f 6d 70 61 72 65 20 74 77 6f 20 62 6c 6f 62 73  ompare two blobs
1cce0 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74 69  .  Return negati
1ccf0 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73  ve, zero, or pos
1cd00 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69 72  itive if the fir
1cd10 73 74 0a 2a 2a 20 69 73 20 6c 65 73 73 20 74 68  st.** is less th
1cd20 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1cd30 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
1cd40 65 20 73 65 63 6f 6e 64 2c 20 72 65 73 70 65 63  e second, respec
1cd50 74 69 76 65 6c 79 2e 0a 2a 2a 20 49 66 20 6f 6e  tively..** If on
1cd60 65 20 62 6c 6f 62 20 69 73 20 61 20 70 72 65 66  e blob is a pref
1cd70 69 78 20 6f 66 20 74 68 65 20 6f 74 68 65 72 2c  ix of the other,
1cd80 20 74 68 65 6e 20 74 68 65 20 73 68 6f 72 74 65   then the shorte
1cd90 72 20 69 73 20 74 68 65 20 6c 65 73 73 6f 72 2e  r is the lessor.
1cda0 0a 2a 2f 0a 73 74 61 74 69 63 20 53 51 4c 49 54  .*/.static SQLIT
1cdb0 45 5f 4e 4f 49 4e 4c 49 4e 45 20 69 6e 74 20 73  E_NOINLINE int s
1cdc0 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70 61 72  qlite3BlobCompar
1cdd0 65 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 31  e(const Mem *pB1
1cde0 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 42 32  , const Mem *pB2
1cdf0 29 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e  ){.  int c;.  in
1ce00 74 20 6e 31 20 3d 20 70 42 31 2d 3e 6e 3b 0a 20  t n1 = pB1->n;. 
1ce10 20 69 6e 74 20 6e 32 20 3d 20 70 42 32 2d 3e 6e   int n2 = pB2->n
1ce20 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 70 6f  ;..  /* It is po
1ce30 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
1ce40 20 42 6c 6f 62 20 76 61 6c 75 65 20 74 68 61 74   Blob value that
1ce50 20 68 61 73 20 73 6f 6d 65 20 6e 6f 6e 2d 7a 65   has some non-ze
1ce60 72 6f 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a 20  ro content.  ** 
1ce70 66 6f 6c 6c 6f 77 65 64 20 62 79 20 7a 65 72 6f  followed by zero
1ce80 20 63 6f 6e 74 65 6e 74 2e 20 20 42 75 74 20 74   content.  But t
1ce90 68 61 74 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 75  hat only comes u
1cea0 70 20 66 6f 72 20 42 6c 6f 62 73 20 66 6f 72 6d  p for Blobs form
1ceb0 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20 4f  ed.  ** by the O
1cec0 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1ced0 6f 64 65 2c 20 61 6e 64 20 73 75 63 68 20 42 6c  ode, and such Bl
1cee0 6f 62 73 20 6e 65 76 65 72 20 67 65 74 20 70 61  obs never get pa
1cef0 73 73 65 64 20 69 6e 74 6f 0a 20 20 2a 2a 20 73  ssed into.  ** s
1cf00 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1cf10 28 29 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  (). */.  assert(
1cf20 20 28 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d   (pB1->flags & M
1cf30 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 6e  EM_Zero)==0 || n
1cf40 31 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  1==0 );.  assert
1cf50 28 20 28 70 42 32 2d 3e 66 6c 61 67 73 20 26 20  ( (pB2->flags & 
1cf60 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20  MEM_Zero)==0 || 
1cf70 6e 32 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  n2==0 );..  if( 
1cf80 28 70 42 31 2d 3e 66 6c 61 67 73 7c 70 42 32 2d  (pB1->flags|pB2-
1cf90 3e 66 6c 61 67 73 29 20 26 20 4d 45 4d 5f 5a 65  >flags) & MEM_Ze
1cfa0 72 6f 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  ro ){.    if( pB
1cfb0 31 2d 3e 66 6c 61 67 73 20 26 20 70 42 32 2d 3e  1->flags & pB2->
1cfc0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1cfd0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1cfe0 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20   pB1->u.nZero - 
1cff0 70 42 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20  pB2->u.nZero;.  
1d000 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 31 2d    }else if( pB1-
1d010 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72  >flags & MEM_Zer
1d020 6f 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  o ){.      if( !
1d030 69 73 41 6c 6c 5a 65 72 6f 28 70 42 32 2d 3e 7a  isAllZero(pB2->z
1d040 2c 20 70 42 32 2d 3e 6e 29 20 29 20 72 65 74 75  , pB2->n) ) retu
1d050 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1d060 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65 72 6f  urn pB1->u.nZero
1d070 20 2d 20 6e 32 3b 0a 20 20 20 20 7d 65 6c 73 65   - n2;.    }else
1d080 7b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 41  {.      if( !isA
1d090 6c 6c 5a 65 72 6f 28 70 42 31 2d 3e 7a 2c 20 70  llZero(pB1->z, p
1d0a0 42 31 2d 3e 6e 29 20 29 20 72 65 74 75 72 6e 20  B1->n) ) return 
1d0b0 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  +1;.      return
1d0c0 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65   n1 - pB2->u.nZe
1d0d0 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ro;.    }.  }.  
1d0e0 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d 3e  c = memcmp(pB1->
1d0f0 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e 32  z, pB2->z, n1>n2
1d100 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20 69   ? n2 : n1);.  i
1d110 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63 3b  f( c ) return c;
1d120 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 6e  .  return n1 - n
1d130 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61  2;.}../*.** Do a
1d140 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74 77   comparison betw
1d150 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69 67  een a 64-bit sig
1d160 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64 20  ned integer and 
1d170 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  a 64-bit floatin
1d180 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62 65  g-point.** numbe
1d190 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61 74  r.  Return negat
1d1a0 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f  ive, zero, or po
1d1b0 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66 69  sitive if the fi
1d1c0 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65 73  rst (i64) is les
1d1d0 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61 6c  s than,.** equal
1d1e0 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20   to, or greater 
1d1f0 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  than the second 
1d200 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74 61  (double)..*/.sta
1d210 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 49  tic int sqlite3I
1d220 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 69  ntFloatCompare(i
1d230 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29 7b  64 i, double r){
1d240 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c 4f  .  if( sizeof(LO
1d250 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e 38  NGDOUBLE_TYPE)>8
1d260 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55 42   ){.    LONGDOUB
1d270 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f 4e  LE_TYPE x = (LON
1d280 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b 0a  GDOUBLE_TYPE)i;.
1d290 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72 65      if( x<r ) re
1d2a0 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28  turn -1;.    if(
1d2b0 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b 31   x>r ) return +1
1d2c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1d2d0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36 34    }else{.    i64
1d2e0 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 73   y;.    double s
1d2f0 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32 32  ;.    if( r<-922
1d300 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30 38  3372036854775808
1d310 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .0 ) return +1;.
1d320 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33 37      if( r>922337
1d330 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30 20  2036854775807.0 
1d340 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20  ) return -1;.   
1d350 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20 20   y = (i64)r;.   
1d360 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75 72   if( i<y ) retur
1d370 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69 3e  n -1;.    if( i>
1d380 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 79  y ){.      if( y
1d390 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ==SMALLEST_INT64
1d3a0 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74 75   && r>0.0 ) retu
1d3b0 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74  rn -1;.      ret
1d3c0 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20 20  urn +1;.    }.  
1d3d0 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69 3b    s = (double)i;
1d3e0 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20 72  .    if( s<r ) r
1d3f0 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d400 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( s>r ) return +
1d410 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1d420 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1d430 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65 73  mpare the values
1d440 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74 68   contained by th
1d450 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65 6c  e two memory cel
1d460 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a 2a  ls, returning.**
1d470 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 20   negative, zero 
1d480 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
1d490 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1d4a0 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  n, equal to, or 
1d4b0 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e 20  greater.** than 
1d4c0 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20 6f  pMem2. Sorting o
1d4d0 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20 66  rder is NULL's f
1d4e0 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  irst, followed b
1d4f0 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65 67  y numbers (integ
1d500 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c 73  ers.** and reals
1d510 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69 63  ) sorted numeric
1d520 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20 62  ally, followed b
1d530 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20 62  y text ordered b
1d540 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 0a  y the collating.
1d550 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  ** sequence pCol
1d560 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62 6c  l and finally bl
1d570 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79 20  ob's ordered by 
1d580 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a 20  memcmp()..**.** 
1d590 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 20  Two NULL values 
1d5a0 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20 65  are considered e
1d5b0 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75 6e  qual by this fun
1d5c0 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
1d5d0 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28  lite3MemCompare(
1d5e0 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31  const Mem *pMem1
1d5f0 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65  , const Mem *pMe
1d600 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53 65  m2, const CollSe
1d610 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e 74  q *pColl){.  int
1d620 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20 63   f1, f2;.  int c
1d630 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a 0a  ombined_flags;..
1d640 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66 6c    f1 = pMem1->fl
1d650 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65 6d  ags;.  f2 = pMem
1d660 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d 62  2->flags;.  comb
1d670 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31 7c  ined_flags = f1|
1d680 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28 63  f2;.  assert( (c
1d690 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26 20  ombined_flags & 
1d6a0 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20 29  MEM_RowSet)==0 )
1d6b0 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20  ;. .  /* If one 
1d6c0 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20 69  value is NULL, i
1d6d0 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20 74  t is less than t
1d6e0 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f 74  he other. If bot
1d6f0 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61 72  h values.  ** ar
1d700 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20 30  e NULL, return 0
1d710 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1d720 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1d730 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75  Null ){.    retu
1d740 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c 29  rn (f2&MEM_Null)
1d750 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c 29   - (f1&MEM_Null)
1d760 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 6c  ;.  }..  /* At l
1d770 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 20  east one of the 
1d780 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61 20  two values is a 
1d790 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69 66  number.  */.  if
1d7a0 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73  ( combined_flags
1d7b0 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52 65  &(MEM_Int|MEM_Re
1d7c0 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20 28  al) ){.    if( (
1d7d0 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49 6e  f1 & f2 & MEM_In
1d7e0 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  t)!=0 ){.      i
1d7f0 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c 20  f( pMem1->u.i < 
1d800 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1d810 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66  urn -1;.      if
1d820 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20 70  ( pMem1->u.i > p
1d830 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74 75  Mem2->u.i ) retu
1d840 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74  rn +1;.      ret
1d850 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
1d860 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26 20   if( (f1 & f2 & 
1d870 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a  MEM_Real)!=0 ){.
1d880 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1d890 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r < pMem2->u.
1d8a0 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  r ) return -1;. 
1d8b0 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d 3e       if( pMem1->
1d8c0 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e 72  u.r > pMem2->u.r
1d8d0 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20   ) return +1;.  
1d8e0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1d8f0 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26    }.    if( (f1&
1d900 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a 20  MEM_Int)!=0 ){. 
1d910 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d       if( (f2&MEM
1d920 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20 20  _Real)!=0 ){.   
1d930 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
1d940 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61  te3IntFloatCompa
1d950 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20 70  re(pMem1->u.i, p
1d960 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  Mem2->u.r);.    
1d970 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1d980 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1d990 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1d9a0 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29 21  ( (f1&MEM_Real)!
1d9b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
1d9c0 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20  (f2&MEM_Int)!=0 
1d9d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1d9e0 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f  n -sqlite3IntFlo
1d9f0 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32 2d  atCompare(pMem2-
1da00 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e 72  >u.i, pMem1->u.r
1da10 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1da20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d          return -
1da30 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
1da40 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a  .    return +1;.
1da50 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e 65    }..  /* If one
1da60 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72 69   value is a stri
1da70 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65 72  ng and the other
1da80 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65 20   is a blob, the 
1da90 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e 0a  string is less..
1daa0 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72 65    ** If both are
1dab0 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61 72   strings, compar
1dac0 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c  e using the coll
1dad0 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 2e  ating functions.
1dae0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62  .  */.  if( comb
1daf0 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f 53  ined_flags&MEM_S
1db00 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28 66  tr ){.    if( (f
1db10 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30 20  1 & MEM_Str)==0 
1db20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1db30 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
1db40 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29 3d   (f2 & MEM_Str)=
1db50 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
1db60 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn -1;.    }..  
1db70 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31 2d    assert( pMem1-
1db80 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e 63  >enc==pMem2->enc
1db90 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e 6d   || pMem1->db->m
1dba0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
1dbb0 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1dbc0 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1dbd0 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  F8 || .         
1dbe0 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53     pMem1->enc==S
1dbf0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c  QLITE_UTF16LE ||
1dc00 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51 4c   pMem1->enc==SQL
1dc10 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 0a  ITE_UTF16BE );..
1dc20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c 61      /* The colla
1dc30 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d 75  tion sequence mu
1dc40 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61 74  st be defined at
1dc50 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76 65   this point, eve
1dc60 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20  n if.    ** the 
1dc70 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68 65  user deletes the
1dc80 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1dc90 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76 64  nce after the vd
1dca0 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20 20  be program is.  
1dcb0 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28 74    ** compiled (t
1dcc0 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77 61  his was not alwa
1dcd0 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20 20  ys the case)..  
1dce0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
1dcf0 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c 6c   !pColl || pColl
1dd00 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20 69  ->xCmp );..    i
1dd10 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  f( pColl ){.    
1dd20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f 6d    return vdbeCom
1dd30 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70 4d  pareMemString(pM
1dd40 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f 6c  em1, pMem2, pCol
1dd50 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 0);.    }.   
1dd60 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70 6f   /* If a NULL po
1dd70 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65 64  inter was passed
1dd80 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65 20   as the collate 
1dd90 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20 74  function, fall t
1dda0 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74 6f  hrough.    ** to
1ddb0 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20 61   the blob case a
1ddc0 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29 2e  nd use memcmp().
1ddd0 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20    */.  }. .  /* 
1dde0 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73 74  Both values must
1ddf0 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d 70   be blobs.  Comp
1de00 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d 70  are using memcmp
1de10 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ().  */.  return
1de20 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d 70   sqlite3BlobComp
1de30 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d 32  are(pMem1, pMem2
1de40 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  );.}.../*.** The
1de50 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
1de60 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
1de70 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65 72  unction is a ser
1de80 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a 2a  ial-type that.**
1de90 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20   corresponds to 
1dea0 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c 6c  an integer - all
1deb0 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e 20   values between 
1dec0 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69 76  1 and 9 inclusiv
1ded0 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e 20  e .** except 7. 
1dee0 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e 74  The second point
1def0 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
1df00 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74 65  ntaining an inte
1df10 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65 72  ger value.** ser
1df20 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69 6e  ialized accordin
1df30 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70 65  g to serial_type
1df40 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
1df50 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a 20  deserializes.** 
1df60 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20  and returns the 
1df70 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  value..*/.static
1df80 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64 44   i64 vdbeRecordD
1df90 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65 72  ecodeInt(u32 ser
1dfa0 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74 20  ial_type, const 
1dfb0 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33 32  u8 *aKey){.  u32
1dfc0 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43 4f   y;.  assert( CO
1dfd0 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65 72  RRUPT_DB || (ser
1dfe0 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20 73  ial_type>=1 && s
1dff0 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26 26  erial_type<=9 &&
1e000 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37 29   serial_type!=7)
1e010 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65   );.  switch( se
1e020 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20  rial_type ){.   
1e030 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61 73   case 0:.    cas
1e040 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74 63  e 1:.      testc
1e050 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38  ase( aKey[0]&0x8
1e060 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  0 );.      retur
1e070 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  n ONE_BYTE_INT(a
1e080 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20 32  Key);.    case 2
1e090 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  :.      testcase
1e0a0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e0b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
1e0c0 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  WO_BYTE_INT(aKey
1e0d0 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a 20  );.    case 3:. 
1e0e0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 61       testcase( a
1e0f0 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20  Key[0]&0x80 );. 
1e100 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52 45       return THRE
1e110 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  E_BYTE_INT(aKey)
1e120 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  ;.    case 4: {.
1e130 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e140 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e150 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f 42        y = FOUR_B
1e160 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b 0a  YTE_UINT(aKey);.
1e170 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36        return (i6
1e180 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20 20  4)*(int*)&y;.   
1e190 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b   }.    case 5: {
1e1a0 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e1b0 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e1c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46 4f  .      return FO
1e1d0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1e1e0 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31 29  y+2) + (((i64)1)
1e1f0 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f 49  <<32)*TWO_BYTE_I
1e200 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d 0a  NT(aKey);.    }.
1e210 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20 20      case 6: {.  
1e220 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55 52      u64 x = FOUR
1e230 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
1e240 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1e250 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e260 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
1e270 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
1e280 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
1e290 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34 29      return (i64)
1e2a0 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20 7d  *(i64*)&x;.    }
1e2b0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
1e2c0 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38 29  serial_type - 8)
1e2d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1e2e0 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65  function compare
1e2f0 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65 20  s the two table 
1e300 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72 65  rows or index re
1e310 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66 69  cords.** specifi
1e320 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70 4b  ed by {nKey1, pK
1e330 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32 2e  ey1} and pPKey2.
1e340 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20 6e    It returns a n
1e350 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a 2a  egative, zero.**
1e360 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e 74   or positive int
1e370 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73 20  eger if key1 is 
1e380 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1e390 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61 74   to or .** great
1e3a0 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20 54  er than key2.  T
1e3b0 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79 31  he {nKey1, pKey1
1e3c0 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20  } key must be a 
1e3d0 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64 20  blob.** created 
1e3e0 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1e3f0 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20 74  cord opcode of t
1e400 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70 50  he VDBE.  The pP
1e410 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73 74  Key2.** key must
1e420 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65 79   be a parsed key
1e430 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e 65   such as obtaine
1e440 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74 65  d from.** sqlite
1e450 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72 64  3VdbeParseRecord
1e460 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75 6d  ..**.** If argum
1e470 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f 6e  ent bSkip is non
1e480 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73 73  -zero, it is ass
1e490 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63 61  umed that the ca
1e4a0 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64 79  ller has already
1e4b0 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 74  .** determined t
1e4c0 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66 69  hat the first fi
1e4d0 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79 73  elds of the keys
1e4e0 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a 2a   are equal..**.*
1e4f0 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32 20  * Key1 and Key2 
1e500 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 63  do not have to c
1e510 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20  ontain the same 
1e520 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64 73  number of fields
1e530 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69 65  . If all .** fie
1e540 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72 20  lds that appear 
1e550 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72 65  in both keys are
1e560 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50 4b   equal, then pPK
1e570 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20  ey2->default_rc 
1e580 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e  is .** returned.
1e590 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62 61  .**.** If databa
1e5a0 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73  se corruption is
1e5b0 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65 74   discovered, set
1e5c0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1e5d0 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 43   to .** SQLITE_C
1e5e0 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75 72  ORRUPT and retur
1e5f0 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20 65  n 0. If an OOM e
1e600 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65  rror is encounte
1e610 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32 2d  red, .** pPKey2-
1e620 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 20  >errCode is set 
1e630 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  to SQLITE_NOMEM 
1e640 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e 6f  and, if it is no
1e650 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20 6d  t NULL, the.** m
1e660 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61  alloc-failed fla
1e670 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61 73  g set on databas
1e680 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79 32  e handle (pPKey2
1e690 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29 2e  ->pKeyInfo->db).
1e6a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
1e6b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1e6c0 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74 20  WithSkip(.  int 
1e6d0 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69  nKey1, const voi
1e6e0 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20 4c  d *pKey1,   /* L
1e6f0 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70  eft key */.  Unp
1e700 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1e710 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ey2,         /* 
1e720 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20 69  Right key */.  i
1e730 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20 20  nt bSkip        
1e740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e750 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70 20  * If true, skip 
1e760 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
1e770 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1e780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e790 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1e7a0 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66  t into aKey[] of
1e7b0 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d 65   next data eleme
1e7c0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1e7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
1e7f0 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20 74   of next field t
1e800 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20 75  o compare */.  u
1e810 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20 20  32 szHdr1;      
1e820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e830 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72 64  * Size of record
1e840 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65 73   header in bytes
1e850 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b 20   */.  u32 idx1; 
1e860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e870 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20        /* Offset 
1e880 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69 6e  of first type in
1e890 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
1e8a0 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e8c0 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
1e8d0 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70 50    Mem *pRhs = pP
1e8e0 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20 20  Key2->aMem;     
1e8f0 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64 20    /* Next field 
1e900 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f 6d  of pPKey2 to com
1e910 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e 66  pare */.  KeyInf
1e920 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70 50  o *pKeyInfo = pP
1e930 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a  Key2->pKeyInfo;.
1e940 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
1e950 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28   char *aKey1 = (
1e960 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1e970 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4d  har *)pKey1;.  M
1e980 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20 49  em mem1;..  /* I
1e990 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65 2c  f bSkip is true,
1e9a0 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65 72   then the caller
1e9b0 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65 74   has already det
1e9c0 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65  ermined that the
1e9d0 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f 20   first.  ** two 
1e9e0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
1e9f0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e 20  keys are equal. 
1ea00 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73 20  Fix the various 
1ea10 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73 20  stack variables 
1ea20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 69  so.  ** that thi
1ea30 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e 73  s routine begins
1ea40 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74 68   comparing at th
1ea50 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e 20  e second field. 
1ea60 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20 29  */.  if( bSkip )
1ea70 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20 20  {.    u32 s1;.  
1ea80 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65 74    idx1 = 1 + get
1ea90 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b  Varint32(&aKey1[
1eaa0 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a 48  1], s1);.    szH
1eab0 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a  dr1 = aKey1[0];.
1eac0 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 20      d1 = szHdr1 
1ead0 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  + sqlite3VdbeSer
1eae0 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b 0a  ialTypeLen(s1);.
1eaf0 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20 70      i = 1;.    p
1eb00 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Rhs++;.  }else{.
1eb10 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56 61      idx1 = getVa
1eb20 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1eb30 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d 20  Hdr1);.    d1 = 
1eb40 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28 20  szHdr1;.    if( 
1eb50 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65  d1>(unsigned)nKe
1eb60 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50 4b  y1 ){ .      pPK
1eb70 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20 28  ey2->errCode = (
1eb80 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  u8)SQLITE_CORRUP
1eb90 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72 65  T_BKPT;.      re
1eba0 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72 72  turn 0;  /* Corr
1ebb0 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a  uption */.    }.
1ebc0 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a 0a      i = 0;.  }..
1ebd0 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31    VVA_ONLY( mem1
1ebe0 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29  .szMalloc = 0; )
1ebf0 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20   /* Only needed 
1ec00 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61 74  by assert() stat
1ec10 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73 65  ements */.  asse
1ec20 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79  rt( pPKey2->pKey
1ec30 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50 4b  Info->nField+pPK
1ec40 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ey2->pKeyInfo->n
1ec50 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d 3e  XField>=pPKey2->
1ec60 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20 7c  nField .       |
1ec70 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1ec80 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79 32    assert( pPKey2
1ec90 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ->pKeyInfo->aSor
1eca0 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20 61  tOrder!=0 );.  a
1ecb0 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70  ssert( pPKey2->p
1ecc0 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1ecd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1ece0 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1ecf0 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1ed00 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1ed10 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a 20  l_type;..    /* 
1ed20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67 65  RHS is an intege
1ed30 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52 68  r */.    if( pRh
1ed40 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 49  s->flags & MEM_I
1ed50 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72 69  nt ){.      seri
1ed60 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31 5b  al_type = aKey1[
1ed70 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65 73  idx1];.      tes
1ed80 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74 79  tcase( serial_ty
1ed90 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20 20  pe==12 );.      
1eda0 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e  if( serial_type>
1edb0 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  =10 ){.        r
1edc0 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65  c = +1;.      }e
1edd0 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f 74  lse if( serial_t
1ede0 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ype==0 ){.      
1edf0 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1ee00 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61   }else if( seria
1ee10 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1ee20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1ee30 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1ee40 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1ee50 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20  e, &mem1);.     
1ee60 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65 33     rc = -sqlite3
1ee70 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1ee80 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31 2e  pRhs->u.i, mem1.
1ee90 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  u.r);.      }els
1eea0 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6c  e{.        i64 l
1eeb0 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64 44  hs = vdbeRecordD
1eec0 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c 5f  ecodeInt(serial_
1eed0 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31 5d  type, &aKey1[d1]
1eee0 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20 72  );.        i64 r
1eef0 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b 0a  hs = pRhs->u.i;.
1ef00 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73 3c          if( lhs<
1ef10 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1ef20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20   rc = -1;.      
1ef30 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73 3e    }else if( lhs>
1ef40 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rhs ){.         
1ef50 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1ef60 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ef70 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73  }..    /* RHS is
1ef80 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c 73   real */.    els
1ef90 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1efa0 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  s & MEM_Real ){.
1efb0 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70        serial_typ
1efc0 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b  e = aKey1[idx1];
1efd0 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1efe0 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20 20  l_type>=10 ){.  
1eff0 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20        /* Serial 
1f000 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65 61  types 12 or grea
1f010 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73 20  ter are strings 
1f020 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61 74  and blobs (great
1f030 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20 20  er than.        
1f040 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79 70  ** numbers). Typ
1f050 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72 65  es 10 and 11 are
1f060 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73 65   currently "rese
1f070 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65 20  rved for future 
1f080 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65 22  .        ** use"
1f090 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20  , so it doesn't 
1f0a0 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77 68  really matter wh
1f0b0 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  at the results o
1f0c0 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20 20  f comparing.    
1f0d0 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20 6e      ** them to n
1f0e0 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20 61  umberic values a
1f0f0 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  re.  */.        
1f100 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1f110 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1f120 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1f130 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f140 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f150 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69   sqlite3VdbeSeri
1f160 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31 5d  alGet(&aKey1[d1]
1f170 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26  , serial_type, &
1f180 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20 69  mem1);.        i
1f190 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1f1a0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  7 ){.          i
1f1b0 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68 73  f( mem1.u.r<pRhs
1f1c0 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1f1d0 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20       rc = -1;.  
1f1e0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
1f1f0 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73 2d  ( mem1.u.r>pRhs-
1f200 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20 20  >u.r ){.        
1f210 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1f240 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e    rc = sqlite3In
1f250 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d 65  tFloatCompare(me
1f260 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75 2e  m1.u.i, pRhs->u.
1f270 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
1f280 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f290 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74 72   /* RHS is a str
1f2a0 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65 20  ing */.    else 
1f2b0 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73 20  if( pRhs->flags 
1f2c0 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20 20  & MEM_Str ){.   
1f2d0 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28 26     getVarint32(&
1f2e0 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65 72  aKey1[idx1], ser
1f2f0 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 20  ial_type);.     
1f300 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69 61   testcase( seria
1f310 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20  l_type==12 );.  
1f320 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74      if( serial_t
1f330 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20 20  ype<12 ){.      
1f340 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f350 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65 72   }else if( !(ser
1f360 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31 29  ial_type & 0x01)
1f370 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1f380 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   +1;.      }else
1f390 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 6e  {.        mem1.n
1f3a0 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 20   = (serial_type 
1f3b0 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 20  - 12) / 2;.     
1f3c0 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64 31     testcase( (d1
1f3d0 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69 67  +mem1.n)==(unsig
1f3e0 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20  ned)nKey1 );.   
1f3f0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
1f400 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28 75  d1+mem1.n+1)==(u
1f410 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b  nsigned)nKey1 );
1f420 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31  .        if( (d1
1f430 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73 69  +mem1.n) > (unsi
1f440 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20  gned)nKey1 ){.  
1f450 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
1f460 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51  errCode = (u8)SQ
1f470 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f480 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  T;.          ret
1f490 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20  urn 0;          
1f4a0 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74        /* Corrupt
1f4b0 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d  ion */.        }
1f4c0 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e 66  else if( pKeyInf
1f4d0 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a 20  o->aColl[i] ){. 
1f4e0 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65 6e           mem1.en
1f4f0 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e  c = pKeyInfo->en
1f500 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  c;.          mem
1f510 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d  1.db = pKeyInfo-
1f520 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  >db;.          m
1f530 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em1.flags = MEM_
1f540 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6d  Str;.          m
1f550 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29 26  em1.z = (char*)&
1f560 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20 20  aKey1[d1];.     
1f570 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43 6f       rc = vdbeCo
1f580 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 0a  mpareMemString(.
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 6d                &m
1f5a0 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79 49  em1, pRhs, pKeyI
1f5b0 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20 26  nfo->aColl[i], &
1f5c0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 0a  pPKey2->errCode.
1f5d0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
1f5e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1f5f0 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d        int nCmp =
1f600 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52 68   MIN(mem1.n, pRh
1f610 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  s->n);.         
1f620 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b   rc = memcmp(&aK
1f630 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a  ey1[d1], pRhs->z
1f640 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20 20  , nCmp);.       
1f650 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20 72     if( rc==0 ) r
1f660 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52 68  c = mem1.n - pRh
1f670 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20 7d  s->n; .        }
1f680 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1f690 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20      /* RHS is a 
1f6a0 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73 65  blob */.    else
1f6b0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1f6c0 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20   & MEM_Blob ){. 
1f6d0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 52       assert( (pR
1f6e0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f6f0 5a 65 72 6f 29 3d 3d 30 20 7c 7c 20 70 52 68 73  Zero)==0 || pRhs
1f700 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ->n==0 );.      
1f710 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1f720 79 31 5b 69 64 78 31 5d 2c 20 73 65 72 69 61 6c  y1[idx1], serial
1f730 5f 74 79 70 65 29 3b 0a 20 20 20 20 20 20 74 65  _type);.      te
1f740 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1f750 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1f760 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1f770 3c 31 32 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74  <12 || (serial_t
1f780 79 70 65 20 26 20 30 78 30 31 29 20 29 7b 0a 20  ype & 0x01) ){. 
1f790 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a         rc = -1;.
1f7a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f7b0 20 20 20 20 20 69 6e 74 20 6e 53 74 72 20 3d 20       int nStr = 
1f7c0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 31  (serial_type - 1
1f7d0 32 29 20 2f 20 32 3b 0a 20 20 20 20 20 20 20 20  2) / 2;.        
1f7e0 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1f7f0 74 72 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e  tr)==(unsigned)n
1f800 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20 20  Key1 );.        
1f810 74 65 73 74 63 61 73 65 28 20 28 64 31 2b 6e 53  testcase( (d1+nS
1f820 74 72 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64  tr+1)==(unsigned
1f830 29 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20  )nKey1 );.      
1f840 20 20 69 66 28 20 28 64 31 2b 6e 53 74 72 29 20    if( (d1+nStr) 
1f850 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  > (unsigned)nKey
1f860 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  1 ){.          p
1f870 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d  PKey2->errCode =
1f880 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52   (u8)SQLITE_CORR
1f890 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
1f8a0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20      return 0;   
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f8c0 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  Corruption */.  
1f8d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1f8e0 70 52 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pRhs->flags & ME
1f8f0 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
1f900 20 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65      if( !isAllZe
1f910 72 6f 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  ro((const char*)
1f920 26 61 4b 65 79 31 5b 64 31 5d 2c 6e 53 74 72 29  &aKey1[d1],nStr)
1f930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f940 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
1f950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f960 20 20 20 20 20 72 63 20 3d 20 6e 53 74 72 20 2d       rc = nStr -
1f970 20 70 52 68 73 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a   pRhs->u.nZero;.
1f980 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f990 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f9a0 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20       int nCmp = 
1f9b0 4d 49 4e 28 6e 53 74 72 2c 20 70 52 68 73 2d 3e  MIN(nStr, pRhs->
1f9c0 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  n);.          rc
1f9d0 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
1f9e0 5b 64 31 5d 2c 20 70 52 68 73 2d 3e 7a 2c 20 6e  [d1], pRhs->z, n
1f9f0 43 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Cmp);.          
1fa00 69 66 28 20 72 63 3d 3d 30 20 29 20 72 63 20 3d  if( rc==0 ) rc =
1fa10 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 6e 3b   nStr - pRhs->n;
1fa20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1fa30 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
1fa40 20 52 48 53 20 69 73 20 6e 75 6c 6c 20 2a 2f 0a   RHS is null */.
1fa50 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
1fa60 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b  serial_type = aK
1fa70 65 79 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20  ey1[idx1];.     
1fa80 20 72 63 20 3d 20 28 73 65 72 69 61 6c 5f 74 79   rc = (serial_ty
1fa90 70 65 21 3d 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  pe!=0);.    }.. 
1faa0 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1fab0 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49 6e        if( pKeyIn
1fac0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 69  fo->aSortOrder[i
1fad0 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ] ){.        rc 
1fae0 3d 20 2d 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = -rc;.      }. 
1faf0 20 20 20 20 20 61 73 73 65 72 74 28 20 76 64 62       assert( vdb
1fb00 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65  eRecordCompareDe
1fb10 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  bug(nKey1, pKey1
1fb20 2c 20 70 50 4b 65 79 32 2c 20 72 63 29 20 29 3b  , pPKey2, rc) );
1fb30 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6d  .      assert( m
1fb40 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1fb50 29 3b 20 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65  );  /* See comme
1fb60 6e 74 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20  nt below */.    
1fb70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1fb80 20 7d 0a 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 20   }..    i++;.   
1fb90 20 70 52 68 73 2b 2b 3b 0a 20 20 20 20 64 31 20   pRhs++;.    d1 
1fba0 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  += sqlite3VdbeSe
1fbb0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1fbc0 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20 69 64  al_type);.    id
1fbd0 78 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 61 72  x1 += sqlite3Var
1fbe0 69 6e 74 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79  intLen(serial_ty
1fbf0 70 65 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 69  pe);.  }while( i
1fc00 64 78 31 3c 28 75 6e 73 69 67 6e 65 64 29 73 7a  dx1<(unsigned)sz
1fc10 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65 79 32  Hdr1 && i<pPKey2
1fc20 2d 3e 6e 46 69 65 6c 64 20 26 26 20 64 31 3c 3d  ->nField && d1<=
1fc30 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20  (unsigned)nKey1 
1fc40 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 65 6d 6f  );..  /* No memo
1fc50 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 69 73  ry allocation is
1fc60 20 65 76 65 72 20 75 73 65 64 20 6f 6e 20 6d 65   ever used on me
1fc70 6d 31 2e 20 20 50 72 6f 76 65 20 74 68 69 73 20  m1.  Prove this 
1fc80 75 73 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 66  using.  ** the f
1fc90 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 28  ollowing assert(
1fca0 29 2e 20 20 49 66 20 74 68 65 20 61 73 73 65 72  ).  If the asser
1fcb0 74 28 29 20 66 61 69 6c 73 2c 20 69 74 20 69 6e  t() fails, it in
1fcc0 64 69 63 61 74 65 73 20 61 0a 20 20 2a 2a 20 6d  dicates a.  ** m
1fcd0 65 6d 6f 72 79 20 6c 65 61 6b 20 61 6e 64 20 61  emory leak and a
1fce0 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 20 73 71   need to call sq
1fcf0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
1fd00 61 73 65 28 26 6d 65 6d 31 29 2e 20 20 2a 2f 0a  ase(&mem1).  */.
1fd10 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31 2e 73    assert( mem1.s
1fd20 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20  zMalloc==0 );.. 
1fd30 20 2f 2a 20 72 63 3d 3d 30 20 68 65 72 65 20 6d   /* rc==0 here m
1fd40 65 61 6e 73 20 74 68 61 74 20 6f 6e 65 20 6f 72  eans that one or
1fd50 20 62 6f 74 68 20 6f 66 20 74 68 65 20 6b 65 79   both of the key
1fd60 73 20 72 61 6e 20 6f 75 74 20 6f 66 20 66 69 65  s ran out of fie
1fd70 6c 64 73 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c  lds and.  ** all
1fd80 20 74 68 65 20 66 69 65 6c 64 73 20 75 70 20 74   the fields up t
1fd90 6f 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 72  o that point wer
1fda0 65 20 65 71 75 61 6c 2e 20 52 65 74 75 72 6e 20  e equal. Return 
1fdb0 74 68 65 20 64 65 66 61 75 6c 74 5f 72 63 0a 20  the default_rc. 
1fdc0 20 2a 2a 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20   ** value.  */. 
1fdd0 20 61 73 73 65 72 74 28 20 43 4f 52 52 55 50 54   assert( CORRUPT
1fde0 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 76  _DB .       || v
1fdf0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1fe00 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
1fe10 79 31 2c 20 70 50 4b 65 79 32 2c 20 70 50 4b 65  y1, pPKey2, pPKe
1fe20 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63 29 20  y2->default_rc) 
1fe30 0a 20 20 20 20 20 20 20 7c 7c 20 70 4b 65 79 49  .       || pKeyI
1fe40 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  nfo->db->mallocF
1fe50 61 69 6c 65 64 0a 20 20 29 3b 0a 20 20 70 50 4b  ailed.  );.  pPK
1fe60 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d 20 31 3b  ey2->eqSeen = 1;
1fe70 0a 20 20 72 65 74 75 72 6e 20 70 50 4b 65 79 32  .  return pPKey2
1fe80 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 7d 0a  ->default_rc;.}.
1fe90 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
1fea0 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 0a 20 20  ecordCompare(.  
1feb0 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
1fec0 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 20 20   void *pKey1,   
1fed0 2f 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20  /* Left key */. 
1fee0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1fef0 2a 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 20  *pPKey2         
1ff00 20 2f 2a 20 52 69 67 68 74 20 6b 65 79 20 2a 2f   /* Right key */
1ff10 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
1ff20 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
1ff30 6d 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b  mpareWithSkip(nK
1ff40 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1ff50 79 32 2c 20 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  y2, 0);.}.../*.*
1ff60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1ff70 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20  is an optimized 
1ff80 76 65 72 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74  version of sqlit
1ff90 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
1ffa0 61 72 65 28 29 20 0a 2a 2a 20 74 68 61 74 20 28  are() .** that (
1ffb0 61 29 20 74 68 65 20 66 69 72 73 74 20 66 69 65  a) the first fie
1ffc0 6c 64 20 6f 66 20 70 50 4b 65 79 32 20 69 73 20  ld of pPKey2 is 
1ffd0 61 6e 20 69 6e 74 65 67 65 72 2c 20 61 6e 64 20  an integer, and 
1ffe0 28 62 29 20 74 68 65 20 0a 2a 2a 20 73 69 7a 65  (b) the .** size
1fff0 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69 6e  -of-header varin
20000 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
20010 66 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  f (pKey1/nKey1) 
20020 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
20030 0a 2a 2a 20 62 79 74 65 20 28 69 2e 65 2e 20 69  .** byte (i.e. i
20040 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 29  s less than 128)
20050 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64  ..**.** To avoid
20060 20 63 6f 6e 63 65 72 6e 73 20 61 62 6f 75 74 20   concerns about 
20070 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
20080 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20090 73 20 6f 6e 6c 79 20 75 73 65 64 0a 2a 2a 20 6f  s only used.** o
200a0 6e 20 73 63 68 65 6d 61 73 20 77 68 65 72 65 20  n schemas where 
200b0 74 68 65 20 6d 61 78 69 6d 75 6d 20 76 61 6c 69  the maximum vali
200c0 64 20 68 65 61 64 65 72 20 73 69 7a 65 20 69 73  d header size is
200d0 20 36 33 20 62 79 74 65 73 20 6f 72 20 6c 65 73   63 bytes or les
200e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
200f0 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61   vdbeRecordCompa
20100 72 65 49 6e 74 28 0a 20 20 69 6e 74 20 6e 4b 65  reInt(.  int nKe
20110 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
20120 70 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b  pKey1, /* Left k
20130 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ey */.  Unpacked
20140 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20  Record *pPKey2  
20150 20 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b        /* Right k
20160 65 79 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ey */.){.  const
20170 20 75 38 20 2a 61 4b 65 79 20 3d 20 26 28 28 63   u8 *aKey = &((c
20180 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31 29 5b  onst u8*)pKey1)[
20190 2a 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79  *(const u8*)pKey
201a0 31 20 26 20 30 78 33 46 5d 3b 0a 20 20 69 6e 74  1 & 0x3F];.  int
201b0 20 73 65 72 69 61 6c 5f 74 79 70 65 20 3d 20 28   serial_type = (
201c0 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b 65 79 31  (const u8*)pKey1
201d0 29 5b 31 5d 3b 0a 20 20 69 6e 74 20 72 65 73 3b  )[1];.  int res;
201e0 0a 20 20 75 33 32 20 79 3b 0a 20 20 75 36 34 20  .  u32 y;.  u64 
201f0 78 3b 0a 20 20 69 36 34 20 76 3b 0a 20 20 69 36  x;.  i64 v;.  i6
20200 34 20 6c 68 73 3b 0a 0a 20 20 76 64 62 65 41 73  4 lhs;..  vdbeAs
20210 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69  sertFieldCountWi
20220 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79 31  thinLimits(nKey1
20230 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2d  , pKey1, pPKey2-
20240 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 61 73  >pKeyInfo);.  as
20250 73 65 72 74 28 20 28 2a 28 75 38 2a 29 70 4b 65  sert( (*(u8*)pKe
20260 79 31 29 3c 3d 30 78 33 46 20 7c 7c 20 43 4f 52  y1)<=0x3F || COR
20270 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 73 77 69  RUPT_DB );.  swi
20280 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70 65  tch( serial_type
20290 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20   ){.    case 1: 
202a0 7b 20 2f 2a 20 31 2d 62 79 74 65 20 73 69 67 6e  { /* 1-byte sign
202b0 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20  ed integer */.  
202c0 20 20 20 20 6c 68 73 20 3d 20 4f 4e 45 5f 42 59      lhs = ONE_BY
202d0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
202e0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
202f0 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20300 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20310 73 65 20 32 3a 20 7b 20 2f 2a 20 32 2d 62 79 74  se 2: { /* 2-byt
20320 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
20330 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
20340 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
20350 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20360 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20370 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20380 20 20 20 20 63 61 73 65 20 33 3a 20 7b 20 2f 2a      case 3: { /*
20390 20 33 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   3-byte signed i
203a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
203b0 6c 68 73 20 3d 20 54 48 52 45 45 5f 42 59 54 45  lhs = THREE_BYTE
203c0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
203d0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
203e0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
203f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20400 20 34 3a 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20   4: { /* 4-byte 
20410 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20420 2f 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52  /.      y = FOUR
20430 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
20440 3b 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 28 69  ;.      lhs = (i
20450 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
20460 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68      testcase( lh
20470 73 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65  s<0 );.      bre
20480 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20490 73 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74  se 5: { /* 6-byt
204a0 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  e signed integer
204b0 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20   */.      lhs = 
204c0 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61  FOUR_BYTE_UINT(a
204d0 4b 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29  Key+2) + (((i64)
204e0 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45  1)<<32)*TWO_BYTE
204f0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20500 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20510 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20520 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20530 20 36 3a 20 7b 20 2f 2a 20 38 2d 62 79 74 65 20   6: { /* 8-byte 
20540 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20550 2f 0a 20 20 20 20 20 20 78 20 3d 20 46 4f 55 52  /.      x = FOUR
20560 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29  _BYTE_UINT(aKey)
20570 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c 3c  ;.      x = (x<<
20580 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45 5f  32) | FOUR_BYTE_
20590 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20 20  UINT(aKey+4);.  
205a0 20 20 20 20 6c 68 73 20 3d 20 2a 28 69 36 34 2a      lhs = *(i64*
205b0 29 26 78 3b 0a 20 20 20 20 20 20 74 65 73 74 63  )&x;.      testc
205c0 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20  ase( lhs<0 );.  
205d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
205e0 0a 20 20 20 20 63 61 73 65 20 38 3a 20 0a 20 20  .    case 8: .  
205f0 20 20 20 20 6c 68 73 20 3d 20 30 3b 0a 20 20 20      lhs = 0;.   
20600 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
20610 73 65 20 39 3a 0a 20 20 20 20 20 20 6c 68 73 20  se 9:.      lhs 
20620 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
20630 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 63  ;..    /* This c
20640 61 73 65 20 63 6f 75 6c 64 20 62 65 20 72 65 6d  ase could be rem
20650 6f 76 65 64 20 77 69 74 68 6f 75 74 20 63 68 61  oved without cha
20660 6e 67 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nging the result
20670 73 20 6f 66 20 72 75 6e 6e 69 6e 67 0a 20 20 20  s of running.   
20680 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 2e 20 49   ** this code. I
20690 6e 63 6c 75 64 69 6e 67 20 69 74 20 63 61 75 73  ncluding it caus
206a0 65 73 20 67 63 63 20 74 6f 20 67 65 6e 65 72 61  es gcc to genera
206b0 74 65 20 61 20 66 61 73 74 65 72 20 73 77 69 74  te a faster swit
206c0 63 68 20 0a 20 20 20 20 2a 2a 20 73 74 61 74 65  ch .    ** state
206d0 6d 65 6e 74 20 28 73 69 6e 63 65 20 74 68 65 20  ment (since the 
206e0 72 61 6e 67 65 20 6f 66 20 73 77 69 74 63 68 20  range of switch 
206f0 74 61 72 67 65 74 73 20 6e 6f 77 20 73 74 61 72  targets now star
20700 74 73 20 61 74 20 7a 65 72 6f 20 61 6e 64 0a 20  ts at zero and. 
20710 20 20 20 2a 2a 20 69 73 20 63 6f 6e 74 69 67 75     ** is contigu
20720 6f 75 73 29 20 62 75 74 20 64 6f 65 73 20 6e 6f  ous) but does no
20730 74 20 63 61 75 73 65 20 61 6e 79 20 64 75 70 6c  t cause any dupl
20740 69 63 61 74 65 20 63 6f 64 65 20 74 6f 20 62 65  icate code to be
20750 20 67 65 6e 65 72 61 74 65 64 0a 20 20 20 20 2a   generated.    *
20760 2a 20 28 61 73 20 67 63 63 20 69 73 20 63 6c 65  * (as gcc is cle
20770 76 65 72 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f  ver enough to co
20780 6d 62 69 6e 65 20 74 68 65 20 74 77 6f 20 6c 69  mbine the two li
20790 6b 65 20 63 61 73 65 73 29 2e 20 4f 74 68 65 72  ke cases). Other
207a0 20 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65   .    ** compile
207b0 72 73 20 6d 69 67 68 74 20 62 65 20 73 69 6d 69  rs might be simi
207c0 6c 61 72 2e 20 20 2a 2f 20 0a 20 20 20 20 63 61  lar.  */ .    ca
207d0 73 65 20 30 3a 20 63 61 73 65 20 37 3a 0a 20 20  se 0: case 7:.  
207e0 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
207f0 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70  e3VdbeRecordComp
20800 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  are(nKey1, pKey1
20810 2c 20 70 50 4b 65 79 32 29 3b 0a 0a 20 20 20 20  , pPKey2);..    
20820 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
20830 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
20840 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
20850 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b  Key1, pKey1, pPK
20860 65 79 32 29 3b 0a 20 20 7d 0a 0a 20 20 76 20 3d  ey2);.  }..  v =
20870 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
20880 2e 75 2e 69 3b 0a 20 20 69 66 28 20 76 3e 6c 68  .u.i;.  if( v>lh
20890 73 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70  s ){.    res = p
208a0 50 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 7d 65 6c  PKey2->r1;.  }el
208b0 73 65 20 69 66 28 20 76 3c 6c 68 73 20 29 7b 0a  se if( v<lhs ){.
208c0 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
208d0 2d 3e 72 32 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ->r2;.  }else if
208e0 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  ( pPKey2->nField
208f0 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  >1 ){.    /* The
20900 20 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66   first fields of
20910 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20 61 72   the two keys ar
20920 65 20 65 71 75 61 6c 2e 20 43 6f 6d 70 61 72 65  e equal. Compare
20930 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 0a 20   the trailing . 
20940 20 20 20 2a 2a 20 66 69 65 6c 64 73 2e 20 20 2a     ** fields.  *
20950 2f 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  /.    res = sqli
20960 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
20970 70 61 72 65 57 69 74 68 53 6b 69 70 28 6e 4b 65  pareWithSkip(nKe
20980 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79  y1, pKey1, pPKey
20990 32 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  2, 1);.  }else{.
209a0 20 20 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74      /* The first
209b0 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74   fields of the t
209c0 77 6f 20 6b 65 79 73 20 61 72 65 20 65 71 75 61  wo keys are equa
209d0 6c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  l and there are 
209e0 6e 6f 20 74 72 61 69 6c 69 6e 67 0a 20 20 20 20  no trailing.    
209f0 2a 2a 20 66 69 65 6c 64 73 2e 20 52 65 74 75 72  ** fields. Retur
20a00 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
20a10 74 5f 72 63 20 69 6e 20 74 68 69 73 20 63 61 73  t_rc in this cas
20a20 65 2e 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20  e. */.    res = 
20a30 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f  pPKey2->default_
20a40 72 63 3b 0a 20 20 20 20 70 50 4b 65 79 32 2d 3e  rc;.    pPKey2->
20a50 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 7d 0a  eqSeen = 1;.  }.
20a60 0a 20 20 61 73 73 65 72 74 28 20 76 64 62 65 52  .  assert( vdbeR
20a70 65 63 6f 72 64 43 6f 6d 70 61 72 65 44 65 62 75  ecordCompareDebu
20a80 67 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20  g(nKey1, pKey1, 
20a90 70 50 4b 65 79 32 2c 20 72 65 73 29 20 29 3b 0a  pPKey2, res) );.
20aa0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
20ab0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
20ac0 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70 74 69 6d  tion is an optim
20ad0 69 7a 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ized version of 
20ae0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20af0 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a 2a 20 74  dCompare() .** t
20b00 68 61 74 20 28 61 29 20 74 68 65 20 66 69 72 73  hat (a) the firs
20b10 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
20b20 32 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20 74  2 is a string, t
20b30 68 61 74 20 28 62 29 20 74 68 65 20 66 69 72 73  hat (b) the firs
20b40 74 20 66 69 65 6c 64 0a 2a 2a 20 75 73 65 73 20  t field.** uses 
20b50 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
20b60 71 75 65 6e 63 65 20 42 49 4e 41 52 59 20 61 6e  quence BINARY an
20b70 64 20 28 63 29 20 74 68 61 74 20 74 68 65 20 73  d (c) that the s
20b80 69 7a 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61  ize-of-header va
20b90 72 69 6e 74 20 0a 2a 2a 20 61 74 20 74 68 65 20  rint .** at the 
20ba0 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31 2f  start of (pKey1/
20bb0 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20 61  nKey1) fits in a
20bc0 20 73 69 6e 67 6c 65 20 62 79 74 65 2e 0a 2a 2f   single byte..*/
20bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
20be0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 53 74 72  RecordCompareStr
20bf0 69 6e 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31  ing(.  int nKey1
20c00 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
20c10 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65 79  ey1, /* Left key
20c20 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
20c30 63 6f 72 64 20 2a 70 50 4b 65 79 32 20 20 20 20  cord *pPKey2    
20c40 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65 79      /* Right key
20c50 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 75   */.){.  const u
20c60 38 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f 6e 73  8 *aKey1 = (cons
20c70 74 20 75 38 2a 29 70 4b 65 79 31 3b 0a 20 20 69  t u8*)pKey1;.  i
20c80 6e 74 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  nt serial_type;.
20c90 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 61 73    int res;..  as
20ca0 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 61 4d  sert( pPKey2->aM
20cb0 65 6d 5b 30 5d 2e 66 6c 61 67 73 20 26 20 4d 45  em[0].flags & ME
20cc0 4d 5f 53 74 72 20 29 3b 0a 20 20 76 64 62 65 41  M_Str );.  vdbeA
20cd0 73 73 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57  ssertFieldCountW
20ce0 69 74 68 69 6e 4c 69 6d 69 74 73 28 6e 4b 65 79  ithinLimits(nKey
20cf0 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20d00 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 67  ->pKeyInfo);.  g
20d10 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79  etVarint32(&aKey
20d20 31 5b 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  1[1], serial_typ
20d30 65 29 3b 0a 20 20 69 66 28 20 73 65 72 69 61 6c  e);.  if( serial
20d40 5f 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20  _type<12 ){.    
20d50 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
20d60 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b 65 79 31  ;      /* (pKey1
20d70 2f 6e 4b 65 79 31 29 20 69 73 20 61 20 6e 75 6d  /nKey1) is a num
20d80 62 65 72 20 6f 72 20 61 20 6e 75 6c 6c 20 2a 2f  ber or a null */
20d90 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73  .  }else if( !(s
20da0 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30  erial_type & 0x0
20db0 31 29 20 29 7b 20 0a 20 20 20 20 72 65 73 20 3d  1) ){ .    res =
20dc0 20 70 50 4b 65 79 32 2d 3e 72 32 3b 20 20 20 20   pPKey2->r2;    
20dd0 20 20 2f 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79    /* (pKey1/nKey
20de0 31 29 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  1) is a blob */.
20df0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
20e00 20 6e 43 6d 70 3b 0a 20 20 20 20 69 6e 74 20 6e   nCmp;.    int n
20e10 53 74 72 3b 0a 20 20 20 20 69 6e 74 20 73 7a 48  Str;.    int szH
20e20 64 72 20 3d 20 61 4b 65 79 31 5b 30 5d 3b 0a 0a  dr = aKey1[0];..
20e30 20 20 20 20 6e 53 74 72 20 3d 20 28 73 65 72 69      nStr = (seri
20e40 61 6c 5f 74 79 70 65 2d 31 32 29 20 2f 20 32 3b  al_type-12) / 2;
20e50 0a 20 20 20 20 69 66 28 20 28 73 7a 48 64 72 20  .    if( (szHdr 
20e60 2b 20 6e 53 74 72 29 20 3e 20 6e 4b 65 79 31 20  + nStr) > nKey1 
20e70 29 7b 0a 20 20 20 20 20 20 70 50 4b 65 79 32 2d  ){.      pPKey2-
20e80 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
20e90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20ea0 50 54 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  PT;.      return
20eb0 20 30 3b 20 20 20 20 2f 2a 20 43 6f 72 72 75 70   0;    /* Corrup
20ec0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  tion */.    }.  
20ed0 20 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 20 70 50    nCmp = MIN( pP
20ee0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 6e 2c  Key2->aMem[0].n,
20ef0 20 6e 53 74 72 20 29 3b 0a 20 20 20 20 72 65 73   nStr );.    res
20f00 20 3d 20 6d 65 6d 63 6d 70 28 26 61 4b 65 79 31   = memcmp(&aKey1
20f10 5b 73 7a 48 64 72 5d 2c 20 70 50 4b 65 79 32 2d  [szHdr], pPKey2-
20f20 3e 61 4d 65 6d 5b 30 5d 2e 7a 2c 20 6e 43 6d 70  >aMem[0].z, nCmp
20f30 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 65 73 3d  );..    if( res=
20f40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73 20  =0 ){.      res 
20f50 3d 20 6e 53 74 72 20 2d 20 70 50 4b 65 79 32 2d  = nStr - pPKey2-
20f60 3e 61 4d 65 6d 5b 30 5d 2e 6e 3b 0a 20 20 20 20  >aMem[0].n;.    
20f70 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a    if( res==0 ){.
20f80 20 20 20 20 20 20 20 20 69 66 28 20 70 50 4b 65          if( pPKe
20f90 79 32 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a  y2->nField>1 ){.
20fa0 20 20 20 20 20 20 20 20 20 20 72 65 73 20 3d 20            res = 
20fb0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
20fc0 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
20fd0 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c 20 70  (nKey1, pKey1, p
20fe0 50 4b 65 79 32 2c 20 31 29 3b 0a 20 20 20 20 20  PKey2, 1);.     
20ff0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21000 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32      res = pPKey2
21010 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20  ->default_rc;.  
21020 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e          pPKey2->
21030 65 71 53 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  eqSeen = 1;.    
21040 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
21050 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
21060 20 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b         res = pPK
21070 65 79 32 2d 3e 72 32 3b 0a 20 20 20 20 20 20 7d  ey2->r2;.      }
21080 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 65  else{.        re
21090 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31 3b 0a  s = pPKey2->r1;.
210a0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
210b0 65 20 69 66 28 20 72 65 73 3e 30 20 29 7b 0a 20  e if( res>0 ){. 
210c0 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79       res = pPKey
210d0 32 2d 3e 72 32 3b 0a 20 20 20 20 7d 65 6c 73 65  2->r2;.    }else
210e0 7b 0a 20 20 20 20 20 20 72 65 73 20 3d 20 70 50  {.      res = pP
210f0 4b 65 79 32 2d 3e 72 31 3b 0a 20 20 20 20 7d 0a  Key2->r1;.    }.
21100 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 76    }..  assert( v
21110 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21120 44 65 62 75 67 28 6e 4b 65 79 31 2c 20 70 4b 65  Debug(nKey1, pKe
21130 79 31 2c 20 70 50 4b 65 79 32 2c 20 72 65 73 29  y1, pPKey2, res)
21140 0a 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55  .       || CORRU
21150 50 54 5f 44 42 0a 20 20 20 20 20 20 20 7c 7c 20  PT_DB.       || 
21160 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f  pPKey2->pKeyInfo
21170 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
21180 65 64 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  ed.  );.  return
21190 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   res;.}../*.** R
211a0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
211b0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 56 64 62  to an sqlite3Vdb
211c0 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 29  eRecordCompare()
211d0 20 63 6f 6d 70 61 74 69 62 6c 65 20 66 75 6e 63   compatible func
211e0 74 69 6f 6e 0a 2a 2a 20 73 75 69 74 61 62 6c 65  tion.** suitable
211f0 20 66 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 73   for comparing s
21200 65 72 69 61 6c 69 7a 65 64 20 72 65 63 6f 72 64  erialized record
21210 73 20 74 6f 20 74 68 65 20 75 6e 70 61 63 6b 65  s to the unpacke
21220 64 20 72 65 63 6f 72 64 20 70 61 73 73 65 64 0a  d record passed.
21230 2a 2a 20 61 73 20 74 68 65 20 6f 6e 6c 79 20 61  ** as the only a
21240 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 52 65 63 6f  rgument..*/.Reco
21250 72 64 43 6f 6d 70 61 72 65 20 73 71 6c 69 74 65  rdCompare sqlite
21260 33 56 64 62 65 46 69 6e 64 43 6f 6d 70 61 72 65  3VdbeFindCompare
21270 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20  (UnpackedRecord 
21280 2a 70 29 7b 0a 20 20 2f 2a 20 76 61 72 69 6e 74  *p){.  /* varint
21290 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74  RecordCompareInt
212a0 28 29 20 61 6e 64 20 76 61 72 69 6e 74 52 65 63  () and varintRec
212b0 6f 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67  ordCompareString
212c0 28 29 20 62 6f 74 68 20 61 73 73 75 6d 65 0a 20  () both assume. 
212d0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 73 69 7a   ** that the siz
212e0 65 2d 6f 66 2d 68 65 61 64 65 72 20 76 61 72 69  e-of-header vari
212f0 6e 74 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  nt that occurs a
21300 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65  t the start of e
21310 61 63 68 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  ach record.  ** 
21320 66 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65  fits in a single
21330 20 62 79 74 65 20 28 69 2e 65 2e 20 69 73 20 31   byte (i.e. is 1
21340 32 37 20 6f 72 20 6c 65 73 73 29 2e 20 76 61 72  27 or less). var
21350 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  intRecordCompare
21360 49 6e 74 28 29 0a 20 20 2a 2a 20 61 6c 73 6f 20  Int().  ** also 
21370 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74 20  assumes that it 
21380 69 73 20 73 61 66 65 20 74 6f 20 6f 76 65 72 72  is safe to overr
21390 65 61 64 20 61 20 62 75 66 66 65 72 20 62 79 20  ead a buffer by 
213a0 61 74 20 6c 65 61 73 74 20 74 68 65 20 0a 20 20  at least the .  
213b0 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 6f 73 73 69  ** maximum possi
213c0 62 6c 65 20 6c 65 67 61 6c 20 68 65 61 64 65 72  ble legal header
213d0 20 73 69 7a 65 20 70 6c 75 73 20 38 20 62 79 74   size plus 8 byt
213e0 65 73 2e 20 42 65 63 61 75 73 65 20 74 68 65 72  es. Because ther
213f0 65 20 69 73 0a 20 20 2a 2a 20 67 75 61 72 61 6e  e is.  ** guaran
21400 74 65 65 64 20 74 6f 20 62 65 20 61 74 20 6c 65  teed to be at le
21410 61 73 74 20 37 34 20 28 62 75 74 20 6e 6f 74 20  ast 74 (but not 
21420 31 33 36 29 20 62 79 74 65 73 20 6f 66 20 70 61  136) bytes of pa
21430 64 64 69 6e 67 20 66 6f 6c 6c 6f 77 69 6e 67 20  dding following 
21440 65 61 63 68 0a 20 20 2a 2a 20 62 75 66 66 65 72  each.  ** buffer
21450 20 70 61 73 73 65 64 20 74 6f 20 76 61 72 69 6e   passed to varin
21460 74 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  tRecordCompareIn
21470 74 28 29 20 74 68 69 73 20 6d 61 6b 65 73 20 69  t() this makes i
21480 74 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 0a  t convenient to.
21490 20 20 2a 2a 20 6c 69 6d 69 74 20 74 68 65 20 73    ** limit the s
214a0 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65  ize of the heade
214b0 72 20 74 6f 20 36 34 20 62 79 74 65 73 20 69 6e  r to 64 bytes in
214c0 20 63 61 73 65 73 20 77 68 65 72 65 20 74 68 65   cases where the
214d0 20 66 69 72 73 74 20 66 69 65 6c 64 0a 20 20 2a   first field.  *
214e0 2a 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 2e  * is an integer.
214f0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 65  .  **.  ** The e
21500 61 73 69 65 73 74 20 77 61 79 20 74 6f 20 65 6e  asiest way to en
21510 66 6f 72 63 65 20 74 68 69 73 20 6c 69 6d 69 74  force this limit
21520 20 69 73 20 74 6f 20 63 6f 6e 73 69 64 65 72 20   is to consider 
21530 6f 6e 6c 79 20 72 65 63 6f 72 64 73 20 77 69 74  only records wit
21540 68 0a 20 20 2a 2a 20 31 33 20 66 69 65 6c 64 73  h.  ** 13 fields
21550 20 6f 72 20 6c 65 73 73 2e 20 49 66 20 74 68 65   or less. If the
21560 20 66 69 72 73 74 20 66 69 65 6c 64 20 69 73 20   first field is 
21570 61 6e 20 69 6e 74 65 67 65 72 2c 20 74 68 65 20  an integer, the 
21580 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 0a 20 20  maximum legal.  
21590 2a 2a 20 68 65 61 64 65 72 20 73 69 7a 65 20 69  ** header size i
215a0 73 20 28 31 32 2a 35 20 2b 20 31 20 2b 20 31 29  s (12*5 + 1 + 1)
215b0 20 62 79 74 65 73 2e 20 20 2a 2f 0a 20 20 69 66   bytes.  */.  if
215c0 28 20 28 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  ( (p->pKeyInfo->
215d0 6e 46 69 65 6c 64 20 2b 20 70 2d 3e 70 4b 65 79  nField + p->pKey
215e0 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 29 3c 3d  Info->nXField)<=
215f0 31 33 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6c  13 ){.    int fl
21600 61 67 73 20 3d 20 70 2d 3e 61 4d 65 6d 5b 30 5d  ags = p->aMem[0]
21610 2e 66 6c 61 67 73 3b 0a 20 20 20 20 69 66 28 20  .flags;.    if( 
21620 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  p->pKeyInfo->aSo
21630 72 74 4f 72 64 65 72 5b 30 5d 20 29 7b 0a 20 20  rtOrder[0] ){.  
21640 20 20 20 20 70 2d 3e 72 31 20 3d 20 31 3b 0a 20      p->r1 = 1;. 
21650 20 20 20 20 20 70 2d 3e 72 32 20 3d 20 2d 31 3b       p->r2 = -1;
21660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21670 20 20 70 2d 3e 72 31 20 3d 20 2d 31 3b 0a 20 20    p->r1 = -1;.  
21680 20 20 20 20 70 2d 3e 72 32 20 3d 20 31 3b 0a 20      p->r2 = 1;. 
21690 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 6c     }.    if( (fl
216a0 61 67 73 20 26 20 4d 45 4d 5f 49 6e 74 29 20 29  ags & MEM_Int) )
216b0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 76  {.      return v
216c0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
216d0 49 6e 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  Int;.    }.    t
216e0 65 73 74 63 61 73 65 28 20 66 6c 61 67 73 20 26  estcase( flags &
216f0 20 4d 45 4d 5f 52 65 61 6c 20 29 3b 0a 20 20 20   MEM_Real );.   
21700 20 74 65 73 74 63 61 73 65 28 20 66 6c 61 67 73   testcase( flags
21710 20 26 20 4d 45 4d 5f 4e 75 6c 6c 20 29 3b 0a 20   & MEM_Null );. 
21720 20 20 20 74 65 73 74 63 61 73 65 28 20 66 6c 61     testcase( fla
21730 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
21740 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
21750 26 20 28 4d 45 4d 5f 52 65 61 6c 7c 4d 45 4d 5f  & (MEM_Real|MEM_
21760 4e 75 6c 6c 7c 4d 45 4d 5f 42 6c 6f 62 29 29 3d  Null|MEM_Blob))=
21770 3d 30 20 26 26 20 70 2d 3e 70 4b 65 79 49 6e 66  =0 && p->pKeyInf
21780 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 3d 3d 30 20 29  o->aColl[0]==0 )
21790 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
217a0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20  flags & MEM_Str 
217b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
217c0 76 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  vdbeRecordCompar
217d0 65 53 74 72 69 6e 67 3b 0a 20 20 20 20 7d 0a 20  eString;.    }. 
217e0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
217f0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f  ite3VdbeRecordCo
21800 6d 70 61 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  mpare;.}../*.** 
21810 70 43 75 72 20 70 6f 69 6e 74 73 20 61 74 20 61  pCur points at a
21820 6e 20 69 6e 64 65 78 20 65 6e 74 72 79 20 63 72  n index entry cr
21830 65 61 74 65 64 20 75 73 69 6e 67 20 74 68 65 20  eated using the 
21840 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70  OP_MakeRecord op
21850 63 6f 64 65 2e 0a 2a 2a 20 52 65 61 64 20 74 68  code..** Read th
21860 65 20 72 6f 77 69 64 20 28 74 68 65 20 6c 61 73  e rowid (the las
21870 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20 72  t field in the r
21880 65 63 6f 72 64 29 20 61 6e 64 20 73 74 6f 72 65  ecord) and store
21890 20 69 74 20 69 6e 20 2a 72 6f 77 69 64 2e 0a 2a   it in *rowid..*
218a0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
218b0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
218c0 20 77 6f 72 6b 73 2c 20 6f 72 20 61 6e 20 65 72   works, or an er
218d0 72 6f 72 20 63 6f 64 65 20 6f 74 68 65 72 77 69  ror code otherwi
218e0 73 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 20 6d  se..**.** pCur m
218f0 69 67 68 74 20 62 65 20 70 6f 69 6e 74 69 6e 67  ight be pointing
21900 20 74 6f 20 74 65 78 74 20 6f 62 74 61 69 6e 65   to text obtaine
21910 64 20 66 72 6f 6d 20 61 20 63 6f 72 72 75 70 74  d from a corrupt
21920 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
21930 2a 2a 20 53 6f 20 74 68 65 20 63 6f 6e 74 65 6e  ** So the conten
21940 74 20 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73  t cannot be trus
21950 74 65 64 2e 20 20 44 6f 20 61 70 70 72 6f 70 72  ted.  Do appropr
21960 69 61 74 65 20 63 68 65 63 6b 73 20 6f 6e 20 74  iate checks on t
21970 68 65 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 69  he content..*/.i
21980 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 49 64  nt sqlite3VdbeId
21990 78 52 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a  xRowid(sqlite3 *
219a0 64 62 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 43  db, BtCursor *pC
219b0 75 72 2c 20 69 36 34 20 2a 72 6f 77 69 64 29 7b  ur, i64 *rowid){
219c0 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 20  .  i64 nCellKey 
219d0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
219e0 20 75 33 32 20 73 7a 48 64 72 3b 20 20 20 20 20   u32 szHdr;     
219f0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21a00 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33  e header */.  u3
21a10 32 20 74 79 70 65 52 6f 77 69 64 3b 20 20 20 20  2 typeRowid;    
21a20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20 6f  /* Serial type o
21a30 66 20 74 68 65 20 72 6f 77 69 64 20 2a 2f 0a 20  f the rowid */. 
21a40 20 75 33 32 20 6c 65 6e 52 6f 77 69 64 3b 20 20   u32 lenRowid;  
21a50 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
21a60 65 20 72 6f 77 69 64 20 2a 2f 0a 20 20 4d 65 6d  e rowid */.  Mem
21a70 20 6d 2c 20 76 3b 0a 0a 20 20 2f 2a 20 47 65 74   m, v;..  /* Get
21a80 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
21a90 20 69 6e 64 65 78 20 65 6e 74 72 79 2e 20 20 4f   index entry.  O
21aa0 6e 6c 79 20 69 6e 64 69 63 65 73 20 65 6e 74 72  nly indices entr
21ab0 69 65 73 20 6f 66 20 6c 65 73 73 0a 20 20 2a 2a  ies of less.  **
21ac0 20 74 68 61 6e 20 32 47 69 42 20 61 72 65 20 73   than 2GiB are s
21ad0 75 70 70 6f 72 74 20 2d 20 61 6e 79 74 68 69 6e  upport - anythin
21ae0 67 20 6c 61 72 67 65 20 6d 75 73 74 20 62 65 20  g large must be 
21af0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
21b00 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 79 20 63 6f  ion..  ** Any co
21b10 72 72 75 70 74 69 6f 6e 20 69 73 20 64 65 74 65  rruption is dete
21b20 63 74 65 64 20 69 6e 20 73 71 6c 69 74 65 33 42  cted in sqlite3B
21b30 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
21b40 28 29 2c 20 74 68 6f 75 67 68 2c 20 73 6f 0a 20  (), though, so. 
21b50 20 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 63 61   ** this code ca
21b60 6e 20 73 61 66 65 6c 79 20 61 73 73 75 6d 65 20  n safely assume 
21b70 74 68 61 74 20 6e 43 65 6c 6c 4b 65 79 20 69 73  that nCellKey is
21b80 20 33 32 2d 62 69 74 73 20 20 0a 20 20 2a 2f 0a   32-bits  .  */.
21b90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
21ba0 33 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61  3BtreeCursorIsVa
21bb0 6c 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e  lid(pCur) );.  n
21bc0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
21bd0 33 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a  3BtreePayloadSiz
21be0 65 28 70 43 75 72 29 3b 0a 20 20 61 73 73 65 72  e(pCur);.  asser
21bf0 74 28 20 28 6e 43 65 6c 6c 4b 65 79 20 26 20 53  t( (nCellKey & S
21c00 51 4c 49 54 45 5f 4d 41 58 5f 55 33 32 29 3d 3d  QLITE_MAX_U32)==
21c10 28 75 36 34 29 6e 43 65 6c 6c 4b 65 79 20 29 3b  (u64)nCellKey );
21c20 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69 6e 20 74  ..  /* Read in t
21c30 68 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74  he complete cont
21c40 65 6e 74 20 6f 66 20 74 68 65 20 69 6e 64 65 78  ent of the index
21c50 20 65 6e 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69   entry */.  sqli
21c60 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26  te3VdbeMemInit(&
21c70 6d 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20  m, db, 0);.  rc 
21c80 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
21c90 46 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20  FromBtree(pCur, 
21ca0 30 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79  0, (u32)nCellKey
21cb0 2c 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20  , 1, &m);.  if( 
21cc0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
21cd0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54   rc;.  }..  /* T
21ce0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 6d  he index entry m
21cf0 75 73 74 20 62 65 67 69 6e 20 77 69 74 68 20 61  ust begin with a
21d00 20 68 65 61 64 65 72 20 73 69 7a 65 20 2a 2f 0a   header size */.
21d10 20 20 28 76 6f 69 64 29 67 65 74 56 61 72 69 6e    (void)getVarin
21d20 74 33 32 28 28 75 38 2a 29 6d 2e 7a 2c 20 73 7a  t32((u8*)m.z, sz
21d30 48 64 72 29 3b 0a 20 20 74 65 73 74 63 61 73 65  Hdr);.  testcase
21d40 28 20 73 7a 48 64 72 3d 3d 33 20 29 3b 0a 20 20  ( szHdr==3 );.  
21d50 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
21d60 3d 6d 2e 6e 20 29 3b 0a 20 20 69 66 28 20 75 6e  =m.n );.  if( un
21d70 6c 69 6b 65 6c 79 28 73 7a 48 64 72 3c 33 20 7c  likely(szHdr<3 |
21d80 7c 20 28 69 6e 74 29 73 7a 48 64 72 3e 6d 2e 6e  | (int)szHdr>m.n
21d90 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64  ) ){.    goto id
21da0 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69  x_rowid_corrupti
21db0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  on;.  }..  /* Th
21dc0 65 20 6c 61 73 74 20 66 69 65 6c 64 20 6f 66 20  e last field of 
21dd0 74 68 65 20 69 6e 64 65 78 20 73 68 6f 75 6c 64  the index should
21de0 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 2d   be an integer -
21df0 20 74 68 65 20 52 4f 57 49 44 2e 0a 20 20 2a 2a   the ROWID..  **
21e00 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65   Verify that the
21e10 20 6c 61 73 74 20 65 6e 74 72 79 20 72 65 61 6c   last entry real
21e20 6c 79 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  ly is an integer
21e30 2e 20 2a 2f 0a 20 20 28 76 6f 69 64 29 67 65 74  . */.  (void)get
21e40 56 61 72 69 6e 74 33 32 28 28 75 38 2a 29 26 6d  Varint32((u8*)&m
21e50 2e 7a 5b 73 7a 48 64 72 2d 31 5d 2c 20 74 79 70  .z[szHdr-1], typ
21e60 65 52 6f 77 69 64 29 3b 0a 20 20 74 65 73 74 63  eRowid);.  testc
21e70 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21e80 31 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  1 );.  testcase(
21e90 20 74 79 70 65 52 6f 77 69 64 3d 3d 32 20 29 3b   typeRowid==2 );
21ea0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21eb0 65 52 6f 77 69 64 3d 3d 33 20 29 3b 0a 20 20 74  eRowid==3 );.  t
21ec0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21ed0 69 64 3d 3d 34 20 29 3b 0a 20 20 74 65 73 74 63  id==4 );.  testc
21ee0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21ef0 35 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  5 );.  testcase(
21f00 20 74 79 70 65 52 6f 77 69 64 3d 3d 36 20 29 3b   typeRowid==6 );
21f10 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21f20 65 52 6f 77 69 64 3d 3d 38 20 29 3b 0a 20 20 74  eRowid==8 );.  t
21f30 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21f40 69 64 3d 3d 39 20 29 3b 0a 20 20 69 66 28 20 75  id==9 );.  if( u
21f50 6e 6c 69 6b 65 6c 79 28 74 79 70 65 52 6f 77 69  nlikely(typeRowi
21f60 64 3c 31 20 7c 7c 20 74 79 70 65 52 6f 77 69 64  d<1 || typeRowid
21f70 3e 39 20 7c 7c 20 74 79 70 65 52 6f 77 69 64 3d  >9 || typeRowid=
21f80 3d 37 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  =7) ){.    goto 
21f90 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70  idx_rowid_corrup
21fa0 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 6c 65 6e 52  tion;.  }.  lenR
21fb0 6f 77 69 64 20 3d 20 73 71 6c 69 74 65 33 53 6d  owid = sqlite3Sm
21fc0 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 74 79 70  allTypeSizes[typ
21fd0 65 52 6f 77 69 64 5d 3b 0a 20 20 74 65 73 74 63  eRowid];.  testc
21fe0 61 73 65 28 20 28 75 33 32 29 6d 2e 6e 3d 3d 73  ase( (u32)m.n==s
21ff0 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 20 29 3b  zHdr+lenRowid );
22000 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
22010 28 75 33 32 29 6d 2e 6e 3c 73 7a 48 64 72 2b 6c  (u32)m.n<szHdr+l
22020 65 6e 52 6f 77 69 64 29 20 29 7b 0a 20 20 20 20  enRowid) ){.    
22030 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f 63  goto idx_rowid_c
22040 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a  orruption;.  }..
22050 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 69    /* Fetch the i
22060 6e 74 65 67 65 72 20 6f 66 66 20 74 68 65 20 65  nteger off the e
22070 6e 64 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20  nd of the index 
22080 72 65 63 6f 72 64 20 2a 2f 0a 20 20 73 71 6c 69  record */.  sqli
22090 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
220a0 28 28 75 38 2a 29 26 6d 2e 7a 5b 6d 2e 6e 2d 6c  ((u8*)&m.z[m.n-l
220b0 65 6e 52 6f 77 69 64 5d 2c 20 74 79 70 65 52 6f  enRowid], typeRo
220c0 77 69 64 2c 20 26 76 29 3b 0a 20 20 2a 72 6f 77  wid, &v);.  *row
220d0 69 64 20 3d 20 76 2e 75 2e 69 3b 0a 20 20 73 71  id = v.u.i;.  sq
220e0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
220f0 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75 72  ase(&m);.  retur
22100 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
22110 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
22120 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
22130 69 6f 6e 20 69 73 20 64 65 74 65 63 74 65 64 20  ion is detected 
22140 61 66 74 65 72 20 6d 20 68 61 73 20 62 65 65 6e  after m has been
22150 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2e  .  ** allocated.
22160 20 20 46 72 65 65 20 74 68 65 20 6d 20 6f 62 6a    Free the m obj
22170 65 63 74 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ect and return S
22180 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20 2a  QLITE_CORRUPT. *
22190 2f 0a 69 64 78 5f 72 6f 77 69 64 5f 63 6f 72 72  /.idx_rowid_corr
221a0 75 70 74 69 6f 6e 3a 0a 20 20 74 65 73 74 63 61  uption:.  testca
221b0 73 65 28 20 6d 2e 73 7a 4d 61 6c 6c 6f 63 21 3d  se( m.szMalloc!=
221c0 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64  0 );.  sqlite3Vd
221d0 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29  beMemRelease(&m)
221e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
221f0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
22200 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
22210 20 74 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20   the key of the 
22220 69 6e 64 65 78 20 65 6e 74 72 79 20 74 68 61 74  index entry that
22230 20 63 75 72 73 6f 72 20 70 43 20 69 73 20 70 6f   cursor pC is po
22240 69 6e 74 69 6e 67 20 74 6f 20 61 67 61 69 6e 73  inting to agains
22250 74 0a 2a 2a 20 74 68 65 20 6b 65 79 20 73 74 72  t.** the key str
22260 69 6e 67 20 69 6e 20 70 55 6e 70 61 63 6b 65 64  ing in pUnpacked
22270 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
22280 52 65 73 20 61 20 6e 75 6d 62 65 72 0a 2a 2a 20  Res a number.** 
22290 74 68 61 74 20 69 73 20 6e 65 67 61 74 69 76 65  that is negative
222a0 2c 20 7a 65 72 6f 2c 20 6f 72 20 70 6f 73 69 74  , zero, or posit
222b0 69 76 65 20 69 66 20 70 43 20 69 73 20 6c 65 73  ive if pC is les
222c0 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74 6f  s than, equal to
222d0 2c 0a 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20  ,.** or greater 
222e0 74 68 61 6e 20 70 55 6e 70 61 63 6b 65 64 2e 20  than pUnpacked. 
222f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
22300 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2a  K on success..**
22310 0a 2a 2a 20 70 55 6e 70 61 63 6b 65 64 20 69 73  .** pUnpacked is
22320 20 65 69 74 68 65 72 20 63 72 65 61 74 65 64 20   either created 
22330 77 69 74 68 6f 75 74 20 61 20 72 6f 77 69 64 20  without a rowid 
22340 6f 72 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  or is truncated 
22350 73 6f 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 6d  so that it.** om
22360 69 74 73 20 74 68 65 20 72 6f 77 69 64 20 61 74  its the rowid at
22370 20 74 68 65 20 65 6e 64 2e 20 20 54 68 65 20 72   the end.  The r
22380 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64 20  owid at the end 
22390 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e 74  of the index ent
223a0 72 79 0a 2a 2a 20 69 73 20 69 67 6e 6f 72 65 64  ry.** is ignored
223b0 20 61 73 20 77 65 6c 6c 2e 20 20 48 65 6e 63 65   as well.  Hence
223c0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 6f  , this routine o
223d0 6e 6c 79 20 63 6f 6d 70 61 72 65 73 20 74 68 65  nly compares the
223e0 20 70 72 65 66 69 78 65 73 20 0a 2a 2a 20 6f 66   prefixes .** of
223f0 20 74 68 65 20 6b 65 79 73 20 70 72 69 6f 72 20   the keys prior 
22400 74 6f 20 74 68 65 20 66 69 6e 61 6c 20 72 6f 77  to the final row
22410 69 64 2c 20 6e 6f 74 20 74 68 65 20 65 6e 74 69  id, not the enti
22420 72 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  re key..*/.int s
22430 71 6c 69 74 65 33 56 64 62 65 49 64 78 4b 65 79  qlite3VdbeIdxKey
22440 43 6f 6d 70 61 72 65 28 0a 20 20 73 71 6c 69 74  Compare(.  sqlit
22450 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
22460 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22470 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
22480 6f 6e 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  on */.  VdbeCurs
22490 6f 72 20 2a 70 43 2c 20 20 20 20 20 20 20 20 20  or *pC,         
224a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
224b0 63 75 72 73 6f 72 20 74 6f 20 63 6f 6d 70 61 72  cursor to compar
224c0 65 20 61 67 61 69 6e 73 74 20 2a 2f 0a 20 20 55  e against */.  U
224d0 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
224e0 55 6e 70 61 63 6b 65 64 2c 20 20 20 20 20 20 20  Unpacked,       
224f0 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72 73  /* Unpacked vers
22500 69 6f 6e 20 6f 66 20 6b 65 79 20 2a 2f 0a 20 20  ion of key */.  
22510 69 6e 74 20 2a 72 65 73 20 20 20 20 20 20 20 20  int *res        
22520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22530 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 63 6f   /* Write the co
22540 6d 70 61 72 69 73 6f 6e 20 72 65 73 75 6c 74 20  mparison result 
22550 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 36 34  here */.){.  i64
22560 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20   nCellKey = 0;. 
22570 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 43 75 72   int rc;.  BtCur
22580 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 4d 65 6d  sor *pCur;.  Mem
22590 20 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   m;..  assert( p
225a0 43 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  C->eCurType==CUR
225b0 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
225c0 70 43 75 72 20 3d 20 70 43 2d 3e 75 63 2e 70 43  pCur = pC->uc.pC
225d0 75 72 73 6f 72 3b 0a 20 20 61 73 73 65 72 74 28  ursor;.  assert(
225e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
225f0 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72 29  sorIsValid(pCur)
22600 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20 3d   );.  nCellKey =
22610 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 79   sqlite3BtreePay
22620 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b 0a  loadSize(pCur);.
22630 20 20 2f 2a 20 6e 43 65 6c 6c 4b 65 79 20 77 69    /* nCellKey wi
22640 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 62 65 74  ll always be bet
22650 77 65 65 6e 20 30 20 61 6e 64 20 30 78 66 66 66  ween 0 and 0xfff
22660 66 66 66 66 66 20 62 65 63 61 75 73 65 20 6f 66  fffff because of
22670 20 74 68 65 20 77 61 79 0a 20 20 2a 2a 20 74 68   the way.  ** th
22680 61 74 20 62 74 72 65 65 50 61 72 73 65 43 65 6c  at btreeParseCel
22690 6c 50 74 72 28 29 20 61 6e 64 20 73 71 6c 69 74  lPtr() and sqlit
226a0 65 33 47 65 74 56 61 72 69 6e 74 33 32 28 29 20  e3GetVarint32() 
226b0 61 72 65 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  are implemented 
226c0 2a 2f 0a 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65  */.  if( nCellKe
226d0 79 3c 3d 30 20 7c 7c 20 6e 43 65 6c 6c 4b 65 79  y<=0 || nCellKey
226e0 3e 30 78 37 66 66 66 66 66 66 66 20 29 7b 0a 20  >0x7fffffff ){. 
226f0 20 20 20 2a 72 65 73 20 3d 20 30 3b 0a 20 20 20     *res = 0;.   
22700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
22710 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
22720 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  .  sqlite3VdbeMe
22730 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30 29  mInit(&m, db, 0)
22740 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
22750 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65 65  VdbeMemFromBtree
22760 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29 6e  (pCur, 0, (u32)n
22770 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29 3b  CellKey, 1, &m);
22780 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
22790 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
227a0 20 20 2a 72 65 73 20 3d 20 73 71 6c 69 74 65 33    *res = sqlite3
227b0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
227c0 65 28 6d 2e 6e 2c 20 6d 2e 7a 2c 20 70 55 6e 70  e(m.n, m.z, pUnp
227d0 61 63 6b 65 64 29 3b 0a 20 20 73 71 6c 69 74 65  acked);.  sqlite
227e0 33 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28  3VdbeMemRelease(
227f0 26 6d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  &m);.  return SQ
22800 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
22810 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
22820 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 74 6f  ets the value to
22830 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
22840 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
22850 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63   to.** sqlite3_c
22860 68 61 6e 67 65 73 28 29 20 6f 6e 20 74 68 65 20  hanges() on the 
22870 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
22880 27 64 62 27 2e 20 0a 2a 2f 0a 76 6f 69 64 20 73  'db'. .*/.void s
22890 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
228a0 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62  nges(sqlite3 *db
228b0 2c 20 69 6e 74 20 6e 43 68 61 6e 67 65 29 7b 0a  , int nChange){.
228c0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
228d0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
228e0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 62 2d  >mutex) );.  db-
228f0 3e 6e 43 68 61 6e 67 65 20 3d 20 6e 43 68 61 6e  >nChange = nChan
22900 67 65 3b 0a 20 20 64 62 2d 3e 6e 54 6f 74 61 6c  ge;.  db->nTotal
22910 43 68 61 6e 67 65 20 2b 3d 20 6e 43 68 61 6e 67  Change += nChang
22920 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  e;.}../*.** Set 
22930 61 20 66 6c 61 67 20 69 6e 20 74 68 65 20 76 64  a flag in the vd
22940 62 65 20 74 6f 20 75 70 64 61 74 65 20 74 68 65  be to update the
22950 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
22960 77 68 65 6e 20 69 74 20 69 73 20 66 69 6e 61 6c  when it is final
22970 69 73 65 64 0a 2a 2a 20 6f 72 20 72 65 73 65 74  ised.** or reset
22980 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
22990 33 56 64 62 65 43 6f 75 6e 74 43 68 61 6e 67 65  3VdbeCountChange
229a0 73 28 56 64 62 65 20 2a 76 29 7b 0a 20 20 76 2d  s(Vdbe *v){.  v-
229b0 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 3d 20 31  >changeCntOn = 1
229c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
229d0 65 76 65 72 79 20 70 72 65 70 61 72 65 64 20 73  every prepared s
229e0 74 61 74 65 6d 65 6e 74 20 61 73 73 6f 63 69 61  tatement associa
229f0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
22a00 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
22a10 2a 20 61 73 20 65 78 70 69 72 65 64 2e 0a 2a 2a  * as expired..**
22a20 0a 2a 2a 20 41 6e 20 65 78 70 69 72 65 64 20 73  .** An expired s
22a30 74 61 74 65 6d 65 6e 74 20 6d 65 61 6e 73 20 74  tatement means t
22a40 68 61 74 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f  hat recompilatio
22a50 6e 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  n of the stateme
22a60 6e 74 20 69 73 0a 2a 2a 20 72 65 63 6f 6d 6d 65  nt is.** recomme
22a70 6e 64 2e 20 20 53 74 61 74 65 6d 65 6e 74 73 20  nd.  Statements 
22a80 65 78 70 69 72 65 20 77 68 65 6e 20 74 68 69 6e  expire when thin
22a90 67 73 20 68 61 70 70 65 6e 20 74 68 61 74 20 6d  gs happen that m
22aa0 61 6b 65 20 74 68 65 69 72 0a 2a 2a 20 70 72 6f  ake their.** pro
22ab0 67 72 61 6d 73 20 6f 62 73 6f 6c 65 74 65 2e 20  grams obsolete. 
22ac0 20 52 65 6d 6f 76 69 6e 67 20 75 73 65 72 2d 64   Removing user-d
22ad0 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e 73  efined functions
22ae0 20 6f 72 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a   or collating.**
22af0 20 73 65 71 75 65 6e 63 65 73 2c 20 6f 72 20 63   sequences, or c
22b00 68 61 6e 67 69 6e 67 20 61 6e 20 61 75 74 68 6f  hanging an autho
22b10 72 69 7a 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  rization functio
22b20 6e 20 61 72 65 20 74 68 65 20 74 79 70 65 73 20  n are the types 
22b30 6f 66 0a 2a 2a 20 74 68 69 6e 67 73 20 74 68 61  of.** things tha
22b40 74 20 6d 61 6b 65 20 70 72 65 70 61 72 65 64 20  t make prepared 
22b50 73 74 61 74 65 6d 65 6e 74 73 20 6f 62 73 6f 6c  statements obsol
22b60 65 74 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ete..*/.void sql
22b70 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
22b80 65 64 53 74 61 74 65 6d 65 6e 74 73 28 73 71 6c  edStatements(sql
22b90 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 56 64 62  ite3 *db){.  Vdb
22ba0 65 20 2a 70 3b 0a 20 20 66 6f 72 28 70 20 3d 20  e *p;.  for(p = 
22bb0 64 62 2d 3e 70 56 64 62 65 3b 20 70 3b 20 70 3d  db->pVdbe; p; p=
22bc0 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  p->pNext){.    p
22bd0 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a 20  ->expired = 1;. 
22be0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
22bf0 72 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  rn the database 
22c00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
22c10 74 68 65 20 56 64 62 65 2e 0a 2a 2f 0a 73 71 6c  the Vdbe..*/.sql
22c20 69 74 65 33 20 2a 73 71 6c 69 74 65 33 56 64 62  ite3 *sqlite3Vdb
22c30 65 44 62 28 56 64 62 65 20 2a 76 29 7b 0a 20 20  eDb(Vdbe *v){.  
22c40 72 65 74 75 72 6e 20 76 2d 3e 64 62 3b 0a 7d 0a  return v->db;.}.
22c50 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
22c60 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
22c70 6c 69 74 65 33 5f 76 61 6c 75 65 20 73 74 72 75  lite3_value stru
22c80 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 69 6e 67  cture containing
22c90 20 74 68 65 20 76 61 6c 75 65 20 62 6f 75 6e 64   the value bound
22ca0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 56  .** parameter iV
22cb0 61 72 20 6f 66 20 56 4d 20 76 2e 20 45 78 63 65  ar of VM v. Exce
22cc0 70 74 2c 20 69 66 20 74 68 65 20 76 61 6c 75 65  pt, if the value
22cd0 20 69 73 20 61 6e 20 53 51 4c 20 4e 55 4c 4c 2c   is an SQL NULL,
22ce0 20 72 65 74 75 72 6e 20 0a 2a 2a 20 30 20 69 6e   return .** 0 in
22cf0 73 74 65 61 64 2e 20 55 6e 6c 65 73 73 20 69 74  stead. Unless it
22d00 20 69 73 20 4e 55 4c 4c 2c 20 61 70 70 6c 79 20   is NULL, apply 
22d10 61 66 66 69 6e 69 74 79 20 61 66 66 20 28 6f 6e  affinity aff (on
22d20 65 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  e of the SQLITE_
22d30 41 46 46 5f 2a 0a 2a 2a 20 63 6f 6e 73 74 61 6e  AFF_*.** constan
22d40 74 73 29 20 74 6f 20 74 68 65 20 76 61 6c 75 65  ts) to the value
22d50 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
22d60 67 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  g it..**.** The 
22d70 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 6d  returned value m
22d80 75 73 74 20 62 65 20 66 72 65 65 64 20 62 79 20  ust be freed by 
22d90 74 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67  the caller using
22da0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
22db0 65 28 29 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  e()..*/.sqlite3_
22dc0 76 61 6c 75 65 20 2a 73 71 6c 69 74 65 33 56 64  value *sqlite3Vd
22dd0 62 65 47 65 74 42 6f 75 6e 64 56 61 6c 75 65 28  beGetBoundValue(
22de0 56 64 62 65 20 2a 76 2c 20 69 6e 74 20 69 56 61  Vdbe *v, int iVa
22df0 72 2c 20 75 38 20 61 66 66 29 7b 0a 20 20 61 73  r, u8 aff){.  as
22e00 73 65 72 74 28 20 69 56 61 72 3e 30 20 29 3b 0a  sert( iVar>0 );.
22e10 20 20 69 66 28 20 76 20 29 7b 0a 20 20 20 20 4d    if( v ){.    M
22e20 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 76 2d 3e 61  em *pMem = &v->a
22e30 56 61 72 5b 69 56 61 72 2d 31 5d 3b 0a 20 20 20  Var[iVar-1];.   
22e40 20 69 66 28 20 30 3d 3d 28 70 4d 65 6d 2d 3e 66   if( 0==(pMem->f
22e50 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c 29  lags & MEM_Null)
22e60 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
22e70 33 5f 76 61 6c 75 65 20 2a 70 52 65 74 20 3d 20  3_value *pRet = 
22e80 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
22e90 76 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 69 66  v->db);.      if
22ea0 28 20 70 52 65 74 20 29 7b 0a 20 20 20 20 20 20  ( pRet ){.      
22eb0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
22ec0 43 6f 70 79 28 28 4d 65 6d 20 2a 29 70 52 65 74  Copy((Mem *)pRet
22ed0 2c 20 70 4d 65 6d 29 3b 0a 20 20 20 20 20 20 20  , pMem);.       
22ee0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 41 70 70   sqlite3ValueApp
22ef0 6c 79 41 66 66 69 6e 69 74 79 28 70 52 65 74 2c  lyAffinity(pRet,
22f00 20 61 66 66 2c 20 53 51 4c 49 54 45 5f 55 54 46   aff, SQLITE_UTF
22f10 38 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  8);.      }.    
22f20 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 20    return pRet;. 
22f30 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
22f40 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 0;.}../*.** Co
22f50 6e 66 69 67 75 72 65 20 53 51 4c 20 76 61 72 69  nfigure SQL vari
22f60 61 62 6c 65 20 69 56 61 72 20 73 6f 20 74 68 61  able iVar so tha
22f70 74 20 62 69 6e 64 69 6e 67 20 61 20 6e 65 77 20  t binding a new 
22f80 76 61 6c 75 65 20 74 6f 20 69 74 20 73 69 67 6e  value to it sign
22f90 61 6c 73 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65  als.** to sqlite
22fa0 33 5f 72 65 6f 70 74 69 6d 69 7a 65 28 29 20 74  3_reoptimize() t
22fb0 68 61 74 20 72 65 2d 70 72 65 70 61 72 69 6e 67  hat re-preparing
22fc0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6d   the statement m
22fd0 61 79 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20  ay result.** in 
22fe0 61 20 62 65 74 74 65 72 20 71 75 65 72 79 20 70  a better query p
22ff0 6c 61 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lan..*/.void sql
23000 69 74 65 33 56 64 62 65 53 65 74 56 61 72 6d 61  ite3VdbeSetVarma
23010 73 6b 28 56 64 62 65 20 2a 76 2c 20 69 6e 74 20  sk(Vdbe *v, int 
23020 69 56 61 72 29 7b 0a 20 20 61 73 73 65 72 74 28  iVar){.  assert(
23030 20 69 56 61 72 3e 30 20 29 3b 0a 20 20 69 66 28   iVar>0 );.  if(
23040 20 69 56 61 72 3e 33 32 20 29 7b 0a 20 20 20 20   iVar>32 ){.    
23050 76 2d 3e 65 78 70 6d 61 73 6b 20 3d 20 30 78 66  v->expmask = 0xf
23060 66 66 66 66 66 66 66 3b 0a 20 20 7d 65 6c 73 65  fffffff;.  }else
23070 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61 73 6b  {.    v->expmask
23080 20 7c 3d 20 28 28 75 33 32 29 31 20 3c 3c 20 28   |= ((u32)1 << (
23090 69 56 61 72 2d 31 29 29 3b 0a 20 20 7d 0a 7d 0a  iVar-1));.  }.}.
230a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
230b0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
230c0 45 0a 2f 2a 0a 2a 2a 20 54 72 61 6e 73 66 65 72  E./*.** Transfer
230d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
230e0 65 78 74 20 66 72 6f 6d 20 61 6e 20 73 71 6c 69  ext from an sqli
230f0 74 65 33 5f 76 74 61 62 2e 7a 45 72 72 4d 73 67  te3_vtab.zErrMsg
23100 20 28 74 65 78 74 20 73 74 6f 72 65 64 0a 2a 2a   (text stored.**
23110 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
23120 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
23130 5f 6d 61 6c 6c 6f 63 29 20 69 6e 74 6f 20 61 20  _malloc) into a 
23140 56 64 62 65 2e 7a 45 72 72 4d 73 67 20 28 74 65  Vdbe.zErrMsg (te
23150 78 74 20 73 74 6f 72 65 64 0a 2a 2a 20 69 6e 20  xt stored.** in 
23160 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
23170 66 72 6f 6d 20 73 71 6c 69 74 65 33 44 62 4d 61  from sqlite3DbMa
23180 6c 6c 6f 63 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  lloc)..*/.void s
23190 71 6c 69 74 65 33 56 74 61 62 49 6d 70 6f 72 74  qlite3VtabImport
231a0 45 72 72 6d 73 67 28 56 64 62 65 20 2a 70 2c 20  Errmsg(Vdbe *p, 
231b0 73 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56  sqlite3_vtab *pV
231c0 74 61 62 29 7b 0a 20 20 69 66 28 20 70 56 74 61  tab){.  if( pVta
231d0 62 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  b->zErrMsg ){.  
231e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
231f0 70 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c 69 74  p->db;.    sqlit
23200 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
23210 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
23220 3e 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  >zErrMsg = sqlit
23230 65 33 44 62 53 74 72 44 75 70 28 64 62 2c 20 70  e3DbStrDup(db, p
23240 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a  Vtab->zErrMsg);.
23250 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
23260 28 70 56 74 61 62 2d 3e 7a 45 72 72 4d 73 67 29  (pVtab->zErrMsg)
23270 3b 0a 20 20 20 20 70 56 74 61 62 2d 3e 7a 45 72  ;.    pVtab->zEr
23280 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  rMsg = 0;.  }.}.
23290 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
232a0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
232b0 4c 45 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  LE */..#ifdef SQ
232c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
232d0 50 44 41 54 45 5f 48 4f 4f 4b 0a 0a 2f 2a 0a 2a  PDATE_HOOK../*.*
232e0 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
232f0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
23300 4e 55 4c 4c 2c 20 72 65 6c 65 61 73 65 20 61 6e  NULL, release an
23310 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 61 73  y allocations as
23320 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
23330 68 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  h the memory cel
23340 6c 73 20 69 6e 20 74 68 65 20 70 2d 3e 61 4d 65  ls in the p->aMe
23350 6d 5b 5d 20 61 72 72 61 79 2e 20 41 6c 73 6f 20  m[] array. Also 
23360 66 72 65 65 20 74 68 65 20 55 6e 70 61 63 6b 65  free the Unpacke
23370 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72 75 63  dRecord.** struc
23380 74 75 72 65 20 69 74 73 65 6c 66 2c 20 75 73 69  ture itself, usi
23390 6e 67 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  ng sqlite3DbFree
233a0 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ()..**.** This f
233b0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
233c0 74 6f 20 66 72 65 65 20 55 6e 70 61 63 6b 65 64  to free Unpacked
233d0 52 65 63 6f 72 64 20 73 74 72 75 63 74 75 72 65  Record structure
233e0 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a  s allocated by.*
233f0 2a 20 74 68 65 20 76 64 62 65 55 6e 70 61 63 6b  * the vdbeUnpack
23400 52 65 63 6f 72 64 28 29 20 66 75 6e 63 74 69 6f  Record() functio
23410 6e 20 66 6f 75 6e 64 20 69 6e 20 76 64 62 65 61  n found in vdbea
23420 70 69 2e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pi.c..*/.static 
23430 76 6f 69 64 20 76 64 62 65 46 72 65 65 55 6e 70  void vdbeFreeUnp
23440 61 63 6b 65 64 28 73 71 6c 69 74 65 33 20 2a 64  acked(sqlite3 *d
23450 62 2c 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  b, UnpackedRecor
23460 64 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 20 29  d *p){.  if( p )
23470 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23480 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
23490 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  Field; i++){.   
234a0 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 26     Mem *pMem = &
234b0 70 2d 3e 61 4d 65 6d 5b 69 5d 3b 0a 20 20 20 20  p->aMem[i];.    
234c0 20 20 69 66 28 20 70 4d 65 6d 2d 3e 7a 4d 61 6c    if( pMem->zMal
234d0 6c 6f 63 20 29 20 73 71 6c 69 74 65 33 56 64 62  loc ) sqlite3Vdb
234e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 70 4d 65 6d  eMemRelease(pMem
234f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
23500 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
23510 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
23520 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
23530 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 20  _PREUPDATE_HOOK 
23540 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
23550 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
23560 54 45 5f 48 4f 4f 4b 0a 2f 2a 0a 2a 2a 20 49 6e  TE_HOOK./*.** In
23570 76 6f 6b 65 20 74 68 65 20 70 72 65 2d 75 70 64  voke the pre-upd
23580 61 74 65 20 68 6f 6f 6b 2e 20 49 66 20 74 68 69  ate hook. If thi
23590 73 20 69 73 20 61 6e 20 55 50 44 41 54 45 20 6f  s is an UPDATE o
235a0 72 20 44 45 4c 45 54 45 20 70 72 65 2d 75 70 64  r DELETE pre-upd
235b0 61 74 65 20 63 61 6c 6c 2c 0a 2a 2a 20 74 68 65  ate call,.** the
235c0 6e 20 63 75 72 73 6f 72 20 70 61 73 73 65 64 20  n cursor passed 
235d0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
235e0 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 70 6f  gument should po
235f0 69 6e 74 20 74 6f 20 74 68 65 20 72 6f 77 20 61  int to the row a
23600 62 6f 75 74 0a 2a 2a 20 74 6f 20 62 65 20 75 70  bout.** to be up
23610 64 61 74 65 20 6f 72 20 64 65 6c 65 74 65 64 2e  date or deleted.
23620 20 49 66 20 74 68 65 20 61 70 70 6c 69 63 61 74   If the applicat
23630 69 6f 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65  ion calls sqlite
23640 33 5f 70 72 65 75 70 64 61 74 65 5f 6f 6c 64 28  3_preupdate_old(
23650 29 2c 0a 2a 2a 20 74 68 65 20 72 65 71 75 69 72  ),.** the requir
23660 65 64 20 76 61 6c 75 65 20 77 69 6c 6c 20 62 65  ed value will be
23670 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 72   read from the r
23680 6f 77 20 74 68 65 20 63 75 72 73 6f 72 20 70 6f  ow the cursor po
23690 69 6e 74 73 20 74 6f 2e 0a 2a 2f 0a 76 6f 69 64  ints to..*/.void
236a0 20 73 71 6c 69 74 65 33 56 64 62 65 50 72 65 55   sqlite3VdbePreU
236b0 70 64 61 74 65 48 6f 6f 6b 28 0a 20 20 56 64 62  pdateHook(.  Vdb
236c0 65 20 2a 76 2c 20 20 20 20 20 20 20 20 20 20 20  e *v,           
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
236e0 56 64 62 65 20 70 72 65 2d 75 70 64 61 74 65 20  Vdbe pre-update 
236f0 68 6f 6f 6b 20 69 73 20 69 6e 76 6f 6b 65 64 20  hook is invoked 
23700 62 79 20 2a 2f 0a 20 20 56 64 62 65 43 75 72 73  by */.  VdbeCurs
23710 6f 72 20 2a 70 43 73 72 2c 20 20 20 20 20 20 20  or *pCsr,       
23720 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f          /* Curso
23730 72 20 74 6f 20 67 72 61 62 20 6f 6c 64 2e 2a 20  r to grab old.* 
23740 76 61 6c 75 65 73 20 66 72 6f 6d 20 2a 2f 0a 20  values from */. 
23750 20 69 6e 74 20 6f 70 2c 20 20 20 20 20 20 20 20   int op,        
23760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23770 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 53 45 52   /* SQLITE_INSER
23780 54 2c 20 55 50 44 41 54 45 20 6f 72 20 44 45 4c  T, UPDATE or DEL
23790 45 54 45 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ETE */.  const c
237a0 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20  har *zDb,       
237b0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
237c0 62 61 73 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 54  base name */.  T
237d0 61 62 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 20  able *pTab,     
237e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
237f0 2a 20 4d 6f 64 69 66 69 65 64 20 74 61 62 6c 65  * Modified table
23800 20 2a 2f 0a 20 20 69 36 34 20 69 4b 65 79 31 2c   */.  i64 iKey1,
23810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23820 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
23830 20 6b 65 79 20 76 61 6c 75 65 20 2a 2f 0a 20 20   key value */.  
23840 69 6e 74 20 69 52 65 67 20 20 20 20 20 20 20 20  int iReg        
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23860 2f 2a 20 52 65 67 69 73 74 65 72 20 66 6f 72 20  /* Register for 
23870 6e 65 77 2e 2a 20 72 65 63 6f 72 64 20 2a 2f 0a  new.* record */.
23880 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
23890 20 3d 20 76 2d 3e 64 62 3b 0a 20 20 69 36 34 20   = v->db;.  i64 
238a0 69 4b 65 79 32 3b 0a 20 20 50 72 65 55 70 64 61  iKey2;.  PreUpda
238b0 74 65 20 70 72 65 75 70 64 61 74 65 3b 0a 20 20  te preupdate;.  
238c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 62 6c  const char *zTbl
238d0 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
238e0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
238f0 38 20 66 61 6b 65 53 6f 72 74 4f 72 64 65 72 20  8 fakeSortOrder 
23900 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
23910 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 3d 3d  db->pPreUpdate==
23920 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70  0 );.  memset(&p
23930 72 65 75 70 64 61 74 65 2c 20 30 2c 20 73 69 7a  reupdate, 0, siz
23940 65 6f 66 28 50 72 65 55 70 64 61 74 65 29 29 3b  eof(PreUpdate));
23950 0a 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54  .  if( op==SQLIT
23960 45 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20  E_UPDATE ){.    
23970 69 4b 65 79 32 20 3d 20 76 2d 3e 61 4d 65 6d 5b  iKey2 = v->aMem[
23980 69 52 65 67 5d 2e 75 2e 69 3b 0a 20 20 7d 65 6c  iReg].u.i;.  }el
23990 73 65 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20  se{.    iKey2 = 
239a0 69 4b 65 79 31 3b 0a 20 20 7d 0a 0a 20 20 61 73  iKey1;.  }..  as
239b0 73 65 72 74 28 20 70 43 73 72 2d 3e 6e 46 69 65  sert( pCsr->nFie
239c0 6c 64 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 0a  ld==pTab->nCol .
239d0 20 20 20 20 20 20 20 7c 7c 20 28 70 43 73 72 2d         || (pCsr-
239e0 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62 2d 3e 6e  >nField==pTab->n
239f0 43 6f 6c 2b 31 20 26 26 20 6f 70 3d 3d 53 51 4c  Col+1 && op==SQL
23a00 49 54 45 5f 44 45 4c 45 54 45 20 26 26 20 69 52  ITE_DELETE && iR
23a10 65 67 3d 3d 2d 31 29 0a 20 20 29 3b 0a 0a 20 20  eg==-1).  );..  
23a20 70 72 65 75 70 64 61 74 65 2e 76 20 3d 20 76 3b  preupdate.v = v;
23a30 0a 20 20 70 72 65 75 70 64 61 74 65 2e 70 43 73  .  preupdate.pCs
23a40 72 20 3d 20 70 43 73 72 3b 0a 20 20 70 72 65 75  r = pCsr;.  preu
23a50 70 64 61 74 65 2e 6f 70 20 3d 20 6f 70 3b 0a 20  pdate.op = op;. 
23a60 20 70 72 65 75 70 64 61 74 65 2e 69 4e 65 77 52   preupdate.iNewR
23a70 65 67 20 3d 20 69 52 65 67 3b 0a 20 20 70 72 65  eg = iReg;.  pre
23a80 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 64  update.keyinfo.d
23a90 62 20 3d 20 64 62 3b 0a 20 20 70 72 65 75 70 64  b = db;.  preupd
23aa0 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 65 6e 63 20  ate.keyinfo.enc 
23ab0 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 70 72 65  = ENC(db);.  pre
23ac0 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e 6e  update.keyinfo.n
23ad0 46 69 65 6c 64 20 3d 20 70 54 61 62 2d 3e 6e 43  Field = pTab->nC
23ae0 6f 6c 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e  ol;.  preupdate.
23af0 6b 65 79 69 6e 66 6f 2e 61 53 6f 72 74 4f 72 64  keyinfo.aSortOrd
23b00 65 72 20 3d 20 28 75 38 2a 29 26 66 61 6b 65 53  er = (u8*)&fakeS
23b10 6f 72 74 4f 72 64 65 72 3b 0a 20 20 70 72 65 75  ortOrder;.  preu
23b20 70 64 61 74 65 2e 69 4b 65 79 31 20 3d 20 69 4b  pdate.iKey1 = iK
23b30 65 79 31 3b 0a 20 20 70 72 65 75 70 64 61 74 65  ey1;.  preupdate
23b40 2e 69 4b 65 79 32 20 3d 20 69 4b 65 79 32 3b 0a  .iKey2 = iKey2;.
23b50 20 20 70 72 65 75 70 64 61 74 65 2e 69 50 4b 65    preupdate.iPKe
23b60 79 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b  y = pTab->iPKey;
23b70 0a 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61  ..  db->pPreUpda
23b80 74 65 20 3d 20 26 70 72 65 75 70 64 61 74 65 3b  te = &preupdate;
23b90 0a 20 20 64 62 2d 3e 78 50 72 65 55 70 64 61 74  .  db->xPreUpdat
23ba0 65 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 50  eCallback(db->pP
23bb0 72 65 55 70 64 61 74 65 41 72 67 2c 20 64 62 2c  reUpdateArg, db,
23bc0 20 6f 70 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20   op, zDb, zTbl, 
23bd0 69 4b 65 79 31 2c 20 69 4b 65 79 32 29 3b 0a 20  iKey1, iKey2);. 
23be0 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65 20   db->pPreUpdate 
23bf0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
23c00 46 72 65 65 28 64 62 2c 20 70 72 65 75 70 64 61  Free(db, preupda
23c10 74 65 2e 61 52 65 63 6f 72 64 29 3b 0a 20 20 76  te.aRecord);.  v
23c20 64 62 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28  dbeFreeUnpacked(
23c30 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 70 55  db, preupdate.pU
23c40 6e 70 61 63 6b 65 64 29 3b 0a 20 20 76 64 62 65  npacked);.  vdbe
23c50 46 72 65 65 55 6e 70 61 63 6b 65 64 28 64 62 2c  FreeUnpacked(db,
23c60 20 70 72 65 75 70 64 61 74 65 2e 70 4e 65 77 55   preupdate.pNewU
23c70 6e 70 61 63 6b 65 64 29 3b 0a 20 20 69 66 28 20  npacked);.  if( 
23c80 70 72 65 75 70 64 61 74 65 2e 61 4e 65 77 20 29  preupdate.aNew )
23c90 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
23ca0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 73 72   for(i=0; i<pCsr
23cb0 2d 3e 6e 46 69 65 6c 64 3b 20 69 2b 2b 29 7b 0a  ->nField; i++){.
23cc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
23cd0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 70 72 65  eMemRelease(&pre
23ce0 75 70 64 61 74 65 2e 61 4e 65 77 5b 69 5d 29 3b  update.aNew[i]);
23cf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23d00 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 72 65  e3DbFree(db, pre
23d10 75 70 64 61 74 65 2e 61 4e 65 77 29 3b 0a 20 20  update.aNew);.  
23d20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  }.}.#endif /* SQ
23d30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55  LITE_ENABLE_PREU
23d40 50 44 41 54 45 5f 48 4f 4f 4b 20 2a 2f 0a        PDATE_HOOK */.