/ Hex Artifact Content
Login

Artifact 12831f89de66a23d575d129dc1bda543a09a80c7:


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 20 20 70 2d 3e  ->nOp;.  }.  p->
2c40: 69 46 69 78 65 64 4f 70 20 3d 20 76 2d 3e 6e 4f  iFixedOp = v->nO
2c50: 70 20 2d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  p - 1;.}../*.** 
2c60: 4d 61 72 6b 20 74 68 65 20 56 44 42 45 20 61 73  Mark the VDBE as
2c70: 20 6f 6e 65 20 74 68 61 74 20 63 61 6e 20 6f 6e   one that can on
2c80: 6c 79 20 62 65 20 72 75 6e 20 6f 6e 65 20 74 69  ly be run one ti
2c90: 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  me..*/.void sqli
2ca0: 74 65 33 56 64 62 65 52 75 6e 4f 6e 6c 79 4f 6e  te3VdbeRunOnlyOn
2cb0: 63 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70  ce(Vdbe *p){.  p
2cc0: 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20  ->runOnlyOnce = 
2cd0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b  1;.}../*.** Mark
2ce0: 20 74 68 65 20 56 44 42 45 20 61 73 20 6f 6e 65   the VDBE as one
2cf0: 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c 79 20 62   that can only b
2d00: 65 20 72 75 6e 20 6d 75 6c 74 69 70 6c 65 20 74  e run multiple t
2d10: 69 6d 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  imes..*/.void sq
2d20: 6c 69 74 65 33 56 64 62 65 52 65 75 73 61 62 6c  lite3VdbeReusabl
2d30: 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d  e(Vdbe *p){.  p-
2d40: 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 3d 20 30  >runOnlyOnce = 0
2d50: 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
2d60: 54 45 5f 44 45 42 55 47 20 2f 2a 20 73 71 6c 69  TE_DEBUG /* sqli
2d70: 74 65 33 41 73 73 65 72 74 4d 61 79 41 62 6f 72  te3AssertMayAbor
2d80: 74 28 29 20 6c 6f 67 69 63 20 2a 2f 0a 0a 2f 2a  t() logic */../*
2d90: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2da0: 67 20 74 79 70 65 20 61 6e 64 20 66 75 6e 63 74  g type and funct
2db0: 69 6f 6e 20 61 72 65 20 75 73 65 64 20 74 6f 20  ion are used to 
2dc0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
2dd0: 61 6c 6c 20 6f 70 63 6f 64 65 73 0a 2a 2a 20 69  all opcodes.** i
2de0: 6e 20 61 20 56 64 62 65 20 6d 61 69 6e 20 70 72  n a Vdbe main pr
2df0: 6f 67 72 61 6d 20 61 6e 64 20 65 61 63 68 20 6f  ogram and each o
2e00: 66 20 74 68 65 20 73 75 62 2d 70 72 6f 67 72 61  f the sub-progra
2e10: 6d 73 20 28 74 72 69 67 67 65 72 73 29 20 69 74  ms (triggers) it
2e20: 20 6d 61 79 20 0a 2a 2a 20 69 6e 76 6f 6b 65 20   may .** invoke 
2e30: 64 69 72 65 63 74 6c 79 20 6f 72 20 69 6e 64 69  directly or indi
2e40: 72 65 63 74 6c 79 2e 20 49 74 20 73 68 6f 75 6c  rectly. It shoul
2e50: 64 20 62 65 20 75 73 65 64 20 61 73 20 66 6f 6c  d be used as fol
2e60: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 4f 70  lows:.**.**   Op
2e70: 20 2a 70 4f 70 3b 0a 2a 2a 20 20 20 56 64 62 65   *pOp;.**   Vdbe
2e80: 4f 70 49 74 65 72 20 73 49 74 65 72 3b 0a 2a 2a  OpIter sIter;.**
2e90: 0a 2a 2a 20 20 20 6d 65 6d 73 65 74 28 26 73 49  .**   memset(&sI
2ea0: 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ter, 0, sizeof(s
2eb0: 49 74 65 72 29 29 3b 0a 2a 2a 20 20 20 73 49 74  Iter));.**   sIt
2ec0: 65 72 2e 76 20 3d 20 76 3b 20 20 20 20 20 20 20  er.v = v;       
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 20 20 20 20 2f 2f 20 76 20 69 73 20 6f 66 20       // v is of 
2ef0: 74 79 70 65 20 56 64 62 65 2a 20 0a 2a 2a 20 20  type Vdbe* .**  
2f00: 20 77 68 69 6c 65 28 20 28 70 4f 70 20 3d 20 6f   while( (pOp = o
2f10: 70 49 74 65 72 4e 65 78 74 28 26 73 49 74 65 72  pIterNext(&sIter
2f20: 29 29 20 29 7b 0a 2a 2a 20 20 20 20 20 2f 2f 20  )) ){.**     // 
2f30: 44 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 69 74  Do something wit
2f40: 68 20 70 4f 70 0a 2a 2a 20 20 20 7d 0a 2a 2a 20  h pOp.**   }.** 
2f50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
2f60: 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61 70 53  v->db, sIter.apS
2f70: 75 62 29 3b 0a 2a 2a 20 0a 2a 2f 0a 74 79 70 65  ub);.** .*/.type
2f80: 64 65 66 20 73 74 72 75 63 74 20 56 64 62 65 4f  def struct VdbeO
2f90: 70 49 74 65 72 20 56 64 62 65 4f 70 49 74 65 72  pIter VdbeOpIter
2fa0: 3b 0a 73 74 72 75 63 74 20 56 64 62 65 4f 70 49  ;.struct VdbeOpI
2fb0: 74 65 72 20 7b 0a 20 20 56 64 62 65 20 2a 76 3b  ter {.  Vdbe *v;
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 2f 2a 20 56 64 62 65 20 74 6f 20 69 74     /* Vdbe to it
2fe0: 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 74 68  erate through th
2ff0: 65 20 6f 70 63 6f 64 65 73 20 6f 66 20 2a 2f 0a  e opcodes of */.
3000: 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 2a 61    SubProgram **a
3010: 70 53 75 62 3b 20 20 20 20 20 20 20 20 2f 2a 20  pSub;        /* 
3020: 41 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  Array of subprog
3030: 72 61 6d 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  rams */.  int nS
3040: 75 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ub;             
3050: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3060: 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 70 53  f entries in apS
3070: 75 62 20 2a 2f 0a 20 20 69 6e 74 20 69 41 64 64  ub */.  int iAdd
3080: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
3090: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
30a0: 20 6e 65 78 74 20 69 6e 73 74 72 75 63 74 69 6f   next instructio
30b0: 6e 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  n to return */. 
30c0: 20 69 6e 74 20 69 53 75 62 3b 20 20 20 20 20 20   int iSub;      
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
30e0: 20 3d 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d 2c   = main program,
30f0: 20 31 20 3d 20 66 69 72 73 74 20 73 75 62 2d 70   1 = first sub-p
3100: 72 6f 67 72 61 6d 20 65 74 63 2e 20 2a 2f 0a 7d  rogram etc. */.}
3110: 3b 0a 73 74 61 74 69 63 20 4f 70 20 2a 6f 70 49  ;.static Op *opI
3120: 74 65 72 4e 65 78 74 28 56 64 62 65 4f 70 49 74  terNext(VdbeOpIt
3130: 65 72 20 2a 70 29 7b 0a 20 20 56 64 62 65 20 2a  er *p){.  Vdbe *
3140: 76 20 3d 20 70 2d 3e 76 3b 0a 20 20 4f 70 20 2a  v = p->v;.  Op *
3150: 70 52 65 74 20 3d 20 30 3b 0a 20 20 4f 70 20 2a  pRet = 0;.  Op *
3160: 61 4f 70 3b 0a 20 20 69 6e 74 20 6e 4f 70 3b 0a  aOp;.  int nOp;.
3170: 0a 20 20 69 66 28 20 70 2d 3e 69 53 75 62 3c 3d  .  if( p->iSub<=
3180: 70 2d 3e 6e 53 75 62 20 29 7b 0a 0a 20 20 20 20  p->nSub ){..    
3190: 69 66 28 20 70 2d 3e 69 53 75 62 3d 3d 30 20 29  if( p->iSub==0 )
31a0: 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d 20 76 2d  {.      aOp = v-
31b0: 3e 61 4f 70 3b 0a 20 20 20 20 20 20 6e 4f 70 20  >aOp;.      nOp 
31c0: 3d 20 76 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 65  = v->nOp;.    }e
31d0: 6c 73 65 7b 0a 20 20 20 20 20 20 61 4f 70 20 3d  lse{.      aOp =
31e0: 20 70 2d 3e 61 70 53 75 62 5b 70 2d 3e 69 53 75   p->apSub[p->iSu
31f0: 62 2d 31 5d 2d 3e 61 4f 70 3b 0a 20 20 20 20 20  b-1]->aOp;.     
3200: 20 6e 4f 70 20 3d 20 70 2d 3e 61 70 53 75 62 5b   nOp = p->apSub[
3210: 70 2d 3e 69 53 75 62 2d 31 5d 2d 3e 6e 4f 70 3b  p->iSub-1]->nOp;
3220: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
3230: 74 28 20 70 2d 3e 69 41 64 64 72 3c 6e 4f 70 20  t( p->iAddr<nOp 
3240: 29 3b 0a 0a 20 20 20 20 70 52 65 74 20 3d 20 26  );..    pRet = &
3250: 61 4f 70 5b 70 2d 3e 69 41 64 64 72 5d 3b 0a 20  aOp[p->iAddr];. 
3260: 20 20 20 70 2d 3e 69 41 64 64 72 2b 2b 3b 0a 20     p->iAddr++;. 
3270: 20 20 20 69 66 28 20 70 2d 3e 69 41 64 64 72 3d     if( p->iAddr=
3280: 3d 6e 4f 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  =nOp ){.      p-
3290: 3e 69 53 75 62 2b 2b 3b 0a 20 20 20 20 20 20 70  >iSub++;.      p
32a0: 2d 3e 69 41 64 64 72 20 3d 20 30 3b 0a 20 20 20  ->iAddr = 0;.   
32b0: 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 70 52   }.  .    if( pR
32c0: 65 74 2d 3e 70 34 74 79 70 65 3d 3d 50 34 5f 53  et->p4type==P4_S
32d0: 55 42 50 52 4f 47 52 41 4d 20 29 7b 0a 20 20 20  UBPROGRAM ){.   
32e0: 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28     int nByte = (
32f0: 70 2d 3e 6e 53 75 62 2b 31 29 2a 73 69 7a 65 6f  p->nSub+1)*sizeo
3300: 66 28 53 75 62 50 72 6f 67 72 61 6d 2a 29 3b 0a  f(SubProgram*);.
3310: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
3320: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 2d     for(j=0; j<p-
3330: 3e 6e 53 75 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nSub; j++){.   
3340: 20 20 20 20 20 69 66 28 20 70 2d 3e 61 70 53 75       if( p->apSu
3350: 62 5b 6a 5d 3d 3d 70 52 65 74 2d 3e 70 34 2e 70  b[j]==pRet->p4.p
3360: 50 72 6f 67 72 61 6d 20 29 20 62 72 65 61 6b 3b  Program ) break;
3370: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3380: 66 28 20 6a 3d 3d 70 2d 3e 6e 53 75 62 20 29 7b  f( j==p->nSub ){
3390: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53 75  .        p->apSu
33a0: 62 20 3d 20 73 71 6c 69 74 65 33 44 62 52 65 61  b = sqlite3DbRea
33b0: 6c 6c 6f 63 4f 72 46 72 65 65 28 76 2d 3e 64 62  llocOrFree(v->db
33c0: 2c 20 70 2d 3e 61 70 53 75 62 2c 20 6e 42 79 74  , p->apSub, nByt
33d0: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
33e0: 21 70 2d 3e 61 70 53 75 62 20 29 7b 0a 20 20 20  !p->apSub ){.   
33f0: 20 20 20 20 20 20 20 70 52 65 74 20 3d 20 30 3b         pRet = 0;
3400: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
3410: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 70 53            p->apS
3420: 75 62 5b 70 2d 3e 6e 53 75 62 2b 2b 5d 20 3d 20  ub[p->nSub++] = 
3430: 70 52 65 74 2d 3e 70 34 2e 70 50 72 6f 67 72 61  pRet->p4.pProgra
3440: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
3450: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
3460: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
3470: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
3480: 20 74 68 65 20 70 72 6f 67 72 61 6d 20 73 74 6f   the program sto
3490: 72 65 64 20 69 6e 20 74 68 65 20 56 4d 20 61 73  red in the VM as
34a0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50  sociated with pP
34b0: 61 72 73 65 20 6d 61 79 0a 2a 2a 20 74 68 72 6f  arse may.** thro
34c0: 77 20 61 6e 20 41 42 4f 52 54 20 65 78 63 65 70  w an ABORT excep
34d0: 74 69 6f 6e 20 28 63 61 75 73 69 6e 67 20 74 68  tion (causing th
34e0: 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 62 75 74  e statement, but
34f0: 20 6e 6f 74 20 65 6e 74 69 72 65 20 74 72 61 6e   not entire tran
3500: 73 61 63 74 69 6f 6e 0a 2a 2a 20 74 6f 20 62 65  saction.** to be
3510: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 29 2e 20 54   rolled back). T
3520: 68 69 73 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73  his condition is
3530: 20 74 72 75 65 20 69 66 20 74 68 65 20 6d 61 69   true if the mai
3540: 6e 20 70 72 6f 67 72 61 6d 20 6f 72 20 61 6e 79  n program or any
3550: 0a 2a 2a 20 73 75 62 2d 70 72 6f 67 72 61 6d 73  .** sub-programs
3560: 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 6f 66   contains any of
3570: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
3580: 2a 2a 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 48 61  **.**   *  OP_Ha
3590: 6c 74 20 77 69 74 68 20 50 31 3d 53 51 4c 49 54  lt with P1=SQLIT
35a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e 64  E_CONSTRAINT and
35b0: 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a 2a   P2=OE_Abort..**
35c0: 20 20 20 2a 20 20 4f 50 5f 48 61 6c 74 49 66 4e     *  OP_HaltIfN
35d0: 75 6c 6c 20 77 69 74 68 20 50 31 3d 53 51 4c 49  ull with P1=SQLI
35e0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 61 6e  TE_CONSTRAINT an
35f0: 64 20 50 32 3d 4f 45 5f 41 62 6f 72 74 2e 0a 2a  d P2=OE_Abort..*
3600: 2a 20 20 20 2a 20 20 4f 50 5f 44 65 73 74 72 6f  *   *  OP_Destro
3610: 79 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f 56 55 70  y.**   *  OP_VUp
3620: 64 61 74 65 0a 2a 2a 20 20 20 2a 20 20 4f 50 5f  date.**   *  OP_
3630: 56 52 65 6e 61 6d 65 0a 2a 2a 20 20 20 2a 20 20  VRename.**   *  
3640: 4f 50 5f 46 6b 43 6f 75 6e 74 65 72 20 77 69 74  OP_FkCounter wit
3650: 68 20 50 32 3d 3d 30 20 28 69 6d 6d 65 64 69 61  h P2==0 (immedia
3660: 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  te foreign key c
3670: 6f 6e 73 74 72 61 69 6e 74 29 0a 2a 2a 20 20 20  onstraint).**   
3680: 2a 20 20 4f 50 5f 43 72 65 61 74 65 54 61 62 6c  *  OP_CreateTabl
3690: 65 20 61 6e 64 20 4f 50 5f 49 6e 69 74 43 6f 72  e and OP_InitCor
36a0: 6f 75 74 69 6e 65 20 28 66 6f 72 20 43 52 45 41  outine (for CREA
36b0: 54 45 20 54 41 42 4c 45 20 41 53 20 53 45 4c 45  TE TABLE AS SELE
36c0: 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  CT ...).**.** Th
36d0: 65 6e 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  en check that th
36e0: 65 20 76 61 6c 75 65 20 6f 66 20 50 61 72 73 65  e value of Parse
36f0: 2e 6d 61 79 41 62 6f 72 74 20 69 73 20 74 72 75  .mayAbort is tru
3700: 65 20 69 66 20 61 6e 0a 2a 2a 20 41 42 4f 52 54  e if an.** ABORT
3710: 20 6d 61 79 20 62 65 20 74 68 72 6f 77 6e 2c 20   may be thrown, 
3720: 6f 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  or false otherwi
3730: 73 65 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  se. Return true 
3740: 69 66 20 69 74 20 64 6f 65 73 0a 2a 2a 20 6d 61  if it does.** ma
3750: 74 63 68 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74  tch, or false ot
3760: 68 65 72 77 69 73 65 2e 20 54 68 69 73 20 66 75  herwise. This fu
3770: 6e 63 74 69 6f 6e 20 69 73 20 69 6e 74 65 6e 64  nction is intend
3780: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 61 73  ed to be used as
3790: 0a 2a 2a 20 70 61 72 74 20 6f 66 20 61 6e 20 61  .** part of an a
37a0: 73 73 65 72 74 20 73 74 61 74 65 6d 65 6e 74 20  ssert statement 
37b0: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e  in the compiler.
37c0: 20 53 69 6d 69 6c 61 72 20 74 6f 3a 0a 2a 2a 0a   Similar to:.**.
37d0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  **   assert( sql
37e0: 69 74 65 33 56 64 62 65 41 73 73 65 72 74 4d 61  ite3VdbeAssertMa
37f0: 79 41 62 6f 72 74 28 70 50 61 72 73 65 2d 3e 70  yAbort(pParse->p
3800: 56 64 62 65 2c 20 70 50 61 72 73 65 2d 3e 6d 61  Vdbe, pParse->ma
3810: 79 41 62 6f 72 74 29 20 29 3b 0a 2a 2f 0a 69 6e  yAbort) );.*/.in
3820: 74 20 73 71 6c 69 74 65 33 56 64 62 65 41 73 73  t sqlite3VdbeAss
3830: 65 72 74 4d 61 79 41 62 6f 72 74 28 56 64 62 65  ertMayAbort(Vdbe
3840: 20 2a 76 2c 20 69 6e 74 20 6d 61 79 41 62 6f 72   *v, int mayAbor
3850: 74 29 7b 0a 20 20 69 6e 74 20 68 61 73 41 62 6f  t){.  int hasAbo
3860: 72 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 68 61  rt = 0;.  int ha
3870: 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 30 3b 0a  sFkCounter = 0;.
3880: 20 20 69 6e 74 20 68 61 73 43 72 65 61 74 65 54    int hasCreateT
3890: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  able = 0;.  int 
38a0: 68 61 73 49 6e 69 74 43 6f 72 6f 75 74 69 6e 65  hasInitCoroutine
38b0: 20 3d 20 30 3b 0a 20 20 4f 70 20 2a 70 4f 70 3b   = 0;.  Op *pOp;
38c0: 0a 20 20 56 64 62 65 4f 70 49 74 65 72 20 73 49  .  VdbeOpIter sI
38d0: 74 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ter;.  memset(&s
38e0: 49 74 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Iter, 0, sizeof(
38f0: 73 49 74 65 72 29 29 3b 0a 20 20 73 49 74 65 72  sIter));.  sIter
3900: 2e 76 20 3d 20 76 3b 0a 0a 20 20 77 68 69 6c 65  .v = v;..  while
3910: 28 20 28 70 4f 70 20 3d 20 6f 70 49 74 65 72 4e  ( (pOp = opIterN
3920: 65 78 74 28 26 73 49 74 65 72 29 29 21 3d 30 20  ext(&sIter))!=0 
3930: 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 63 6f 64  ){.    int opcod
3940: 65 20 3d 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3b  e = pOp->opcode;
3950: 0a 20 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d  .    if( opcode=
3960: 3d 4f 50 5f 44 65 73 74 72 6f 79 20 7c 7c 20 6f  =OP_Destroy || o
3970: 70 63 6f 64 65 3d 3d 4f 50 5f 56 55 70 64 61 74  pcode==OP_VUpdat
3980: 65 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f  e || opcode==OP_
3990: 56 52 65 6e 61 6d 65 20 0a 20 20 20 20 20 7c 7c  VRename .     ||
39a0: 20 28 28 6f 70 63 6f 64 65 3d 3d 4f 50 5f 48 61   ((opcode==OP_Ha
39b0: 6c 74 20 7c 7c 20 6f 70 63 6f 64 65 3d 3d 4f 50  lt || opcode==OP
39c0: 5f 48 61 6c 74 49 66 4e 75 6c 6c 29 20 0a 20 20  _HaltIfNull) .  
39d0: 20 20 20 20 26 26 20 28 28 70 4f 70 2d 3e 70 31      && ((pOp->p1
39e0: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43  &0xff)==SQLITE_C
39f0: 4f 4e 53 54 52 41 49 4e 54 20 26 26 20 70 4f 70  ONSTRAINT && pOp
3a00: 2d 3e 70 32 3d 3d 4f 45 5f 41 62 6f 72 74 29 29  ->p2==OE_Abort))
3a10: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 68 61  .    ){.      ha
3a20: 73 41 62 6f 72 74 20 3d 20 31 3b 0a 20 20 20 20  sAbort = 1;.    
3a30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3a40: 20 20 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f     if( opcode==O
3a50: 50 5f 43 72 65 61 74 65 54 61 62 6c 65 20 29 20  P_CreateTable ) 
3a60: 68 61 73 43 72 65 61 74 65 54 61 62 6c 65 20 3d  hasCreateTable =
3a70: 20 31 3b 0a 20 20 20 20 69 66 28 20 6f 70 63 6f   1;.    if( opco
3a80: 64 65 3d 3d 4f 50 5f 49 6e 69 74 43 6f 72 6f 75  de==OP_InitCorou
3a90: 74 69 6e 65 20 29 20 68 61 73 49 6e 69 74 43 6f  tine ) hasInitCo
3aa0: 72 6f 75 74 69 6e 65 20 3d 20 31 3b 0a 23 69 66  routine = 1;.#if
3ab0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
3ac0: 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 0a 20 20 20  _FOREIGN_KEY.   
3ad0: 20 69 66 28 20 6f 70 63 6f 64 65 3d 3d 4f 50 5f   if( opcode==OP_
3ae0: 46 6b 43 6f 75 6e 74 65 72 20 26 26 20 70 4f 70  FkCounter && pOp
3af0: 2d 3e 70 31 3d 3d 30 20 26 26 20 70 4f 70 2d 3e  ->p1==0 && pOp->
3b00: 70 32 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 68  p2==1 ){.      h
3b10: 61 73 46 6b 43 6f 75 6e 74 65 72 20 3d 20 31 3b  asFkCounter = 1;
3b20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
3b30: 7d 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  }.  sqlite3DbFre
3b40: 65 28 76 2d 3e 64 62 2c 20 73 49 74 65 72 2e 61  e(v->db, sIter.a
3b50: 70 53 75 62 29 3b 0a 0a 20 20 2f 2a 20 52 65 74  pSub);..  /* Ret
3b60: 75 72 6e 20 74 72 75 65 20 69 66 20 68 61 73 41  urn true if hasA
3b70: 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 2e 20  bort==mayAbort. 
3b80: 4f 72 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66  Or if a malloc f
3b90: 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
3ba0: 0a 20 20 2a 2a 20 49 66 20 6d 61 6c 6c 6f 63 20  .  ** If malloc 
3bb0: 66 61 69 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  failed, then the
3bc0: 20 77 68 69 6c 65 28 29 20 6c 6f 6f 70 20 61 62   while() loop ab
3bd0: 6f 76 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65  ove may not have
3be0: 20 69 74 65 72 61 74 65 64 0a 20 20 2a 2a 20 74   iterated.  ** t
3bf0: 68 72 6f 75 67 68 20 61 6c 6c 20 6f 70 63 6f 64  hrough all opcod
3c00: 65 73 20 61 6e 64 20 68 61 73 41 62 6f 72 74 20  es and hasAbort 
3c10: 6d 61 79 20 62 65 20 73 65 74 20 69 6e 63 6f 72  may be set incor
3c20: 72 65 63 74 6c 79 2e 20 52 65 74 75 72 6e 0a 20  rectly. Return. 
3c30: 20 2a 2a 20 74 72 75 65 20 66 6f 72 20 74 68 69   ** true for thi
3c40: 73 20 63 61 73 65 20 74 6f 20 70 72 65 76 65 6e  s case to preven
3c50: 74 20 74 68 65 20 61 73 73 65 72 74 28 29 20 69  t the assert() i
3c60: 6e 20 74 68 65 20 63 61 6c 6c 65 72 73 20 66 72  n the callers fr
3c70: 61 6d 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 66 61  ame.  ** from fa
3c80: 69 6c 69 6e 67 2e 20 20 2a 2f 0a 20 20 72 65 74  iling.  */.  ret
3c90: 75 72 6e 20 28 20 76 2d 3e 64 62 2d 3e 6d 61 6c  urn ( v->db->mal
3ca0: 6c 6f 63 46 61 69 6c 65 64 20 7c 7c 20 68 61 73  locFailed || has
3cb0: 41 62 6f 72 74 3d 3d 6d 61 79 41 62 6f 72 74 20  Abort==mayAbort 
3cc0: 7c 7c 20 68 61 73 46 6b 43 6f 75 6e 74 65 72 0a  || hasFkCounter.
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
3ce0: 20 28 68 61 73 43 72 65 61 74 65 54 61 62 6c 65   (hasCreateTable
3cf0: 20 26 26 20 68 61 73 49 6e 69 74 43 6f 72 6f 75   && hasInitCorou
3d00: 74 69 6e 65 29 20 29 3b 0a 7d 0a 23 65 6e 64 69  tine) );.}.#endi
3d10: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55  f /* SQLITE_DEBU
3d20: 47 20 2d 20 74 68 65 20 73 71 6c 69 74 65 33 41  G - the sqlite3A
3d30: 73 73 65 72 74 4d 61 79 41 62 6f 72 74 28 29 20  ssertMayAbort() 
3d40: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f 2a 0a  function */../*.
3d50: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3d60: 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  is called after 
3d70: 61 6c 6c 20 6f 70 63 6f 64 65 73 20 68 61 76 65  all opcodes have
3d80: 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 2e 20   been inserted. 
3d90: 20 49 74 20 6c 6f 6f 70 73 0a 2a 2a 20 74 68 72   It loops.** thr
3da0: 6f 75 67 68 20 61 6c 6c 20 74 68 65 20 6f 70 63  ough all the opc
3db0: 6f 64 65 73 20 61 6e 64 20 66 69 78 65 73 20 75  odes and fixes u
3dc0: 70 20 73 6f 6d 65 20 64 65 74 61 69 6c 73 2e 0a  p some details..
3dd0: 2a 2a 0a 2a 2a 20 28 31 29 20 46 6f 72 20 65 61  **.** (1) For ea
3de0: 63 68 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74  ch jump instruct
3df0: 69 6f 6e 20 77 69 74 68 20 61 20 6e 65 67 61 74  ion with a negat
3e00: 69 76 65 20 50 32 20 76 61 6c 75 65 20 28 61 20  ive P2 value (a 
3e10: 6c 61 62 65 6c 29 0a 2a 2a 20 20 20 20 20 72 65  label).**     re
3e20: 73 6f 6c 76 65 20 74 68 65 20 50 32 20 76 61 6c  solve the P2 val
3e30: 75 65 20 74 6f 20 61 6e 20 61 63 74 75 61 6c 20  ue to an actual 
3e40: 61 64 64 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 28  address..**.** (
3e50: 32 29 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6d  2) Compute the m
3e60: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
3e70: 20 61 72 67 75 6d 65 6e 74 73 20 75 73 65 64 20   arguments used 
3e80: 62 79 20 61 6e 79 20 53 51 4c 20 66 75 6e 63 74  by any SQL funct
3e90: 69 6f 6e 0a 2a 2a 20 20 20 20 20 61 6e 64 20 73  ion.**     and s
3ea0: 74 6f 72 65 20 74 68 61 74 20 76 61 6c 75 65 20  tore that value 
3eb0: 69 6e 20 2a 70 4d 61 78 46 75 6e 63 41 72 67 73  in *pMaxFuncArgs
3ec0: 2e 0a 2a 2a 0a 2a 2a 20 28 33 29 20 55 70 64 61  ..**.** (3) Upda
3ed0: 74 65 20 74 68 65 20 56 64 62 65 2e 72 65 61 64  te the Vdbe.read
3ee0: 4f 6e 6c 79 20 61 6e 64 20 56 64 62 65 2e 62 49  Only and Vdbe.bI
3ef0: 73 52 65 61 64 65 72 20 66 6c 61 67 73 20 74 6f  sReader flags to
3f00: 20 61 63 63 75 72 61 74 65 6c 79 0a 2a 2a 20 20   accurately.**  
3f10: 20 20 20 69 6e 64 69 63 61 74 65 20 77 68 61 74     indicate what
3f20: 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
3f30: 61 74 65 6d 65 6e 74 20 61 63 74 75 61 6c 6c 79  atement actually
3f40: 20 64 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 28 34 29   does..**.** (4)
3f50: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
3f60: 70 34 2e 78 41 64 76 61 6e 63 65 20 70 6f 69 6e  p4.xAdvance poin
3f70: 74 65 72 20 6f 6e 20 6f 70 63 6f 64 65 73 20 74  ter on opcodes t
3f80: 68 61 74 20 75 73 65 20 69 74 2e 0a 2a 2a 0a 2a  hat use it..**.*
3f90: 2a 20 28 35 29 20 52 65 63 6c 61 69 6d 20 74 68  * (5) Reclaim th
3fa0: 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  e memory allocat
3fb0: 65 64 20 66 6f 72 20 73 74 6f 72 69 6e 67 20 6c  ed for storing l
3fc0: 61 62 65 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  abels..**.** Thi
3fd0: 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
3fe0: 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 20 63 6f 72  nly function cor
3ff0: 72 65 63 74 6c 79 20 69 66 20 74 68 65 20 6d 6b  rectly if the mk
4000: 6f 70 63 6f 64 65 68 2e 74 63 6c 20 67 65 6e 65  opcodeh.tcl gene
4010: 72 61 74 6f 72 0a 2a 2a 20 73 63 72 69 70 74 20  rator.** script 
4020: 6e 75 6d 62 65 72 73 20 74 68 65 20 6f 70 63 6f  numbers the opco
4030: 64 65 73 20 63 6f 72 72 65 63 74 6c 79 2e 20 20  des correctly.  
4040: 43 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  Changes to this 
4050: 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 0a  routine must be.
4060: 2a 2a 20 63 6f 6f 72 64 69 6e 61 74 65 64 20 77  ** coordinated w
4070: 69 74 68 20 63 68 61 6e 67 65 73 20 74 6f 20 6d  ith changes to m
4080: 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 2e 0a 2a 2f  kopcodeh.tcl..*/
4090: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
40a0: 6f 6c 76 65 50 32 56 61 6c 75 65 73 28 56 64 62  olveP2Values(Vdb
40b0: 65 20 2a 70 2c 20 69 6e 74 20 2a 70 4d 61 78 46  e *p, int *pMaxF
40c0: 75 6e 63 41 72 67 73 29 7b 0a 20 20 69 6e 74 20  uncArgs){.  int 
40d0: 6e 4d 61 78 41 72 67 73 20 3d 20 2a 70 4d 61 78  nMaxArgs = *pMax
40e0: 46 75 6e 63 41 72 67 73 3b 0a 20 20 4f 70 20 2a  FuncArgs;.  Op *
40f0: 70 4f 70 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  pOp;.  Parse *pP
4100: 61 72 73 65 20 3d 20 70 2d 3e 70 50 61 72 73 65  arse = p->pParse
4110: 3b 0a 20 20 69 6e 74 20 2a 61 4c 61 62 65 6c 20  ;.  int *aLabel 
4120: 3d 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c  = pParse->aLabel
4130: 3b 0a 20 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  ;.  p->readOnly 
4140: 3d 20 31 3b 0a 20 20 70 2d 3e 62 49 73 52 65 61  = 1;.  p->bIsRea
4150: 64 65 72 20 3d 20 30 3b 0a 20 20 70 4f 70 20 3d  der = 0;.  pOp =
4160: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d   &p->aOp[p->nOp-
4170: 31 5d 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b 0a  1];.  while(1){.
4180: 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 4a 55 4d  .    /* Only JUM
4190: 50 20 6f 70 63 6f 64 65 73 20 61 6e 64 20 74 68  P opcodes and th
41a0: 65 20 73 68 6f 72 74 20 6c 69 73 74 20 6f 66 20  e short list of 
41b0: 73 70 65 63 69 61 6c 20 6f 70 63 6f 64 65 73 20  special opcodes 
41c0: 69 6e 20 74 68 65 20 73 77 69 74 63 68 0a 20 20  in the switch.  
41d0: 20 20 2a 2a 20 62 65 6c 6f 77 20 6e 65 65 64 20    ** below need 
41e0: 74 6f 20 62 65 20 63 6f 6e 73 69 64 65 72 65 64  to be considered
41f0: 2e 20 20 54 68 65 20 6d 6b 6f 70 63 6f 64 65 68  .  The mkopcodeh
4200: 2e 74 63 6c 20 67 65 6e 65 72 61 74 6f 72 20 73  .tcl generator s
4210: 63 72 69 70 74 20 67 72 6f 75 70 73 0a 20 20 20  cript groups.   
4220: 20 2a 2a 20 61 6c 6c 20 74 68 65 73 65 20 6f 70   ** all these op
4230: 63 6f 64 65 73 20 74 6f 67 65 74 68 65 72 20 6e  codes together n
4240: 65 61 72 20 74 68 65 20 66 72 6f 6e 74 20 6f 66  ear the front of
4250: 20 74 68 65 20 6f 70 63 6f 64 65 20 6c 69 73 74   the opcode list
4260: 2e 20 20 53 6b 69 70 0a 20 20 20 20 2a 2a 20 61  .  Skip.    ** a
4270: 6e 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 64  ny opcode that d
4280: 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 70 72 6f  oes not need pro
4290: 63 65 73 73 69 6e 67 20 62 79 20 76 69 72 74 75  cessing by virtu
42a0: 61 6c 20 6f 66 20 74 68 65 20 66 61 63 74 20 74  al of the fact t
42b0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  hat.    ** it is
42c0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 53 51 4c   larger than SQL
42d0: 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43 4f  ITE_MX_JUMP_OPCO
42e0: 44 45 2c 20 61 73 20 61 20 70 65 72 66 6f 72 6d  DE, as a perform
42f0: 61 6e 63 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ance optimizatio
4300: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
4310: 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 3c 3d 53  ( pOp->opcode<=S
4320: 51 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50  QLITE_MX_JUMP_OP
4330: 43 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 2f 2a  CODE ){.      /*
4340: 20 4e 4f 54 45 3a 20 42 65 20 73 75 72 65 20 74   NOTE: Be sure t
4350: 6f 20 75 70 64 61 74 65 20 6d 6b 6f 70 63 6f 64  o update mkopcod
4360: 65 68 2e 74 63 6c 20 77 68 65 6e 20 61 64 64 69  eh.tcl when addi
4370: 6e 67 20 6f 72 20 72 65 6d 6f 76 69 6e 67 0a 20  ng or removing. 
4380: 20 20 20 20 20 2a 2a 20 63 61 73 65 73 20 66 72       ** cases fr
4390: 6f 6d 20 74 68 69 73 20 73 77 69 74 63 68 21 20  om this switch! 
43a0: 2a 2f 0a 20 20 20 20 20 20 73 77 69 74 63 68 28  */.      switch(
43b0: 20 70 4f 70 2d 3e 6f 70 63 6f 64 65 20 29 7b 0a   pOp->opcode ){.
43c0: 20 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f          case OP_
43d0: 54 72 61 6e 73 61 63 74 69 6f 6e 3a 20 7b 0a 20  Transaction: {. 
43e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
43f0: 2d 3e 70 32 21 3d 30 20 29 20 70 2d 3e 72 65 61  ->p2!=0 ) p->rea
4400: 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20 20  dOnly = 0;.     
4410: 20 20 20 20 20 2f 2a 20 66 61 6c 6c 20 74 68 72       /* fall thr
4420: 75 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20  u */.        }. 
4430: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 41         case OP_A
4440: 75 74 6f 43 6f 6d 6d 69 74 3a 0a 20 20 20 20 20  utoCommit:.     
4450: 20 20 20 63 61 73 65 20 4f 50 5f 53 61 76 65 70     case OP_Savep
4460: 6f 69 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20 20  oint: {.        
4470: 20 20 70 2d 3e 62 49 73 52 65 61 64 65 72 20 3d    p->bIsReader =
4480: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
4490: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  eak;.        }.#
44a0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
44b0: 49 54 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 63  IT_WAL.        c
44c0: 61 73 65 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e  ase OP_Checkpoin
44d0: 74 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  t:.#endif.      
44e0: 20 20 63 61 73 65 20 4f 50 5f 56 61 63 75 75 6d    case OP_Vacuum
44f0: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 4f  :.        case O
4500: 50 5f 4a 6f 75 72 6e 61 6c 4d 6f 64 65 3a 20 7b  P_JournalMode: {
4510: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 65  .          p->re
4520: 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 20 20  adOnly = 0;.    
4530: 20 20 20 20 20 20 70 2d 3e 62 49 73 52 65 61 64        p->bIsRead
4540: 65 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  er = 1;.        
4550: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4560: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
4570: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4580: 42 4c 45 0a 20 20 20 20 20 20 20 20 63 61 73 65  BLE.        case
4590: 20 4f 50 5f 56 55 70 64 61 74 65 3a 20 7b 0a 20   OP_VUpdate: {. 
45a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
45b0: 2d 3e 70 32 3e 6e 4d 61 78 41 72 67 73 20 29 20  ->p2>nMaxArgs ) 
45c0: 6e 4d 61 78 41 72 67 73 20 3d 20 70 4f 70 2d 3e  nMaxArgs = pOp->
45d0: 70 32 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  p2;.          br
45e0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
45f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 56         case OP_V
4600: 46 69 6c 74 65 72 3a 20 7b 0a 20 20 20 20 20 20  Filter: {.      
4610: 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20      int n;.     
4620: 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 4f       assert( (pO
4630: 70 20 2d 20 70 2d 3e 61 4f 70 29 20 3e 3d 20 33  p - p->aOp) >= 3
4640: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73   );.          as
4650: 73 65 72 74 28 20 70 4f 70 5b 2d 31 5d 2e 6f 70  sert( pOp[-1].op
4660: 63 6f 64 65 3d 3d 4f 50 5f 49 6e 74 65 67 65 72  code==OP_Integer
4670: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 20   );.          n 
4680: 3d 20 70 4f 70 5b 2d 31 5d 2e 70 31 3b 0a 20 20  = pOp[-1].p1;.  
4690: 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 4d          if( n>nM
46a0: 61 78 41 72 67 73 20 29 20 6e 4d 61 78 41 72 67  axArgs ) nMaxArg
46b0: 73 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  s = n;.         
46c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
46d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
46e0: 20 63 61 73 65 20 4f 50 5f 4e 65 78 74 3a 0a 20   case OP_Next:. 
46f0: 20 20 20 20 20 20 20 63 61 73 65 20 4f 50 5f 4e         case OP_N
4700: 65 78 74 49 66 4f 70 65 6e 3a 0a 20 20 20 20 20  extIfOpen:.     
4710: 20 20 20 63 61 73 65 20 4f 50 5f 53 6f 72 74 65     case OP_Sorte
4720: 72 4e 65 78 74 3a 20 7b 0a 20 20 20 20 20 20 20  rNext: {.       
4730: 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64 76 61     pOp->p4.xAdva
4740: 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72  nce = sqlite3Btr
4750: 65 65 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  eeNext;.        
4760: 20 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20    pOp->p4type = 
4770: 50 34 5f 41 44 56 41 4e 43 45 3b 0a 20 20 20 20  P4_ADVANCE;.    
4780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4790: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
47a0: 61 73 65 20 4f 50 5f 50 72 65 76 3a 0a 20 20 20  ase OP_Prev:.   
47b0: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 50 72 65       case OP_Pre
47c0: 76 49 66 4f 70 65 6e 3a 20 7b 0a 20 20 20 20 20  vIfOpen: {.     
47d0: 20 20 20 20 20 70 4f 70 2d 3e 70 34 2e 78 41 64       pOp->p4.xAd
47e0: 76 61 6e 63 65 20 3d 20 73 71 6c 69 74 65 33 42  vance = sqlite3B
47f0: 74 72 65 65 50 72 65 76 69 6f 75 73 3b 0a 20 20  treePrevious;.  
4800: 20 20 20 20 20 20 20 20 70 4f 70 2d 3e 70 34 74          pOp->p4t
4810: 79 70 65 20 3d 20 50 34 5f 41 44 56 41 4e 43 45  ype = P4_ADVANCE
4820: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
4830: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
4840: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
4850: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 50 72 6f  sqlite3OpcodePro
4860: 70 65 72 74 79 5b 70 4f 70 2d 3e 6f 70 63 6f 64  perty[pOp->opcod
4870: 65 5d 20 26 20 4f 50 46 4c 47 5f 4a 55 4d 50 29  e] & OPFLG_JUMP)
4880: 21 3d 30 20 26 26 20 70 4f 70 2d 3e 70 32 3c 30  !=0 && pOp->p2<0
4890: 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
48a0: 72 74 28 20 41 44 44 52 28 70 4f 70 2d 3e 70 32  rt( ADDR(pOp->p2
48b0: 29 3c 70 50 61 72 73 65 2d 3e 6e 4c 61 62 65 6c  )<pParse->nLabel
48c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4f 70 2d   );.        pOp-
48d0: 3e 70 32 20 3d 20 61 4c 61 62 65 6c 5b 41 44 44  >p2 = aLabel[ADD
48e0: 52 28 70 4f 70 2d 3e 70 32 29 5d 3b 0a 20 20 20  R(pOp->p2)];.   
48f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4900: 66 28 20 70 4f 70 3d 3d 70 2d 3e 61 4f 70 20 29  f( pOp==p->aOp )
4910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 70 4f 70 2d   break;.    pOp-
4920: 2d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  -;.  }.  sqlite3
4930: 44 62 46 72 65 65 28 70 2d 3e 64 62 2c 20 70 50  DbFree(p->db, pP
4940: 61 72 73 65 2d 3e 61 4c 61 62 65 6c 29 3b 0a 20  arse->aLabel);. 
4950: 20 70 50 61 72 73 65 2d 3e 61 4c 61 62 65 6c 20   pParse->aLabel 
4960: 3d 20 30 3b 0a 20 20 70 50 61 72 73 65 2d 3e 6e  = 0;.  pParse->n
4970: 4c 61 62 65 6c 20 3d 20 30 3b 0a 20 20 2a 70 4d  Label = 0;.  *pM
4980: 61 78 46 75 6e 63 41 72 67 73 20 3d 20 6e 4d 61  axFuncArgs = nMa
4990: 78 41 72 67 73 3b 0a 20 20 61 73 73 65 72 74 28  xArgs;.  assert(
49a0: 20 70 2d 3e 62 49 73 52 65 61 64 65 72 21 3d 30   p->bIsReader!=0
49b0: 20 7c 7c 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72   || DbMaskAllZer
49c0: 6f 28 70 2d 3e 62 74 72 65 65 4d 61 73 6b 29 20  o(p->btreeMask) 
49d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
49e0: 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
49f0: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
4a00: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 73  uction to be ins
4a10: 65 72 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  erted..*/.int sq
4a20: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
4a30: 41 64 64 72 28 56 64 62 65 20 2a 70 29 7b 0a 20  Addr(Vdbe *p){. 
4a40: 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69   assert( p->magi
4a50: 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e  c==VDBE_MAGIC_IN
4a60: 49 54 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  IT );.  return p
4a70: 2d 3e 6e 4f 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ->nOp;.}../*.** 
4a80: 56 65 72 69 66 79 20 74 68 61 74 20 61 74 20 6c  Verify that at l
4a90: 65 61 73 74 20 4e 20 6f 70 63 6f 64 65 20 73 6c  east N opcode sl
4aa0: 6f 74 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c  ots are availabl
4ab0: 65 20 69 6e 20 70 20 77 69 74 68 6f 75 74 0a 2a  e in p without.*
4ac0: 2a 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 6c 6c  * having to mall
4ad0: 6f 63 20 66 6f 72 20 6d 6f 72 65 20 73 70 61 63  oc for more spac
4ae0: 65 20 28 65 78 63 65 70 74 20 77 68 65 6e 20 63  e (except when c
4af0: 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 0a 2a 2a  ompiled using.**
4b00: 20 53 51 4c 49 54 45 5f 54 45 53 54 5f 52 45 41   SQLITE_TEST_REA
4b10: 4c 4c 4f 43 5f 53 54 52 45 53 53 29 2e 20 20 54  LLOC_STRESS).  T
4b20: 68 69 73 20 69 6e 74 65 72 66 61 63 65 20 69 73  his interface is
4b30: 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65 73   used during tes
4b40: 74 69 6e 67 0a 2a 2a 20 74 6f 20 76 65 72 69 66  ting.** to verif
4b50: 79 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 63  y that certain c
4b60: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 56  alls to sqlite3V
4b70: 64 62 65 41 64 64 4f 70 4c 69 73 74 28 29 20 63  dbeAddOpList() c
4b80: 61 6e 20 6e 65 76 65 72 0a 2a 2a 20 66 61 69 6c  an never.** fail
4b90: 20 64 75 65 20 74 6f 20 61 20 4f 4f 4d 20 66 61   due to a OOM fa
4ba0: 75 6c 74 20 61 6e 64 20 68 65 6e 63 65 20 74 68  ult and hence th
4bb0: 61 74 20 74 68 65 20 72 65 74 75 72 6e 20 76 61  at the return va
4bc0: 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69  lue from.** sqli
4bd0: 74 65 33 56 64 62 65 41 64 64 4f 70 4c 69 73 74  te3VdbeAddOpList
4be0: 28 29 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62  () will always b
4bf0: 65 20 6e 6f 6e 2d 4e 55 4c 4c 2e 0a 2a 2f 0a 23  e non-NULL..*/.#
4c00: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
4c10: 45 5f 44 45 42 55 47 29 20 26 26 20 21 64 65 66  E_DEBUG) && !def
4c20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
4c30: 5f 52 45 41 4c 4c 4f 43 5f 53 54 52 45 53 53 29  _REALLOC_STRESS)
4c40: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
4c50: 65 56 65 72 69 66 79 4e 6f 4d 61 6c 6c 6f 63 52  eVerifyNoMallocR
4c60: 65 71 75 69 72 65 64 28 56 64 62 65 20 2a 70 2c  equired(Vdbe *p,
4c70: 20 69 6e 74 20 4e 29 7b 0a 20 20 61 73 73 65 72   int N){.  asser
4c80: 74 28 20 70 2d 3e 6e 4f 70 20 2b 20 4e 20 3c 3d  t( p->nOp + N <=
4c90: 20 70 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41   p->pParse->nOpA
4ca0: 6c 6c 6f 63 20 29 3b 0a 7d 0a 23 65 6e 64 69 66  lloc );.}.#endif
4cb0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
4cc0: 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20  ction returns a 
4cd0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61  pointer to the a
4ce0: 72 72 61 79 20 6f 66 20 6f 70 63 6f 64 65 73 20  rray of opcodes 
4cf0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a  associated with.
4d00: 2a 2a 20 74 68 65 20 56 64 62 65 20 70 61 73 73  ** the Vdbe pass
4d10: 65 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ed as the first 
4d20: 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 69 73 20  argument. It is 
4d30: 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
4d40: 6f 6e 73 69 62 69 6c 69 74 79 0a 2a 2a 20 74 6f  onsibility.** to
4d50: 20 61 72 72 61 6e 67 65 20 66 6f 72 20 74 68 65   arrange for the
4d60: 20 72 65 74 75 72 6e 65 64 20 61 72 72 61 79 20   returned array 
4d70: 74 6f 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79  to be eventually
4d80: 20 66 72 65 65 64 20 75 73 69 6e 67 20 74 68 65   freed using the
4d90: 20 0a 2a 2a 20 76 64 62 65 46 72 65 65 4f 70 41   .** vdbeFreeOpA
4da0: 72 72 61 79 28 29 20 66 75 6e 63 74 69 6f 6e 2e  rray() function.
4db0: 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 72 65  .**.** Before re
4dc0: 74 75 72 6e 69 6e 67 2c 20 2a 70 6e 4f 70 20 69  turning, *pnOp i
4dd0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
4de0: 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
4df0: 6e 20 74 68 65 20 72 65 74 75 72 6e 65 64 0a 2a  n the returned.*
4e00: 2a 20 61 72 72 61 79 2e 20 41 6c 73 6f 2c 20 2a  * array. Also, *
4e10: 70 6e 4d 61 78 41 72 67 20 69 73 20 73 65 74 20  pnMaxArg is set 
4e20: 74 6f 20 74 68 65 20 6c 61 72 67 65 72 20 6f 66  to the larger of
4e30: 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
4e40: 75 65 20 61 6e 64 20 0a 2a 2a 20 74 68 65 20 6e  ue and .** the n
4e50: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
4e60: 20 69 6e 20 74 68 65 20 56 64 62 65 2e 61 70 41   in the Vdbe.apA
4e70: 72 67 5b 5d 20 61 72 72 61 79 20 72 65 71 75 69  rg[] array requi
4e80: 72 65 64 20 74 6f 20 65 78 65 63 75 74 65 20 74  red to execute t
4e90: 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  he .** returned 
4ea0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 56 64 62 65  program..*/.Vdbe
4eb0: 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62 65 54  Op *sqlite3VdbeT
4ec0: 61 6b 65 4f 70 41 72 72 61 79 28 56 64 62 65 20  akeOpArray(Vdbe 
4ed0: 2a 70 2c 20 69 6e 74 20 2a 70 6e 4f 70 2c 20 69  *p, int *pnOp, i
4ee0: 6e 74 20 2a 70 6e 4d 61 78 41 72 67 29 7b 0a 20  nt *pnMaxArg){. 
4ef0: 20 56 64 62 65 4f 70 20 2a 61 4f 70 20 3d 20 70   VdbeOp *aOp = p
4f00: 2d 3e 61 4f 70 3b 0a 20 20 61 73 73 65 72 74 28  ->aOp;.  assert(
4f10: 20 61 4f 70 20 26 26 20 21 70 2d 3e 64 62 2d 3e   aOp && !p->db->
4f20: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
4f30: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
4f40: 20 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73   sqlite3VdbeUses
4f50: 42 74 72 65 65 28 29 20 77 61 73 20 6e 6f 74 20  Btree() was not 
4f60: 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 56  called on this V
4f70: 4d 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 44  M */.  assert( D
4f80: 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f 28 70 2d 3e  bMaskAllZero(p->
4f90: 62 74 72 65 65 4d 61 73 6b 29 20 29 3b 0a 0a 20  btreeMask) );.. 
4fa0: 20 72 65 73 6f 6c 76 65 50 32 56 61 6c 75 65 73   resolveP2Values
4fb0: 28 70 2c 20 70 6e 4d 61 78 41 72 67 29 3b 0a 20  (p, pnMaxArg);. 
4fc0: 20 2a 70 6e 4f 70 20 3d 20 70 2d 3e 6e 4f 70 3b   *pnOp = p->nOp;
4fd0: 0a 20 20 70 2d 3e 61 4f 70 20 3d 20 30 3b 0a 20  .  p->aOp = 0;. 
4fe0: 20 72 65 74 75 72 6e 20 61 4f 70 3b 0a 7d 0a 0a   return aOp;.}..
4ff0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 77 68 6f 6c  /*.** Add a whol
5000: 65 20 6c 69 73 74 20 6f 66 20 6f 70 65 72 61 74  e list of operat
5010: 69 6f 6e 73 20 74 6f 20 74 68 65 20 6f 70 65 72  ions to the oper
5020: 61 74 69 6f 6e 20 73 74 61 63 6b 2e 20 20 52 65  ation stack.  Re
5030: 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
5040: 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6f  r to the first o
5050: 70 65 72 61 74 69 6f 6e 20 69 6e 73 65 72 74 65  peration inserte
5060: 64 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 6e 2d 7a 65 72  d..**.** Non-zer
5070: 6f 20 50 32 20 61 72 67 75 6d 65 6e 74 73 20 74  o P2 arguments t
5080: 6f 20 6a 75 6d 70 20 69 6e 73 74 72 75 63 74 69  o jump instructi
5090: 6f 6e 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  ons are automati
50a0: 63 61 6c 6c 79 20 61 64 6a 75 73 74 65 64 0a 2a  cally adjusted.*
50b0: 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6a 75  * so that the ju
50c0: 6d 70 20 74 61 72 67 65 74 20 69 73 20 72 65 6c  mp target is rel
50d0: 61 74 69 76 65 20 74 6f 20 74 68 65 20 66 69 72  ative to the fir
50e0: 73 74 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 73  st operation ins
50f0: 65 72 74 65 64 2e 0a 2a 2f 0a 56 64 62 65 4f 70  erted..*/.VdbeOp
5100: 20 2a 73 71 6c 69 74 65 33 56 64 62 65 41 64 64   *sqlite3VdbeAdd
5110: 4f 70 4c 69 73 74 28 0a 20 20 56 64 62 65 20 2a  OpList(.  Vdbe *
5120: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
5130: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 6f 70         /* Add op
5140: 63 6f 64 65 73 20 74 6f 20 74 68 65 20 70 72 65  codes to the pre
5150: 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20  pared statement 
5160: 2a 2f 0a 20 20 69 6e 74 20 6e 4f 70 2c 20 20 20  */.  int nOp,   
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5180: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
5190: 70 63 6f 64 65 73 20 74 6f 20 61 64 64 20 2a 2f  pcodes to add */
51a0: 0a 20 20 56 64 62 65 4f 70 4c 69 73 74 20 63 6f  .  VdbeOpList co
51b0: 6e 73 74 20 2a 61 4f 70 2c 20 20 20 20 20 20 20  nst *aOp,       
51c0: 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 73 20 74  /* The opcodes t
51d0: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
51e0: 69 6e 74 20 69 4c 69 6e 65 6e 6f 20 20 20 20 20  int iLineno     
51f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5200: 53 6f 75 72 63 65 2d 66 69 6c 65 20 6c 69 6e 65  Source-file line
5210: 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 72 73 74   number of first
5220: 20 6f 70 63 6f 64 65 20 2a 2f 0a 29 7b 0a 20 20   opcode */.){.  
5230: 69 6e 74 20 69 3b 0a 20 20 56 64 62 65 4f 70 20  int i;.  VdbeOp 
5240: 2a 70 4f 75 74 2c 20 2a 70 46 69 72 73 74 3b 0a  *pOut, *pFirst;.
5250: 20 20 61 73 73 65 72 74 28 20 6e 4f 70 3e 30 20    assert( nOp>0 
5260: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
5270: 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49  magic==VDBE_MAGI
5280: 43 5f 49 4e 49 54 20 29 3b 0a 20 20 69 66 28 20  C_INIT );.  if( 
5290: 70 2d 3e 6e 4f 70 20 2b 20 6e 4f 70 20 3e 20 70  p->nOp + nOp > p
52a0: 2d 3e 70 50 61 72 73 65 2d 3e 6e 4f 70 41 6c 6c  ->pParse->nOpAll
52b0: 6f 63 20 26 26 20 67 72 6f 77 4f 70 41 72 72 61  oc && growOpArra
52c0: 79 28 70 2c 20 6e 4f 70 29 20 29 7b 0a 20 20 20  y(p, nOp) ){.   
52d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
52e0: 20 70 46 69 72 73 74 20 3d 20 70 4f 75 74 20 3d   pFirst = pOut =
52f0: 20 26 70 2d 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 5d   &p->aOp[p->nOp]
5300: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
5310: 4f 70 3b 20 69 2b 2b 2c 20 61 4f 70 2b 2b 2c 20  Op; i++, aOp++, 
5320: 70 4f 75 74 2b 2b 29 7b 0a 20 20 20 20 70 4f 75  pOut++){.    pOu
5330: 74 2d 3e 6f 70 63 6f 64 65 20 3d 20 61 4f 70 2d  t->opcode = aOp-
5340: 3e 6f 70 63 6f 64 65 3b 0a 20 20 20 20 70 4f 75  >opcode;.    pOu
5350: 74 2d 3e 70 31 20 3d 20 61 4f 70 2d 3e 70 31 3b  t->p1 = aOp->p1;
5360: 0a 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 3d 20  .    pOut->p2 = 
5370: 61 4f 70 2d 3e 70 32 3b 0a 20 20 20 20 61 73 73  aOp->p2;.    ass
5380: 65 72 74 28 20 61 4f 70 2d 3e 70 32 3e 3d 30 20  ert( aOp->p2>=0 
5390: 29 3b 0a 20 20 20 20 69 66 28 20 28 73 71 6c 69  );.    if( (sqli
53a0: 74 65 33 4f 70 63 6f 64 65 50 72 6f 70 65 72 74  te3OpcodePropert
53b0: 79 5b 61 4f 70 2d 3e 6f 70 63 6f 64 65 5d 20 26  y[aOp->opcode] &
53c0: 20 4f 50 46 4c 47 5f 4a 55 4d 50 29 21 3d 30 20   OPFLG_JUMP)!=0 
53d0: 26 26 20 61 4f 70 2d 3e 70 32 3e 30 20 29 7b 0a  && aOp->p2>0 ){.
53e0: 20 20 20 20 20 20 70 4f 75 74 2d 3e 70 32 20 2b        pOut->p2 +
53f0: 3d 20 70 2d 3e 6e 4f 70 3b 0a 20 20 20 20 7d 0a  = p->nOp;.    }.
5400: 20 20 20 20 70 4f 75 74 2d 3e 70 33 20 3d 20 61      pOut->p3 = a
5410: 4f 70 2d 3e 70 33 3b 0a 20 20 20 20 70 4f 75 74  Op->p3;.    pOut
5420: 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f  ->p4type = P4_NO
5430: 54 55 53 45 44 3b 0a 20 20 20 20 70 4f 75 74 2d  TUSED;.    pOut-
5440: 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20 20 20 70  >p4.p = 0;.    p
5450: 4f 75 74 2d 3e 70 35 20 3d 20 30 3b 0a 23 69 66  Out->p5 = 0;.#if
5460: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
5470: 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e  E_EXPLAIN_COMMEN
5480: 54 53 0a 20 20 20 20 70 4f 75 74 2d 3e 7a 43 6f  TS.    pOut->zCo
5490: 6d 6d 65 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69  mment = 0;.#endi
54a0: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
54b0: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
54c0: 20 20 70 4f 75 74 2d 3e 69 53 72 63 4c 69 6e 65    pOut->iSrcLine
54d0: 20 3d 20 69 4c 69 6e 65 6e 6f 2b 69 3b 0a 23 65   = iLineno+i;.#e
54e0: 6c 73 65 0a 20 20 20 20 28 76 6f 69 64 29 69 4c  lse.    (void)iL
54f0: 69 6e 65 6e 6f 3b 0a 23 65 6e 64 69 66 0a 23 69  ineno;.#endif.#i
5500: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
5510: 47 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62 2d  G.    if( p->db-
5520: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
5530: 56 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29  VdbeAddopTrace )
5540: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
5550: 64 62 65 50 72 69 6e 74 4f 70 28 30 2c 20 69 2b  dbePrintOp(0, i+
5560: 70 2d 3e 6e 4f 70 2c 20 26 70 2d 3e 61 4f 70 5b  p->nOp, &p->aOp[
5570: 69 2b 70 2d 3e 6e 4f 70 5d 29 3b 0a 20 20 20 20  i+p->nOp]);.    
5580: 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  }.#endif.  }.  p
5590: 2d 3e 6e 4f 70 20 2b 3d 20 6e 4f 70 3b 0a 20 20  ->nOp += nOp;.  
55a0: 72 65 74 75 72 6e 20 70 46 69 72 73 74 3b 0a 7d  return pFirst;.}
55b0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
55c0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54  LITE_ENABLE_STMT
55d0: 5f 53 43 41 4e 53 54 41 54 55 53 29 0a 2f 2a 0a  _SCANSTATUS)./*.
55e0: 2a 2a 20 41 64 64 20 61 6e 20 65 6e 74 72 79 20  ** Add an entry 
55f0: 74 6f 20 74 68 65 20 61 72 72 61 79 20 6f 66 20  to the array of 
5600: 63 6f 75 6e 74 65 72 73 20 6d 61 6e 61 67 65 64  counters managed
5610: 20 62 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   by sqlite3_stmt
5620: 5f 73 63 61 6e 73 74 61 74 75 73 28 29 2e 0a 2a  _scanstatus()..*
5630: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
5640: 62 65 53 63 61 6e 53 74 61 74 75 73 28 0a 20 20  beScanStatus(.  
5650: 56 64 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20  Vdbe *p,        
5660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5670: 2f 2a 20 56 4d 20 74 6f 20 61 64 64 20 73 63 61  /* VM to add sca
5680: 6e 73 74 61 74 75 73 28 29 20 74 6f 20 2a 2f 0a  nstatus() to */.
5690: 20 20 69 6e 74 20 61 64 64 72 45 78 70 6c 61 69    int addrExplai
56a0: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
56b0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
56c0: 4f 50 5f 45 78 70 6c 61 69 6e 20 28 6f 72 20 30  OP_Explain (or 0
56d0: 29 20 2a 2f 0a 20 20 69 6e 74 20 61 64 64 72 4c  ) */.  int addrL
56e0: 6f 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  oop,            
56f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73         /* Addres
5700: 73 20 6f 66 20 6c 6f 6f 70 20 63 6f 75 6e 74 65  s of loop counte
5710: 72 20 2a 2f 20 0a 20 20 69 6e 74 20 61 64 64 72  r */ .  int addr
5720: 56 69 73 69 74 2c 20 20 20 20 20 20 20 20 20 20  Visit,          
5730: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
5740: 73 73 20 6f 66 20 72 6f 77 73 20 76 69 73 69 74  ss of rows visit
5750: 65 64 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  ed counter */.  
5760: 4c 6f 67 45 73 74 20 6e 45 73 74 2c 20 20 20 20  LogEst nEst,    
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 2f 2a 20 45 73 74 69 6d 61 74 65 64 20 6e 75 6d  /* Estimated num
5790: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
57a0: 77 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ws */.  const ch
57b0: 61 72 20 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20  ar *zName       
57c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
57d0: 6f 66 20 74 61 62 6c 65 20 6f 72 20 69 6e 64 65  of table or inde
57e0: 78 20 62 65 69 6e 67 20 73 63 61 6e 6e 65 64 20  x being scanned 
57f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 42 79 74  */.){.  int nByt
5800: 65 20 3d 20 28 70 2d 3e 6e 53 63 61 6e 2b 31 29  e = (p->nScan+1)
5810: 20 2a 20 73 69 7a 65 6f 66 28 53 63 61 6e 53 74   * sizeof(ScanSt
5820: 61 74 75 73 29 3b 0a 20 20 53 63 61 6e 53 74 61  atus);.  ScanSta
5830: 74 75 73 20 2a 61 4e 65 77 3b 0a 20 20 61 4e 65  tus *aNew;.  aNe
5840: 77 20 3d 20 28 53 63 61 6e 53 74 61 74 75 73 2a  w = (ScanStatus*
5850: 29 73 71 6c 69 74 65 33 44 62 52 65 61 6c 6c 6f  )sqlite3DbReallo
5860: 63 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 53 63 61  c(p->db, p->aSca
5870: 6e 2c 20 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  n, nByte);.  if(
5880: 20 61 4e 65 77 20 29 7b 0a 20 20 20 20 53 63 61   aNew ){.    Sca
5890: 6e 53 74 61 74 75 73 20 2a 70 4e 65 77 20 3d 20  nStatus *pNew = 
58a0: 26 61 4e 65 77 5b 70 2d 3e 6e 53 63 61 6e 2b 2b  &aNew[p->nScan++
58b0: 5d 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 61 64 64  ];.    pNew->add
58c0: 72 45 78 70 6c 61 69 6e 20 3d 20 61 64 64 72 45  rExplain = addrE
58d0: 78 70 6c 61 69 6e 3b 0a 20 20 20 20 70 4e 65 77  xplain;.    pNew
58e0: 2d 3e 61 64 64 72 4c 6f 6f 70 20 3d 20 61 64 64  ->addrLoop = add
58f0: 72 4c 6f 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d  rLoop;.    pNew-
5900: 3e 61 64 64 72 56 69 73 69 74 20 3d 20 61 64 64  >addrVisit = add
5910: 72 56 69 73 69 74 3b 0a 20 20 20 20 70 4e 65 77  rVisit;.    pNew
5920: 2d 3e 6e 45 73 74 20 3d 20 6e 45 73 74 3b 0a 20  ->nEst = nEst;. 
5930: 20 20 20 70 4e 65 77 2d 3e 7a 4e 61 6d 65 20 3d     pNew->zName =
5940: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
5950: 28 70 2d 3e 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a  (p->db, zName);.
5960: 20 20 20 20 70 2d 3e 61 53 63 61 6e 20 3d 20 61      p->aScan = a
5970: 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  New;.  }.}.#endi
5980: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
5990: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
59a0: 65 20 6f 70 63 6f 64 65 2c 20 6f 72 20 50 31 2c  e opcode, or P1,
59b0: 20 50 32 2c 20 50 33 2c 20 6f 72 20 50 35 20 6f   P2, P3, or P5 o
59c0: 70 65 72 61 6e 64 73 0a 2a 2a 20 66 6f 72 20 61  perands.** for a
59d0: 20 73 70 65 63 69 66 69 63 20 69 6e 73 74 72 75   specific instru
59e0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
59f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
5a00: 4f 70 63 6f 64 65 28 56 64 62 65 20 2a 70 2c 20  Opcode(Vdbe *p, 
5a10: 75 33 32 20 61 64 64 72 2c 20 75 38 20 69 4e 65  u32 addr, u8 iNe
5a20: 77 4f 70 63 6f 64 65 29 7b 0a 20 20 73 71 6c 69  wOpcode){.  sqli
5a30: 74 65 33 56 64 62 65 47 65 74 4f 70 28 70 2c 61  te3VdbeGetOp(p,a
5a40: 64 64 72 29 2d 3e 6f 70 63 6f 64 65 20 3d 20 69  ddr)->opcode = i
5a50: 4e 65 77 4f 70 63 6f 64 65 3b 0a 7d 0a 76 6f 69  NewOpcode;.}.voi
5a60: 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61  d sqlite3VdbeCha
5a70: 6e 67 65 50 31 28 56 64 62 65 20 2a 70 2c 20 75  ngeP1(Vdbe *p, u
5a80: 33 32 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c  32 addr, int val
5a90: 29 7b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  ){.  sqlite3Vdbe
5aa0: 47 65 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70  GetOp(p,addr)->p
5ab0: 31 20 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20  1 = val;.}.void 
5ac0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
5ad0: 65 50 32 28 56 64 62 65 20 2a 70 2c 20 75 33 32  eP2(Vdbe *p, u32
5ae0: 20 61 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b   addr, int val){
5af0: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
5b00: 74 4f 70 28 70 2c 61 64 64 72 29 2d 3e 70 32 20  tOp(p,addr)->p2 
5b10: 3d 20 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71  = val;.}.void sq
5b20: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
5b30: 33 28 56 64 62 65 20 2a 70 2c 20 75 33 32 20 61  3(Vdbe *p, u32 a
5b40: 64 64 72 2c 20 69 6e 74 20 76 61 6c 29 7b 0a 20  ddr, int val){. 
5b50: 20 73 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f   sqlite3VdbeGetO
5b60: 70 28 70 2c 61 64 64 72 29 2d 3e 70 33 20 3d 20  p(p,addr)->p3 = 
5b70: 76 61 6c 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69  val;.}.void sqli
5b80: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
5b90: 56 64 62 65 20 2a 70 2c 20 75 38 20 70 35 29 7b  Vdbe *p, u8 p5){
5ba0: 0a 20 20 69 66 28 20 21 70 2d 3e 64 62 2d 3e 6d  .  if( !p->db->m
5bb0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 70 2d  allocFailed ) p-
5bc0: 3e 61 4f 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 70  >aOp[p->nOp-1].p
5bd0: 35 20 3d 20 70 35 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  5 = p5;.}../*.**
5be0: 20 43 68 61 6e 67 65 20 74 68 65 20 50 32 20 6f   Change the P2 o
5bf0: 70 65 72 61 6e 64 20 6f 66 20 69 6e 73 74 72 75  perand of instru
5c00: 63 74 69 6f 6e 20 61 64 64 72 20 73 6f 20 74 68  ction addr so th
5c10: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
5c20: 2a 2a 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  ** the address o
5c30: 66 20 74 68 65 20 6e 65 78 74 20 69 6e 73 74 72  f the next instr
5c40: 75 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6f 64  uction to be cod
5c50: 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ed..*/.void sqli
5c60: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
5c70: 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 61 64 64  Vdbe *p, int add
5c80: 72 29 7b 0a 20 20 70 2d 3e 70 50 61 72 73 65 2d  r){.  p->pParse-
5c90: 3e 69 46 69 78 65 64 4f 70 20 3d 20 70 2d 3e 6e  >iFixedOp = p->n
5ca0: 4f 70 20 2d 20 31 3b 0a 20 20 73 71 6c 69 74 65  Op - 1;.  sqlite
5cb0: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 70 2c  3VdbeChangeP2(p,
5cc0: 20 61 64 64 72 2c 20 70 2d 3e 6e 4f 70 29 3b 0a   addr, p->nOp);.
5cd0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  }.../*.** If the
5ce0: 20 69 6e 70 75 74 20 46 75 6e 63 44 65 66 20 73   input FuncDef s
5cf0: 74 72 75 63 74 75 72 65 20 69 73 20 65 70 68 65  tructure is ephe
5d00: 6d 65 72 61 6c 2c 20 74 68 65 6e 20 66 72 65 65  meral, then free
5d10: 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68 65 20   it.  If.** the 
5d20: 46 75 6e 63 44 65 66 20 69 73 20 6e 6f 74 20 65  FuncDef is not e
5d30: 70 68 65 72 6d 61 6c 2c 20 74 68 65 6e 20 64 6f  phermal, then do
5d40: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2f 0a 73 74 61   nothing..*/.sta
5d50: 74 69 63 20 76 6f 69 64 20 66 72 65 65 45 70 68  tic void freeEph
5d60: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 73  emeralFunction(s
5d70: 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e 63  qlite3 *db, Func
5d80: 44 65 66 20 2a 70 44 65 66 29 7b 0a 20 20 69 66  Def *pDef){.  if
5d90: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
5da0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
5db0: 5f 45 50 48 45 4d 29 21 3d 30 20 29 7b 0a 20 20  _EPHEM)!=0 ){.  
5dc0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
5dd0: 64 62 2c 20 70 44 65 66 29 3b 0a 20 20 7d 0a 7d  db, pDef);.  }.}
5de0: 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64  ..static void vd
5df0: 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 73 71  beFreeOpArray(sq
5e00: 6c 69 74 65 33 20 2a 2c 20 4f 70 20 2a 2c 20 69  lite3 *, Op *, i
5e10: 6e 74 29 3b 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  nt);../*.** Dele
5e20: 74 65 20 61 20 50 34 20 76 61 6c 75 65 20 69 66  te a P4 value if
5e30: 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2f 0a 73   necessary..*/.s
5e40: 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49  tatic SQLITE_NOI
5e50: 4e 4c 49 4e 45 20 76 6f 69 64 20 66 72 65 65 50  NLINE void freeP
5e60: 34 4d 65 6d 28 73 71 6c 69 74 65 33 20 2a 64 62  4Mem(sqlite3 *db
5e70: 2c 20 4d 65 6d 20 2a 70 29 7b 0a 20 20 69 66 28  , Mem *p){.  if(
5e80: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29 20 73   p->szMalloc ) s
5e90: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
5ea0: 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b 0a 20 20   p->zMalloc);.  
5eb0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5ec0: 2c 20 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 53  , p);.}.static S
5ed0: 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 76  QLITE_NOINLINE v
5ee0: 6f 69 64 20 66 72 65 65 50 34 46 75 6e 63 43 74  oid freeP4FuncCt
5ef0: 78 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 73  x(sqlite3 *db, s
5f00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5f10: 70 29 7b 0a 20 20 66 72 65 65 45 70 68 65 6d 65  p){.  freeEpheme
5f20: 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  ralFunction(db, 
5f30: 70 2d 3e 70 46 75 6e 63 29 3b 0a 20 20 73 71 6c  p->pFunc);.  sql
5f40: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5f50: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
5f60: 20 66 72 65 65 50 34 28 73 71 6c 69 74 65 33 20   freeP4(sqlite3 
5f70: 2a 64 62 2c 20 69 6e 74 20 70 34 74 79 70 65 2c  *db, int p4type,
5f80: 20 76 6f 69 64 20 2a 70 34 29 7b 0a 20 20 61 73   void *p4){.  as
5f90: 73 65 72 74 28 20 64 62 20 29 3b 0a 20 20 73 77  sert( db );.  sw
5fa0: 69 74 63 68 28 20 70 34 74 79 70 65 20 29 7b 0a  itch( p4type ){.
5fb0: 20 20 20 20 63 61 73 65 20 50 34 5f 46 55 4e 43      case P4_FUNC
5fc0: 43 54 58 3a 20 7b 0a 20 20 20 20 20 20 66 72 65  CTX: {.      fre
5fd0: 65 50 34 46 75 6e 63 43 74 78 28 64 62 2c 20 28  eP4FuncCtx(db, (
5fe0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
5ff0: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6000: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
6010: 65 20 50 34 5f 52 45 41 4c 3a 0a 20 20 20 20 63  e P4_REAL:.    c
6020: 61 73 65 20 50 34 5f 49 4e 54 36 34 3a 0a 20 20  ase P4_INT64:.  
6030: 20 20 63 61 73 65 20 50 34 5f 44 59 4e 41 4d 49    case P4_DYNAMI
6040: 43 3a 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49  C:.    case P4_I
6050: 4e 54 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20  NTARRAY: {.     
6060: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
6070: 62 2c 20 70 34 29 3b 0a 20 20 20 20 20 20 62 72  b, p4);.      br
6080: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
6090: 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f 3a 20  ase P4_KEYINFO: 
60a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  {.      if( db->
60b0: 70 6e 42 79 74 65 73 46 72 65 65 64 3d 3d 30 20  pnBytesFreed==0 
60c0: 29 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f  ) sqlite3KeyInfo
60d0: 55 6e 72 65 66 28 28 4b 65 79 49 6e 66 6f 2a 29  Unref((KeyInfo*)
60e0: 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  p4);.      break
60f0: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
6100: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52  QLITE_ENABLE_CUR
6110: 53 4f 52 5f 48 49 4e 54 53 0a 20 20 20 20 63 61  SOR_HINTS.    ca
6120: 73 65 20 50 34 5f 45 58 50 52 3a 20 7b 0a 20 20  se P4_EXPR: {.  
6130: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
6140: 65 6c 65 74 65 28 64 62 2c 20 28 45 78 70 72 2a  elete(db, (Expr*
6150: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6160: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
6170: 20 20 20 20 63 61 73 65 20 50 34 5f 4d 50 52 49      case P4_MPRI
6180: 4e 54 46 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NTF: {.      if(
6190: 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65   db->pnBytesFree
61a0: 64 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 66  d==0 ) sqlite3_f
61b0: 72 65 65 28 70 34 29 3b 0a 20 20 20 20 20 20 62  ree(p4);.      b
61c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
61d0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
61e0: 20 7b 0a 20 20 20 20 20 20 66 72 65 65 45 70 68   {.      freeEph
61f0: 65 6d 65 72 61 6c 46 75 6e 63 74 69 6f 6e 28 64  emeralFunction(d
6200: 62 2c 20 28 46 75 6e 63 44 65 66 2a 29 70 34 29  b, (FuncDef*)p4)
6210: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
6220: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 34     }.    case P4
6230: 5f 4d 45 4d 3a 20 7b 0a 20 20 20 20 20 20 69 66  _MEM: {.      if
6240: 28 20 64 62 2d 3e 70 6e 42 79 74 65 73 46 72 65  ( db->pnBytesFre
6250: 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ed==0 ){.       
6260: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
6270: 65 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  e((sqlite3_value
6280: 2a 29 70 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c  *)p4);.      }el
6290: 73 65 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65  se{.        free
62a0: 50 34 4d 65 6d 28 64 62 2c 20 28 4d 65 6d 2a 29  P4Mem(db, (Mem*)
62b0: 70 34 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  p4);.      }.   
62c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
62d0: 20 20 20 20 63 61 73 65 20 50 34 5f 56 54 41 42      case P4_VTAB
62e0: 20 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 64   : {.      if( d
62f0: 62 2d 3e 70 6e 42 79 74 65 73 46 72 65 65 64 3d  b->pnBytesFreed=
6300: 3d 30 20 29 20 73 71 6c 69 74 65 33 56 74 61 62  =0 ) sqlite3Vtab
6310: 55 6e 6c 6f 63 6b 28 28 56 54 61 62 6c 65 20 2a  Unlock((VTable *
6320: 29 70 34 29 3b 0a 20 20 20 20 20 20 62 72 65 61  )p4);.      brea
6330: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
6340: 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 73  /*.** Free the s
6350: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
6360: 6f 72 20 61 4f 70 20 61 6e 64 20 61 6e 79 20 70  or aOp and any p
6370: 34 20 76 61 6c 75 65 73 20 61 6c 6c 6f 63 61 74  4 values allocat
6380: 65 64 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6f 70  ed for the.** op
6390: 63 6f 64 65 73 20 63 6f 6e 74 61 69 6e 65 64 20  codes contained 
63a0: 77 69 74 68 69 6e 2e 20 49 66 20 61 4f 70 20 69  within. If aOp i
63b0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 69 74 20 69 73  s not NULL it is
63c0: 20 61 73 73 75 6d 65 64 20 74 6f 20 63 6f 6e 74   assumed to cont
63d0: 61 69 6e 20 0a 2a 2a 20 6e 4f 70 20 65 6e 74 72  ain .** nOp entr
63e0: 69 65 73 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ies. .*/.static 
63f0: 76 6f 69 64 20 76 64 62 65 46 72 65 65 4f 70 41  void vdbeFreeOpA
6400: 72 72 61 79 28 73 71 6c 69 74 65 33 20 2a 64 62  rray(sqlite3 *db
6410: 2c 20 4f 70 20 2a 61 4f 70 2c 20 69 6e 74 20 6e  , Op *aOp, int n
6420: 4f 70 29 7b 0a 20 20 69 66 28 20 61 4f 70 20 29  Op){.  if( aOp )
6430: 7b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  {.    Op *pOp;. 
6440: 20 20 20 66 6f 72 28 70 4f 70 3d 61 4f 70 3b 20     for(pOp=aOp; 
6450: 70 4f 70 3c 26 61 4f 70 5b 6e 4f 70 5d 3b 20 70  pOp<&aOp[nOp]; p
6460: 4f 70 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28  Op++){.      if(
6470: 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29 20 66   pOp->p4type ) f
6480: 72 65 65 50 34 28 64 62 2c 20 70 4f 70 2d 3e 70  reeP4(db, pOp->p
6490: 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70 34 2e 70  4type, pOp->p4.p
64a0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
64b0: 5f 45 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f  _ENABLE_EXPLAIN_
64c0: 43 4f 4d 4d 45 4e 54 53 0a 20 20 20 20 20 20 73  COMMENTS.      s
64d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
64e0: 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b   pOp->zComment);
64f0: 0a 23 65 6e 64 69 66 20 20 20 20 20 0a 20 20 20  .#endif     .   
6500: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
6510: 44 62 46 72 65 65 28 64 62 2c 20 61 4f 70 29 3b  DbFree(db, aOp);
6520: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 69 6e 6b 20 74  .}../*.** Link t
6530: 68 65 20 53 75 62 50 72 6f 67 72 61 6d 20 6f 62  he SubProgram ob
6540: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
6550: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
6560: 6e 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  nt into the link
6570: 65 64 0a 2a 2a 20 6c 69 73 74 20 61 74 20 56 64  ed.** list at Vd
6580: 62 65 2e 70 53 75 62 50 72 6f 67 72 61 6d 2e 20  be.pSubProgram. 
6590: 54 68 69 73 20 6c 69 73 74 20 69 73 20 75 73 65  This list is use
65a0: 64 20 74 6f 20 64 65 6c 65 74 65 20 61 6c 6c 20  d to delete all 
65b0: 73 75 62 2d 70 72 6f 67 72 61 6d 0a 2a 2a 20 6f  sub-program.** o
65c0: 62 6a 65 63 74 73 20 77 68 65 6e 20 74 68 65 20  bjects when the 
65d0: 56 4d 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  VM is no longer 
65e0: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 76 6f 69  required..*/.voi
65f0: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 69 6e  d sqlite3VdbeLin
6600: 6b 53 75 62 50 72 6f 67 72 61 6d 28 56 64 62 65  kSubProgram(Vdbe
6610: 20 2a 70 56 64 62 65 2c 20 53 75 62 50 72 6f 67   *pVdbe, SubProg
6620: 72 61 6d 20 2a 70 29 7b 0a 20 20 70 2d 3e 70 4e  ram *p){.  p->pN
6630: 65 78 74 20 3d 20 70 56 64 62 65 2d 3e 70 50 72  ext = pVdbe->pPr
6640: 6f 67 72 61 6d 3b 0a 20 20 70 56 64 62 65 2d 3e  ogram;.  pVdbe->
6650: 70 50 72 6f 67 72 61 6d 20 3d 20 70 3b 0a 7d 0a  pProgram = p;.}.
6660: 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
6670: 65 20 6f 70 63 6f 64 65 20 61 74 20 61 64 64 72  e opcode at addr
6680: 20 69 6e 74 6f 20 4f 50 5f 4e 6f 6f 70 0a 2a 2f   into OP_Noop.*/
6690: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
66a0: 43 68 61 6e 67 65 54 6f 4e 6f 6f 70 28 56 64 62  ChangeToNoop(Vdb
66b0: 65 20 2a 70 2c 20 69 6e 74 20 61 64 64 72 29 7b  e *p, int addr){
66c0: 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f 70 3b 0a  .  VdbeOp *pOp;.
66d0: 20 20 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c    if( p->db->mal
66e0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65 74 75  locFailed ) retu
66f0: 72 6e 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20  rn 0;.  assert( 
6700: 61 64 64 72 3e 3d 30 20 26 26 20 61 64 64 72 3c  addr>=0 && addr<
6710: 70 2d 3e 6e 4f 70 20 29 3b 0a 20 20 70 4f 70 20  p->nOp );.  pOp 
6720: 3d 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72 5d 3b  = &p->aOp[addr];
6730: 0a 20 20 66 72 65 65 50 34 28 70 2d 3e 64 62 2c  .  freeP4(p->db,
6740: 20 70 4f 70 2d 3e 70 34 74 79 70 65 2c 20 70 4f   pOp->p4type, pO
6750: 70 2d 3e 70 34 2e 70 29 3b 0a 20 20 70 4f 70 2d  p->p4.p);.  pOp-
6760: 3e 70 34 74 79 70 65 20 3d 20 50 34 5f 4e 4f 54  >p4type = P4_NOT
6770: 55 53 45 44 3b 0a 20 20 70 4f 70 2d 3e 70 34 2e  USED;.  pOp->p4.
6780: 7a 20 3d 20 30 3b 0a 20 20 70 4f 70 2d 3e 6f 70  z = 0;.  pOp->op
6790: 63 6f 64 65 20 3d 20 4f 50 5f 4e 6f 6f 70 3b 0a  code = OP_Noop;.
67a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
67b0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 61 73 74  *.** If the last
67c0: 20 6f 70 63 6f 64 65 20 69 73 20 22 6f 70 22 20   opcode is "op" 
67d0: 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 61 20  and it is not a 
67e0: 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e  jump destination
67f0: 2c 0a 2a 2a 20 74 68 65 6e 20 72 65 6d 6f 76 65  ,.** then remove
6800: 20 69 74 2e 20 20 52 65 74 75 72 6e 20 74 72 75   it.  Return tru
6810: 65 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66  e if and only if
6820: 20 61 6e 20 6f 70 63 6f 64 65 20 77 61 73 20 72   an opcode was r
6830: 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  emoved..*/.int s
6840: 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74 65  qlite3VdbeDelete
6850: 50 72 69 6f 72 4f 70 63 6f 64 65 28 56 64 62 65  PriorOpcode(Vdbe
6860: 20 2a 70 2c 20 75 38 20 6f 70 29 7b 0a 20 20 69   *p, u8 op){.  i
6870: 66 28 20 28 70 2d 3e 6e 4f 70 2d 31 29 3e 28 70  f( (p->nOp-1)>(p
6880: 2d 3e 70 50 61 72 73 65 2d 3e 69 46 69 78 65 64  ->pParse->iFixed
6890: 4f 70 29 20 26 26 20 70 2d 3e 61 4f 70 5b 70 2d  Op) && p->aOp[p-
68a0: 3e 6e 4f 70 2d 31 5d 2e 6f 70 63 6f 64 65 3d 3d  >nOp-1].opcode==
68b0: 6f 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  op ){.    return
68c0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
68d0: 67 65 54 6f 4e 6f 6f 70 28 70 2c 20 70 2d 3e 6e  geToNoop(p, p->n
68e0: 4f 70 2d 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Op-1);.  }else{.
68f0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6900: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  }.}../*.** Chang
6910: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
6920: 68 65 20 50 34 20 6f 70 65 72 61 6e 64 20 66 6f  he P4 operand fo
6930: 72 20 61 20 73 70 65 63 69 66 69 63 20 69 6e 73  r a specific ins
6940: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
6950: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
6960: 66 75 6c 20 77 68 65 6e 20 61 20 6c 61 72 67 65  ful when a large
6970: 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 6f 61 64   program is load
6980: 65 64 20 66 72 6f 6d 20 61 0a 2a 2a 20 73 74 61  ed from a.** sta
6990: 74 69 63 20 61 72 72 61 79 20 75 73 69 6e 67 20  tic array using 
69a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
69b0: 4c 69 73 74 20 62 75 74 20 77 65 20 77 61 6e 74  List but we want
69c0: 20 74 6f 20 6d 61 6b 65 20 61 0a 2a 2a 20 66 65   to make a.** fe
69d0: 77 20 6d 69 6e 6f 72 20 63 68 61 6e 67 65 73 20  w minor changes 
69e0: 74 6f 20 74 68 65 20 70 72 6f 67 72 61 6d 2e 0a  to the program..
69f0: 2a 2a 0a 2a 2a 20 49 66 20 6e 3e 3d 30 20 74 68  **.** If n>=0 th
6a00: 65 6e 20 74 68 65 20 50 34 20 6f 70 65 72 61 6e  en the P4 operan
6a10: 64 20 69 73 20 64 79 6e 61 6d 69 63 2c 20 6d 65  d is dynamic, me
6a20: 61 6e 69 6e 67 20 74 68 61 74 20 61 20 63 6f 70  aning that a cop
6a30: 79 20 6f 66 0a 2a 2a 20 74 68 65 20 73 74 72 69  y of.** the stri
6a40: 6e 67 20 69 73 20 6d 61 64 65 20 69 6e 74 6f 20  ng is made into 
6a50: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
6a60: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
6a70: 6c 6f 63 28 29 2e 0a 2a 2a 20 41 20 76 61 6c 75  loc()..** A valu
6a80: 65 20 6f 66 20 6e 3d 3d 30 20 6d 65 61 6e 73 20  e of n==0 means 
6a90: 63 6f 70 79 20 62 79 74 65 73 20 6f 66 20 7a 50  copy bytes of zP
6aa0: 34 20 75 70 20 74 6f 20 61 6e 64 20 69 6e 63 6c  4 up to and incl
6ab0: 75 64 69 6e 67 20 74 68 65 0a 2a 2a 20 66 69 72  uding the.** fir
6ac0: 73 74 20 6e 75 6c 6c 20 62 79 74 65 2e 20 20 49  st null byte.  I
6ad0: 66 20 6e 3e 30 20 74 68 65 6e 20 63 6f 70 79 20  f n>0 then copy 
6ae0: 6e 2b 31 20 62 79 74 65 73 20 6f 66 20 7a 50 34  n+1 bytes of zP4
6af0: 2e 0a 2a 2a 20 0a 2a 2a 20 4f 74 68 65 72 20 76  ..** .** Other v
6b00: 61 6c 75 65 73 20 6f 66 20 6e 20 28 50 34 5f 53  alues of n (P4_S
6b10: 54 41 54 49 43 2c 20 50 34 5f 43 4f 4c 4c 53 45  TATIC, P4_COLLSE
6b20: 51 20 65 74 63 2e 29 20 69 6e 64 69 63 61 74 65  Q etc.) indicate
6b30: 20 74 68 61 74 20 7a 50 34 20 70 6f 69 6e 74 73   that zP4 points
6b40: 0a 2a 2a 20 74 6f 20 61 20 73 74 72 69 6e 67 20  .** to a string 
6b50: 6f 72 20 73 74 72 75 63 74 75 72 65 20 74 68 61  or structure tha
6b60: 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
6b70: 74 6f 20 65 78 69 73 74 20 66 6f 72 20 74 68 65  to exist for the
6b80: 20 6c 69 66 65 74 69 6d 65 20 6f 66 0a 2a 2a 20   lifetime of.** 
6b90: 74 68 65 20 56 64 62 65 2e 20 49 6e 20 74 68 65  the Vdbe. In the
6ba0: 73 65 20 63 61 73 65 73 20 77 65 20 63 61 6e 20  se cases we can 
6bb0: 6a 75 73 74 20 63 6f 70 79 20 74 68 65 20 70 6f  just copy the po
6bc0: 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  inter..**.** If 
6bd0: 61 64 64 72 3c 30 20 74 68 65 6e 20 63 68 61 6e  addr<0 then chan
6be0: 67 65 20 50 34 20 6f 6e 20 74 68 65 20 6d 6f 73  ge P4 on the mos
6bf0: 74 20 72 65 63 65 6e 74 6c 79 20 69 6e 73 65 72  t recently inser
6c00: 74 65 64 20 69 6e 73 74 72 75 63 74 69 6f 6e 2e  ted instruction.
6c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6c20: 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
6c30: 76 64 62 65 43 68 61 6e 67 65 50 34 46 75 6c 6c  vdbeChangeP4Full
6c40: 28 0a 20 20 56 64 62 65 20 2a 70 2c 0a 20 20 4f  (.  Vdbe *p,.  O
6c50: 70 20 2a 70 4f 70 2c 0a 20 20 63 6f 6e 73 74 20  p *pOp,.  const 
6c60: 63 68 61 72 20 2a 7a 50 34 2c 0a 20 20 69 6e 74  char *zP4,.  int
6c70: 20 6e 0a 29 7b 0a 20 20 69 66 28 20 70 4f 70 2d   n.){.  if( pOp-
6c80: 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20 20 66  >p4type ){.    f
6c90: 72 65 65 50 34 28 70 2d 3e 64 62 2c 20 70 4f 70  reeP4(p->db, pOp
6ca0: 2d 3e 70 34 74 79 70 65 2c 20 70 4f 70 2d 3e 70  ->p4type, pOp->p
6cb0: 34 2e 70 29 3b 0a 20 20 20 20 70 4f 70 2d 3e 70  4.p);.    pOp->p
6cc0: 34 74 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 70  4type = 0;.    p
6cd0: 4f 70 2d 3e 70 34 2e 70 20 3d 20 30 3b 0a 20 20  Op->p4.p = 0;.  
6ce0: 7d 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  }.  if( n<0 ){. 
6cf0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
6d00: 61 6e 67 65 50 34 28 70 2c 20 28 69 6e 74 29 28  angeP4(p, (int)(
6d10: 70 4f 70 20 2d 20 70 2d 3e 61 4f 70 29 2c 20 7a  pOp - p->aOp), z
6d20: 50 34 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b  P4, n);.  }else{
6d30: 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 20  .    if( n==0 ) 
6d40: 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  n = sqlite3Strle
6d50: 6e 33 30 28 7a 50 34 29 3b 0a 20 20 20 20 70 4f  n30(zP4);.    pO
6d60: 70 2d 3e 70 34 2e 7a 20 3d 20 73 71 6c 69 74 65  p->p4.z = sqlite
6d70: 33 44 62 53 74 72 4e 44 75 70 28 70 2d 3e 64 62  3DbStrNDup(p->db
6d80: 2c 20 7a 50 34 2c 20 6e 29 3b 0a 20 20 20 20 70  , zP4, n);.    p
6d90: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
6da0: 44 59 4e 41 4d 49 43 3b 0a 20 20 7d 0a 7d 0a 76  DYNAMIC;.  }.}.v
6db0: 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43  oid sqlite3VdbeC
6dc0: 68 61 6e 67 65 50 34 28 56 64 62 65 20 2a 70 2c  hangeP4(Vdbe *p,
6dd0: 20 69 6e 74 20 61 64 64 72 2c 20 63 6f 6e 73 74   int addr, const
6de0: 20 63 68 61 72 20 2a 7a 50 34 2c 20 69 6e 74 20   char *zP4, int 
6df0: 6e 29 7b 0a 20 20 4f 70 20 2a 70 4f 70 3b 0a 20  n){.  Op *pOp;. 
6e00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
6e10: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
6e20: 20 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20    db = p->db;.  
6e30: 61 73 73 65 72 74 28 20 70 2d 3e 6d 61 67 69 63  assert( p->magic
6e40: 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49  ==VDBE_MAGIC_INI
6e50: 54 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  T );.  assert( p
6e60: 2d 3e 61 4f 70 21 3d 30 20 7c 7c 20 64 62 2d 3e  ->aOp!=0 || db->
6e70: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
6e80: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
6e90: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 69 66  Failed ){.    if
6ea0: 28 20 6e 21 3d 50 34 5f 56 54 41 42 20 29 20 66  ( n!=P4_VTAB ) f
6eb0: 72 65 65 50 34 28 64 62 2c 20 6e 2c 20 28 76 6f  reeP4(db, n, (vo
6ec0: 69 64 2a 29 2a 28 63 68 61 72 2a 2a 29 26 7a 50  id*)*(char**)&zP
6ed0: 34 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  4);.    return;.
6ee0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
6ef0: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
6f00: 72 74 28 20 61 64 64 72 3c 70 2d 3e 6e 4f 70 20  rt( addr<p->nOp 
6f10: 29 3b 0a 20 20 69 66 28 20 61 64 64 72 3c 30 20  );.  if( addr<0 
6f20: 29 7b 0a 20 20 20 20 61 64 64 72 20 3d 20 70 2d  ){.    addr = p-
6f30: 3e 6e 4f 70 20 2d 20 31 3b 0a 20 20 7d 0a 20 20  >nOp - 1;.  }.  
6f40: 70 4f 70 20 3d 20 26 70 2d 3e 61 4f 70 5b 61 64  pOp = &p->aOp[ad
6f50: 64 72 5d 3b 0a 20 20 69 66 28 20 6e 3e 3d 30 20  dr];.  if( n>=0 
6f60: 7c 7c 20 70 4f 70 2d 3e 70 34 74 79 70 65 20 29  || pOp->p4type )
6f70: 7b 0a 20 20 20 20 76 64 62 65 43 68 61 6e 67 65  {.    vdbeChange
6f80: 50 34 46 75 6c 6c 28 70 2c 20 70 4f 70 2c 20 7a  P4Full(p, pOp, z
6f90: 50 34 2c 20 6e 29 3b 0a 20 20 20 20 72 65 74 75  P4, n);.    retu
6fa0: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d  rn;.  }.  if( n=
6fb0: 3d 50 34 5f 49 4e 54 33 32 20 29 7b 0a 20 20 20  =P4_INT32 ){.   
6fc0: 20 2f 2a 20 4e 6f 74 65 3a 20 74 68 69 73 20 63   /* Note: this c
6fd0: 61 73 74 20 69 73 20 73 61 66 65 2c 20 62 65 63  ast is safe, bec
6fe0: 61 75 73 65 20 74 68 65 20 6f 72 69 67 69 6e 20  ause the origin 
6ff0: 64 61 74 61 20 70 6f 69 6e 74 20 77 61 73 20 61  data point was a
7000: 6e 20 69 6e 74 0a 20 20 20 20 2a 2a 20 74 68 61  n int.    ** tha
7010: 74 20 77 61 73 20 63 61 73 74 20 74 6f 20 61 20  t was cast to a 
7020: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 2e 20  (const char *). 
7030: 2a 2f 0a 20 20 20 20 70 4f 70 2d 3e 70 34 2e 69  */.    pOp->p4.i
7040: 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f   = SQLITE_PTR_TO
7050: 5f 49 4e 54 28 7a 50 34 29 3b 0a 20 20 20 20 70  _INT(zP4);.    p
7060: 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 50 34 5f  Op->p4type = P4_
7070: 49 4e 54 33 32 3b 0a 20 20 7d 65 6c 73 65 20 69  INT32;.  }else i
7080: 66 28 20 7a 50 34 21 3d 30 20 29 7b 0a 20 20 20  f( zP4!=0 ){.   
7090: 20 61 73 73 65 72 74 28 20 6e 3c 30 20 29 3b 0a   assert( n<0 );.
70a0: 20 20 20 20 70 4f 70 2d 3e 70 34 2e 70 20 3d 20      pOp->p4.p = 
70b0: 28 76 6f 69 64 2a 29 7a 50 34 3b 0a 20 20 20 20  (void*)zP4;.    
70c0: 70 4f 70 2d 3e 70 34 74 79 70 65 20 3d 20 28 73  pOp->p4type = (s
70d0: 69 67 6e 65 64 20 63 68 61 72 29 6e 3b 0a 20 20  igned char)n;.  
70e0: 20 20 69 66 28 20 6e 3d 3d 50 34 5f 56 54 41 42    if( n==P4_VTAB
70f0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 4c 6f   ) sqlite3VtabLo
7100: 63 6b 28 28 56 54 61 62 6c 65 2a 29 7a 50 34 29  ck((VTable*)zP4)
7110: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ;.  }.}../*.** S
7120: 65 74 20 74 68 65 20 50 34 20 6f 6e 20 74 68 65  et the P4 on the
7130: 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 61   most recently a
7140: 64 64 65 64 20 6f 70 63 6f 64 65 20 74 6f 20 74  dded opcode to t
7150: 68 65 20 4b 65 79 49 6e 66 6f 20 66 6f 72 20 74  he KeyInfo for t
7160: 68 65 0a 2a 2a 20 69 6e 64 65 78 20 67 69 76 65  he.** index give
7170: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  n..*/.void sqlit
7180: 65 33 56 64 62 65 53 65 74 50 34 4b 65 79 49 6e  e3VdbeSetP4KeyIn
7190: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
71a0: 2c 20 49 6e 64 65 78 20 2a 70 49 64 78 29 7b 0a  , Index *pIdx){.
71b0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
71c0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 61 73 73  se->pVdbe;.  ass
71d0: 65 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 61  ert( v!=0 );.  a
71e0: 73 73 65 72 74 28 20 70 49 64 78 21 3d 30 20 29  ssert( pIdx!=0 )
71f0: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 43  ;.  sqlite3VdbeC
7200: 68 61 6e 67 65 50 34 28 76 2c 20 2d 31 2c 20 28  hangeP4(v, -1, (
7210: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4b 65 79  char*)sqlite3Key
7220: 49 6e 66 6f 4f 66 49 6e 64 65 78 28 70 50 61 72  InfoOfIndex(pPar
7230: 73 65 2c 20 70 49 64 78 29 2c 0a 20 20 20 20 20  se, pIdx),.     
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 50 34 5f 4b 45 59 49 4e 46 4f 29 3b 0a 7d 0a   P4_KEYINFO);.}.
7260: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7270: 4e 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f  NABLE_EXPLAIN_CO
7280: 4d 4d 45 4e 54 53 0a 2f 2a 0a 2a 2a 20 43 68 61  MMENTS./*.** Cha
7290: 6e 67 65 20 74 68 65 20 63 6f 6d 6d 65 6e 74 20  nge the comment 
72a0: 6f 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  on the most rece
72b0: 6e 74 6c 79 20 63 6f 64 65 64 20 69 6e 73 74 72  ntly coded instr
72c0: 75 63 74 69 6f 6e 2e 20 20 4f 72 0a 2a 2a 20 69  uction.  Or.** i
72d0: 6e 73 65 72 74 20 61 20 4e 6f 2d 6f 70 20 61 6e  nsert a No-op an
72e0: 64 20 61 64 64 20 74 68 65 20 63 6f 6d 6d 65 6e  d add the commen
72f0: 74 20 74 6f 20 74 68 61 74 20 6e 65 77 20 69 6e  t to that new in
7300: 73 74 72 75 63 74 69 6f 6e 2e 20 20 54 68 69 73  struction.  This
7310: 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 63 6f  .** makes the co
7320: 64 65 20 65 61 73 69 65 72 20 74 6f 20 72 65 61  de easier to rea
7330: 64 20 64 75 72 69 6e 67 20 64 65 62 75 67 67 69  d during debuggi
7340: 6e 67 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 69  ng.  None of thi
7350: 73 20 68 61 70 70 65 6e 73 0a 2a 2a 20 69 6e 20  s happens.** in 
7360: 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75 69  a production bui
7370: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
7380: 69 64 20 76 64 62 65 56 43 6f 6d 6d 65 6e 74 28  id vdbeVComment(
7390: 56 64 62 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  Vdbe *p, const c
73a0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 76 61  har *zFormat, va
73b0: 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 61 73 73  _list ap){.  ass
73c0: 65 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 7c 7c  ert( p->nOp>0 ||
73d0: 20 70 2d 3e 61 4f 70 3d 3d 30 20 29 3b 0a 20 20   p->aOp==0 );.  
73e0: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 3d 3d  assert( p->aOp==
73f0: 30 20 7c 7c 20 70 2d 3e 61 4f 70 5b 70 2d 3e 6e  0 || p->aOp[p->n
7400: 4f 70 2d 31 5d 2e 7a 43 6f 6d 6d 65 6e 74 3d 3d  Op-1].zComment==
7410: 30 20 7c 7c 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c  0 || p->db->mall
7420: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69 66  ocFailed );.  if
7430: 28 20 70 2d 3e 6e 4f 70 20 29 7b 0a 20 20 20 20  ( p->nOp ){.    
7440: 61 73 73 65 72 74 28 20 70 2d 3e 61 4f 70 20 29  assert( p->aOp )
7450: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
7460: 72 65 65 28 70 2d 3e 64 62 2c 20 70 2d 3e 61 4f  ree(p->db, p->aO
7470: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
7480: 6d 65 6e 74 29 3b 0a 20 20 20 20 70 2d 3e 61 4f  ment);.    p->aO
7490: 70 5b 70 2d 3e 6e 4f 70 2d 31 5d 2e 7a 43 6f 6d  p[p->nOp-1].zCom
74a0: 6d 65 6e 74 20 3d 20 73 71 6c 69 74 65 33 56 4d  ment = sqlite3VM
74b0: 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 7a 46  Printf(p->db, zF
74c0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 7d 0a  ormat, ap);.  }.
74d0: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  }.void sqlite3Vd
74e0: 62 65 43 6f 6d 6d 65 6e 74 28 56 64 62 65 20 2a  beComment(Vdbe *
74f0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
7500: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
7510: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66  va_list ap;.  if
7520: 28 20 70 20 29 7b 0a 20 20 20 20 76 61 5f 73 74  ( p ){.    va_st
7530: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
7540: 3b 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65  ;.    vdbeVComme
7550: 6e 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  nt(p, zFormat, a
7560: 70 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61  p);.    va_end(a
7570: 70 29 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 73  p);.  }.}.void s
7580: 71 6c 69 74 65 33 56 64 62 65 4e 6f 6f 70 43 6f  qlite3VdbeNoopCo
7590: 6d 6d 65 6e 74 28 56 64 62 65 20 2a 70 2c 20 63  mment(Vdbe *p, c
75a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
75b0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
75c0: 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 70 20  ist ap;.  if( p 
75d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
75e0: 62 65 41 64 64 4f 70 30 28 70 2c 20 4f 50 5f 4e  beAddOp0(p, OP_N
75f0: 6f 6f 70 29 3b 0a 20 20 20 20 76 61 5f 73 74 61  oop);.    va_sta
7600: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
7610: 0a 20 20 20 20 76 64 62 65 56 43 6f 6d 6d 65 6e  .    vdbeVCommen
7620: 74 28 70 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  t(p, zFormat, ap
7630: 29 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70  );.    va_end(ap
7640: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
7650: 20 2f 2a 20 4e 44 45 42 55 47 20 2a 2f 0a 0a 23   /* NDEBUG */..#
7660: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
7670: 45 5f 43 4f 56 45 52 41 47 45 0a 2f 2a 0a 2a 2a  E_COVERAGE./*.**
7680: 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20 69   Set the value i
7690: 66 20 74 68 65 20 69 53 72 63 4c 69 6e 65 20 66  f the iSrcLine f
76a0: 69 65 6c 64 20 66 6f 72 20 74 68 65 20 70 72 65  ield for the pre
76b0: 76 69 6f 75 73 6c 79 20 63 6f 64 65 64 20 69 6e  viously coded in
76c0: 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  struction..*/.vo
76d0: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
76e0: 74 4c 69 6e 65 4e 75 6d 62 65 72 28 56 64 62 65  tLineNumber(Vdbe
76f0: 20 2a 76 2c 20 69 6e 74 20 69 4c 69 6e 65 29 7b   *v, int iLine){
7700: 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 47 65  .  sqlite3VdbeGe
7710: 74 4f 70 28 76 2c 2d 31 29 2d 3e 69 53 72 63 4c  tOp(v,-1)->iSrcL
7720: 69 6e 65 20 3d 20 69 4c 69 6e 65 3b 0a 7d 0a 23  ine = iLine;.}.#
7730: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
7740: 56 44 42 45 5f 43 4f 56 45 52 41 47 45 20 2a 2f  VDBE_COVERAGE */
7750: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
7760: 68 65 20 6f 70 63 6f 64 65 20 66 6f 72 20 61 20  he opcode for a 
7770: 67 69 76 65 6e 20 61 64 64 72 65 73 73 2e 20 20  given address.  
7780: 49 66 20 74 68 65 20 61 64 64 72 65 73 73 20 69  If the address i
7790: 73 20 2d 31 2c 20 74 68 65 6e 0a 2a 2a 20 72 65  s -1, then.** re
77a0: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
77b0: 63 65 6e 74 6c 79 20 69 6e 73 65 72 74 65 64 20  cently inserted 
77c0: 6f 70 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  opcode..**.** If
77d0: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
77e0: 74 69 6f 6e 20 65 72 72 6f 72 20 68 61 73 20 6f  tion error has o
77f0: 63 63 75 72 72 65 64 20 70 72 69 6f 72 20 74 6f  ccurred prior to
7800: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 6f 66 20   the calling of 
7810: 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c  this.** routine,
7820: 20 74 68 65 6e 20 61 20 70 6f 69 6e 74 65 72 20   then a pointer 
7830: 74 6f 20 61 20 64 75 6d 6d 79 20 56 64 62 65 4f  to a dummy VdbeO
7840: 70 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  p will be return
7850: 65 64 2e 20 20 54 68 61 74 20 6f 70 63 6f 64 65  ed.  That opcode
7860: 0a 2a 2a 20 69 73 20 72 65 61 64 61 62 6c 65 20  .** is readable 
7870: 62 75 74 20 6e 6f 74 20 77 72 69 74 61 62 6c 65  but not writable
7880: 2c 20 74 68 6f 75 67 68 20 69 74 20 69 73 20 63  , though it is c
7890: 61 73 74 20 74 6f 20 61 20 77 72 69 74 61 62 6c  ast to a writabl
78a0: 65 20 76 61 6c 75 65 2e 0a 2a 2a 20 54 68 65 20  e value..** The 
78b0: 72 65 74 75 72 6e 20 6f 66 20 61 20 64 75 6d 6d  return of a dumm
78c0: 79 20 6f 70 63 6f 64 65 20 61 6c 6c 6f 77 73 20  y opcode allows 
78d0: 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6f 6e 74  the call to cont
78e0: 69 6e 75 65 20 66 75 6e 63 74 69 6f 6e 69 6e 67  inue functioning
78f0: 0a 2a 2a 20 61 66 74 65 72 20 61 6e 20 4f 4f 4d  .** after an OOM
7900: 20 66 61 75 6c 74 20 77 69 74 68 6f 75 74 20 68   fault without h
7910: 61 76 69 6e 67 20 74 6f 20 63 68 65 63 6b 20 74  aving to check t
7920: 6f 20 73 65 65 20 69 66 20 74 68 65 20 72 65 74  o see if the ret
7930: 75 72 6e 20 66 72 6f 6d 20 0a 2a 2a 20 74 68 69  urn from .** thi
7940: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 76  s routine is a v
7950: 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 20 20 42  alid pointer.  B
7960: 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 64  ut because the d
7970: 75 6d 6d 79 2e 6f 70 63 6f 64 65 20 69 73 20 30  ummy.opcode is 0
7980: 2c 0a 2a 2a 20 64 75 6d 6d 79 20 77 69 6c 6c 20  ,.** dummy will 
7990: 6e 65 76 65 72 20 62 65 20 77 72 69 74 74 65 6e  never be written
79a0: 20 74 6f 2e 20 20 54 68 69 73 20 69 73 20 76 65   to.  This is ve
79b0: 72 69 66 69 65 64 20 62 79 20 63 6f 64 65 20 69  rified by code i
79c0: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  nspection and.**
79d0: 20 62 79 20 72 75 6e 6e 69 6e 67 20 77 69 74 68   by running with
79e0: 20 56 61 6c 67 72 69 6e 64 2e 0a 2a 2f 0a 56 64   Valgrind..*/.Vd
79f0: 62 65 4f 70 20 2a 73 71 6c 69 74 65 33 56 64 62  beOp *sqlite3Vdb
7a00: 65 47 65 74 4f 70 28 56 64 62 65 20 2a 70 2c 20  eGetOp(Vdbe *p, 
7a10: 69 6e 74 20 61 64 64 72 29 7b 0a 20 20 2f 2a 20  int addr){.  /* 
7a20: 43 38 39 20 73 70 65 63 69 66 69 65 73 20 74 68  C89 specifies th
7a30: 61 74 20 74 68 65 20 63 6f 6e 73 74 61 6e 74 20  at the constant 
7a40: 22 64 75 6d 6d 79 22 20 77 69 6c 6c 20 62 65 20  "dummy" will be 
7a50: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
7a60: 6c 6c 0a 20 20 2a 2a 20 7a 65 72 6f 73 2c 20 77  ll.  ** zeros, w
7a70: 68 69 63 68 20 69 73 20 63 6f 72 72 65 63 74 2e  hich is correct.
7a80: 20 20 4d 53 56 43 20 67 65 6e 65 72 61 74 65 73    MSVC generates
7a90: 20 61 20 77 61 72 6e 69 6e 67 2c 20 6e 65 76 65   a warning, neve
7aa0: 72 74 68 65 6c 65 73 73 2e 20 2a 2f 0a 20 20 73  rtheless. */.  s
7ab0: 74 61 74 69 63 20 56 64 62 65 4f 70 20 64 75 6d  tatic VdbeOp dum
7ac0: 6d 79 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74  my;  /* Ignore t
7ad0: 68 65 20 4d 53 56 43 20 77 61 72 6e 69 6e 67 20  he MSVC warning 
7ae0: 61 62 6f 75 74 20 6e 6f 20 69 6e 69 74 69 61 6c  about no initial
7af0: 69 7a 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74  izer */.  assert
7b00: 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45  ( p->magic==VDBE
7b10: 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20  _MAGIC_INIT );. 
7b20: 20 69 66 28 20 61 64 64 72 3c 30 20 29 7b 0a 20   if( addr<0 ){. 
7b30: 20 20 20 61 64 64 72 20 3d 20 70 2d 3e 6e 4f 70     addr = p->nOp
7b40: 20 2d 20 31 3b 0a 20 20 7d 0a 20 20 61 73 73 65   - 1;.  }.  asse
7b50: 72 74 28 20 28 61 64 64 72 3e 3d 30 20 26 26 20  rt( (addr>=0 && 
7b60: 61 64 64 72 3c 70 2d 3e 6e 4f 70 29 20 7c 7c 20  addr<p->nOp) || 
7b70: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
7b80: 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e  led );.  if( p->
7b90: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
7ba0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
7bb0: 56 64 62 65 4f 70 2a 29 26 64 75 6d 6d 79 3b 0a  VdbeOp*)&dummy;.
7bc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
7bd0: 75 72 6e 20 26 70 2d 3e 61 4f 70 5b 61 64 64 72  urn &p->aOp[addr
7be0: 5d 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64 65  ];.  }.}..#if de
7bf0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
7c00: 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d  BLE_EXPLAIN_COMM
7c10: 45 4e 54 53 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ENTS)./*.** Retu
7c20: 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  rn an integer va
7c30: 6c 75 65 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  lue for one of t
7c40: 68 65 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f  he parameters to
7c50: 20 74 68 65 20 6f 70 63 6f 64 65 20 70 4f 70 0a   the opcode pOp.
7c60: 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79  ** determined by
7c70: 20 63 68 61 72 61 63 74 65 72 20 63 2e 0a 2a 2f   character c..*/
7c80: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72 61 6e  .static int tran
7c90: 73 6c 61 74 65 50 28 63 68 61 72 20 63 2c 20 63  slateP(char c, c
7ca0: 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 29 7b 0a 20  onst Op *pOp){. 
7cb0: 20 69 66 28 20 63 3d 3d 27 31 27 20 29 20 72 65   if( c=='1' ) re
7cc0: 74 75 72 6e 20 70 4f 70 2d 3e 70 31 3b 0a 20 20  turn pOp->p1;.  
7cd0: 69 66 28 20 63 3d 3d 27 32 27 20 29 20 72 65 74  if( c=='2' ) ret
7ce0: 75 72 6e 20 70 4f 70 2d 3e 70 32 3b 0a 20 20 69  urn pOp->p2;.  i
7cf0: 66 28 20 63 3d 3d 27 33 27 20 29 20 72 65 74 75  f( c=='3' ) retu
7d00: 72 6e 20 70 4f 70 2d 3e 70 33 3b 0a 20 20 69 66  rn pOp->p3;.  if
7d10: 28 20 63 3d 3d 27 34 27 20 29 20 72 65 74 75 72  ( c=='4' ) retur
7d20: 6e 20 70 4f 70 2d 3e 70 34 2e 69 3b 0a 20 20 72  n pOp->p4.i;.  r
7d30: 65 74 75 72 6e 20 70 4f 70 2d 3e 70 35 3b 0a 7d  eturn pOp->p5;.}
7d40: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20  ../*.** Compute 
7d50: 61 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65  a string for the
7d60: 20 22 63 6f 6d 6d 65 6e 74 22 20 66 69 65 6c 64   "comment" field
7d70: 20 6f 66 20 61 20 56 44 42 45 20 6f 70 63 6f 64   of a VDBE opcod
7d80: 65 20 6c 69 73 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  e listing..**.**
7d90: 20 54 68 65 20 53 79 6e 6f 70 73 69 73 3a 20 66   The Synopsis: f
7da0: 69 65 6c 64 20 69 6e 20 63 6f 6d 6d 65 6e 74 73  ield in comments
7db0: 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20 73   in the vdbe.c s
7dc0: 6f 75 72 63 65 20 66 69 6c 65 20 67 65 74 73 20  ource file gets 
7dd0: 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
7de0: 61 6e 20 65 78 74 72 61 20 73 74 72 69 6e 67 20  an extra string 
7df0: 74 68 61 74 20 69 73 20 61 70 70 65 6e 64 65 64  that is appended
7e00: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 4f   to the sqlite3O
7e10: 70 63 6f 64 65 4e 61 6d 65 28 29 2e 20 20 49 6e  pcodeName().  In
7e20: 20 74 68 65 0a 2a 2a 20 61 62 73 65 6e 63 65 20   the.** absence 
7e30: 6f 66 20 6f 74 68 65 72 20 63 6f 6d 6d 65 6e 74  of other comment
7e40: 73 2c 20 74 68 69 73 20 73 79 6e 6f 70 73 69 73  s, this synopsis
7e50: 20 62 65 63 6f 6d 65 73 20 74 68 65 20 63 6f 6d   becomes the com
7e60: 6d 65 6e 74 20 6f 6e 20 74 68 65 20 6f 70 63 6f  ment on the opco
7e70: 64 65 2e 0a 2a 2a 20 53 6f 6d 65 20 74 72 61 6e  de..** Some tran
7e80: 73 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73 3a 0a  slation occurs:.
7e90: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 22  **.**       "PX"
7ea0: 20 20 20 20 20 20 2d 3e 20 20 22 72 5b 58 5d 22        ->  "r[X]"
7eb0: 0a 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59  .**       "PX@PY
7ec0: 22 20 20 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b  "   ->  "r[X..X+
7ed0: 59 2d 31 5d 22 20 20 6f 72 20 22 72 5b 78 5d 22  Y-1]"  or "r[x]"
7ee0: 20 69 66 20 79 20 69 73 20 30 20 6f 72 20 31 0a   if y is 0 or 1.
7ef0: 2a 2a 20 20 20 20 20 20 20 22 50 58 40 50 59 2b  **       "PX@PY+
7f00: 31 22 20 2d 3e 20 20 22 72 5b 58 2e 2e 58 2b 59  1" ->  "r[X..X+Y
7f10: 5d 22 20 20 20 20 6f 72 20 22 72 5b 78 5d 22 20  ]"    or "r[x]" 
7f20: 69 66 20 79 20 69 73 20 30 0a 2a 2a 20 20 20 20  if y is 0.**    
7f30: 20 20 20 22 50 59 2e 2e 50 59 22 20 20 2d 3e 20     "PY..PY"  -> 
7f40: 20 22 72 5b 58 2e 2e 59 5d 22 20 20 20 20 20 20   "r[X..Y]"      
7f50: 6f 72 20 22 72 5b 78 5d 22 20 69 66 20 79 3c 3d  or "r[x]" if y<=
7f60: 78 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  x.*/.static int 
7f70: 64 69 73 70 6c 61 79 43 6f 6d 6d 65 6e 74 28 0a  displayComment(.
7f80: 20 20 63 6f 6e 73 74 20 4f 70 20 2a 70 4f 70 2c    const Op *pOp,
7f90: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
7fa0: 64 65 20 74 6f 20 62 65 20 63 6f 6d 6d 65 6e 74  de to be comment
7fb0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
7fc0: 61 72 20 2a 7a 50 34 2c 20 20 20 2f 2a 20 50 72  ar *zP4,   /* Pr
7fd0: 65 76 69 6f 75 73 6c 79 20 6f 62 74 61 69 6e 65  eviously obtaine
7fe0: 64 20 76 61 6c 75 65 20 66 6f 72 20 50 34 20 2a  d value for P4 *
7ff0: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c  /.  char *zTemp,
8000: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
8010: 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a 20  result here */. 
8020: 20 69 6e 74 20 6e 54 65 6d 70 20 20 20 20 20 20   int nTemp      
8030: 20 20 20 20 2f 2a 20 53 70 61 63 65 20 61 76 61      /* Space ava
8040: 69 6c 61 62 6c 65 20 69 6e 20 7a 54 65 6d 70 5b  ilable in zTemp[
8050: 5d 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  ] */.){.  const 
8060: 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20  char *zOpName;. 
8070: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 79   const char *zSy
8080: 6e 6f 70 73 69 73 3b 0a 20 20 69 6e 74 20 6e 4f  nopsis;.  int nO
8090: 70 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 69 2c  pName;.  int ii,
80a0: 20 6a 6a 3b 0a 20 20 63 68 61 72 20 7a 41 6c 74   jj;.  char zAlt
80b0: 5b 35 30 5d 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20  [50];.  zOpName 
80c0: 3d 20 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e  = sqlite3OpcodeN
80d0: 61 6d 65 28 70 4f 70 2d 3e 6f 70 63 6f 64 65 29  ame(pOp->opcode)
80e0: 3b 0a 20 20 6e 4f 70 4e 61 6d 65 20 3d 20 73 71  ;.  nOpName = sq
80f0: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f  lite3Strlen30(zO
8100: 70 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 4f  pName);.  if( zO
8110: 70 4e 61 6d 65 5b 6e 4f 70 4e 61 6d 65 2b 31 5d  pName[nOpName+1]
8120: 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 65 65 6e   ){.    int seen
8130: 43 6f 6d 20 3d 20 30 3b 0a 20 20 20 20 63 68 61  Com = 0;.    cha
8140: 72 20 63 3b 0a 20 20 20 20 7a 53 79 6e 6f 70 73  r c;.    zSynops
8150: 69 73 20 3d 20 7a 4f 70 4e 61 6d 65 20 2b 3d 20  is = zOpName += 
8160: 6e 4f 70 4e 61 6d 65 20 2b 20 31 3b 0a 20 20 20  nOpName + 1;.   
8170: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
8180: 6e 6f 70 73 69 73 2c 22 49 46 20 22 2c 33 29 3d  nopsis,"IF ",3)=
8190: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
81a0: 70 4f 70 2d 3e 70 35 20 26 20 53 51 4c 49 54 45  pOp->p5 & SQLITE
81b0: 5f 53 54 4f 52 45 50 32 20 29 7b 0a 20 20 20 20  _STOREP2 ){.    
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 72 5b 50 32 5d 20  ), zAlt, "r[P2] 
81f0: 3d 20 28 25 73 29 22 2c 20 7a 53 79 6e 6f 70 73  = (%s)", zSynops
8200: 69 73 2b 33 29 3b 0a 20 20 20 20 20 20 7d 65 6c  is+3);.      }el
8210: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8220: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
8230: 65 6f 66 28 7a 41 6c 74 29 2c 20 7a 41 6c 74 2c  eof(zAlt), zAlt,
8240: 20 22 69 66 20 25 73 20 67 6f 74 6f 20 50 32 22   "if %s goto P2"
8250: 2c 20 7a 53 79 6e 6f 70 73 69 73 2b 33 29 3b 0a  , zSynopsis+3);.
8260: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
8270: 79 6e 6f 70 73 69 73 20 3d 20 7a 41 6c 74 3b 0a  ynopsis = zAlt;.
8280: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69      }.    for(ii
8290: 3d 6a 6a 3d 30 3b 20 6a 6a 3c 6e 54 65 6d 70 2d  =jj=0; jj<nTemp-
82a0: 31 20 26 26 20 28 63 20 3d 20 7a 53 79 6e 6f 70  1 && (c = zSynop
82b0: 73 69 73 5b 69 69 5d 29 21 3d 30 3b 20 69 69 2b  sis[ii])!=0; ii+
82c0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  +){.      if( c=
82d0: 3d 27 50 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='P' ){.        
82e0: 63 20 3d 20 7a 53 79 6e 6f 70 73 69 73 5b 2b 2b  c = zSynopsis[++
82f0: 69 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii];.        if(
8300: 20 63 3d 3d 27 34 27 20 29 7b 0a 20 20 20 20 20   c=='4' ){.     
8310: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
8320: 72 69 6e 74 66 28 6e 54 65 6d 70 2d 6a 6a 2c 20  rintf(nTemp-jj, 
8330: 7a 54 65 6d 70 2b 6a 6a 2c 20 22 25 73 22 2c 20  zTemp+jj, "%s", 
8340: 7a 50 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  zP4);.        }e
8350: 6c 73 65 20 69 66 28 20 63 3d 3d 27 58 27 20 29  lse if( c=='X' )
8360: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
8370: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8380: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
8390: 20 22 25 73 22 2c 20 70 4f 70 2d 3e 7a 43 6f 6d   "%s", pOp->zCom
83a0: 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20  ment);.         
83b0: 20 73 65 65 6e 43 6f 6d 20 3d 20 31 3b 0a 20 20   seenCom = 1;.  
83c0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
83d0: 20 20 20 20 20 20 20 69 6e 74 20 76 31 20 3d 20         int v1 = 
83e0: 74 72 61 6e 73 6c 61 74 65 50 28 63 2c 20 70 4f  translateP(c, pO
83f0: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  p);.          in
8400: 74 20 76 32 3b 0a 20 20 20 20 20 20 20 20 20 20  t v2;.          
8410: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
8420: 28 6e 54 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70  (nTemp-jj, zTemp
8430: 2b 6a 6a 2c 20 22 25 64 22 2c 20 76 31 29 3b 0a  +jj, "%d", v1);.
8440: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
8450: 72 6e 63 6d 70 28 7a 53 79 6e 6f 70 73 69 73 2b  rncmp(zSynopsis+
8460: 69 69 2b 31 2c 20 22 40 50 22 2c 20 32 29 3d 3d  ii+1, "@P", 2)==
8470: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
8480: 20 69 69 20 2b 3d 20 33 3b 0a 20 20 20 20 20 20   ii += 3;.      
8490: 20 20 20 20 20 20 6a 6a 20 2b 3d 20 73 71 6c 69        jj += sqli
84a0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 65 6d  te3Strlen30(zTem
84b0: 70 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 20 20 20  p+jj);.         
84c0: 20 20 20 76 32 20 3d 20 74 72 61 6e 73 6c 61 74     v2 = translat
84d0: 65 50 28 7a 53 79 6e 6f 70 73 69 73 5b 69 69 5d  eP(zSynopsis[ii]
84e0: 2c 20 70 4f 70 29 3b 0a 20 20 20 20 20 20 20 20  , pOp);.        
84f0: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
8500: 7a 53 79 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 22  zSynopsis+ii+1,"
8510: 2b 31 22 2c 32 29 3d 3d 30 20 29 7b 0a 20 20 20  +1",2)==0 ){.   
8520: 20 20 20 20 20 20 20 20 20 20 20 69 69 20 2b 3d             ii +=
8530: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   2;.            
8540: 20 20 76 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20    v2++;.        
8550: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
8560: 20 20 69 66 28 20 76 32 3e 31 20 29 7b 0a 20 20    if( v2>1 ){.  
8570: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
8580: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65  te3_snprintf(nTe
8590: 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a 2c  mp-jj, zTemp+jj,
85a0: 20 22 2e 2e 25 64 22 2c 20 76 31 2b 76 32 2d 31   "..%d", v1+v2-1
85b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
85c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
85d0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53 79   if( strncmp(zSy
85e0: 6e 6f 70 73 69 73 2b 69 69 2b 31 2c 20 22 2e 2e  nopsis+ii+1, "..
85f0: 50 33 22 2c 20 34 29 3d 3d 30 20 26 26 20 70 4f  P3", 4)==0 && pO
8600: 70 2d 3e 70 33 3d 3d 30 20 29 7b 0a 20 20 20 20  p->p3==0 ){.    
8610: 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 34 3b          ii += 4;
8620: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
8630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6a       }.        j
8640: 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  j += sqlite3Strl
8650: 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b 0a  en30(zTemp+jj);.
8660: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8670: 20 20 20 20 20 7a 54 65 6d 70 5b 6a 6a 2b 2b 5d       zTemp[jj++]
8680: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
8690: 20 20 7d 0a 20 20 20 20 69 66 28 20 21 73 65 65    }.    if( !see
86a0: 6e 43 6f 6d 20 26 26 20 6a 6a 3c 6e 54 65 6d 70  nCom && jj<nTemp
86b0: 2d 35 20 26 26 20 70 4f 70 2d 3e 7a 43 6f 6d 6d  -5 && pOp->zComm
86c0: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ent ){.      sql
86d0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54  ite3_snprintf(nT
86e0: 65 6d 70 2d 6a 6a 2c 20 7a 54 65 6d 70 2b 6a 6a  emp-jj, zTemp+jj
86f0: 2c 20 22 3b 20 25 73 22 2c 20 70 4f 70 2d 3e 7a  , "; %s", pOp->z
8700: 43 6f 6d 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  Comment);.      
8710: 6a 6a 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  jj += sqlite3Str
8720: 6c 65 6e 33 30 28 7a 54 65 6d 70 2b 6a 6a 29 3b  len30(zTemp+jj);
8730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6a  .    }.    if( j
8740: 6a 3c 6e 54 65 6d 70 20 29 20 7a 54 65 6d 70 5b  j<nTemp ) zTemp[
8750: 6a 6a 5d 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  jj] = 0;.  }else
8760: 20 69 66 28 20 70 4f 70 2d 3e 7a 43 6f 6d 6d 65   if( pOp->zComme
8770: 6e 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  nt ){.    sqlite
8780: 33 5f 73 6e 70 72 69 6e 74 66 28 6e 54 65 6d 70  3_snprintf(nTemp
8790: 2c 20 7a 54 65 6d 70 2c 20 22 25 73 22 2c 20 70  , zTemp, "%s", p
87a0: 4f 70 2d 3e 7a 43 6f 6d 6d 65 6e 74 29 3b 0a 20  Op->zComment);. 
87b0: 20 20 20 6a 6a 20 3d 20 73 71 6c 69 74 65 33 53     jj = sqlite3S
87c0: 74 72 6c 65 6e 33 30 28 7a 54 65 6d 70 29 3b 0a  trlen30(zTemp);.
87d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 54 65    }else{.    zTe
87e0: 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 6a  mp[0] = 0;.    j
87f0: 6a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  j = 0;.  }.  ret
8800: 75 72 6e 20 6a 6a 3b 0a 7d 0a 23 65 6e 64 69 66  urn jj;.}.#endif
8810: 20 2f 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47   /* SQLITE_DEBUG
8820: 20 2a 2f 0a 0a 23 69 66 20 56 44 42 45 5f 44 49   */..#if VDBE_DI
8830: 53 50 4c 41 59 5f 50 34 20 26 26 20 64 65 66 69  SPLAY_P4 && defi
8840: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
8850: 45 5f 43 55 52 53 4f 52 5f 48 49 4e 54 53 29 0a  E_CURSOR_HINTS).
8860: 2f 2a 0a 2a 2a 20 54 72 61 6e 73 6c 61 74 65 20  /*.** Translate 
8870: 74 68 65 20 50 34 2e 70 45 78 70 72 20 76 61 6c  the P4.pExpr val
8880: 75 65 20 66 6f 72 20 61 6e 20 4f 50 5f 43 75 72  ue for an OP_Cur
8890: 73 6f 72 48 69 6e 74 20 6f 70 63 6f 64 65 20 69  sorHint opcode i
88a0: 6e 74 6f 20 74 65 78 74 0a 2a 2a 20 74 68 61 74  nto text.** that
88b0: 20 63 61 6e 20 62 65 20 64 69 73 70 6c 61 79 65   can be displaye
88c0: 64 20 69 6e 20 74 68 65 20 50 34 20 63 6f 6c 75  d in the P4 colu
88d0: 6d 6e 20 6f 66 20 45 58 50 4c 41 49 4e 20 6f 75  mn of EXPLAIN ou
88e0: 74 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tput..*/.static 
88f0: 76 6f 69 64 20 64 69 73 70 6c 61 79 50 34 45 78  void displayP4Ex
8900: 70 72 28 53 74 72 41 63 63 75 6d 20 2a 70 2c 20  pr(StrAccum *p, 
8910: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
8920: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
8930: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
8940: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
8950: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
8960: 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72        sqlite3XPr
8970: 69 6e 74 66 28 70 2c 20 22 25 51 22 2c 20 70 45  intf(p, "%Q", pE
8980: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
8990: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
89a0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
89b0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
89c0: 50 72 69 6e 74 66 28 70 2c 20 22 25 64 22 2c 20  Printf(p, "%d", 
89d0: 70 45 78 70 72 2d 3e 75 2e 69 56 61 6c 75 65 29  pExpr->u.iValue)
89e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
89f0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
8a00: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50  .      sqlite3XP
8a10: 72 69 6e 74 66 28 70 2c 20 22 4e 55 4c 4c 22 29  rintf(p, "NULL")
8a20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
8a30: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53     case TK_REGIS
8a40: 54 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  TER: {.      sql
8a50: 69 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22  ite3XPrintf(p, "
8a60: 72 5b 25 64 5d 22 2c 20 70 45 78 70 72 2d 3e 69  r[%d]", pExpr->i
8a70: 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
8a80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8a90: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b  ase TK_COLUMN: {
8aa0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8ab0: 2d 3e 69 43 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20  ->iColumn<0 ){. 
8ac0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58 50         sqlite3XP
8ad0: 72 69 6e 74 66 28 70 2c 20 22 72 6f 77 69 64 22  rintf(p, "rowid"
8ae0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8af0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 58          sqlite3X
8b00: 50 72 69 6e 74 66 28 70 2c 20 22 63 25 64 22 2c  Printf(p, "c%d",
8b10: 20 28 69 6e 74 29 70 45 78 70 72 2d 3e 69 43 6f   (int)pExpr->iCo
8b20: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  lumn);.      }. 
8b30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8b40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
8b50: 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 4c 54  :      zOp = "LT
8b60: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
8b70: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
8b80: 20 20 20 20 7a 4f 70 20 3d 20 22 4c 45 22 3b 20      zOp = "LE"; 
8b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ba0: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
8bb0: 20 7a 4f 70 20 3d 20 22 47 54 22 3b 20 20 20 20   zOp = "GT";    
8bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8bd0: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 7a 4f  e TK_GE:      zO
8be0: 70 20 3d 20 22 47 45 22 3b 20 20 20 20 20 20 62  p = "GE";      b
8bf0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8c00: 4b 5f 4e 45 3a 20 20 20 20 20 20 7a 4f 70 20 3d  K_NE:      zOp =
8c10: 20 22 4e 45 22 3b 20 20 20 20 20 20 62 72 65 61   "NE";      brea
8c20: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
8c30: 51 3a 20 20 20 20 20 20 7a 4f 70 20 3d 20 22 45  Q:      zOp = "E
8c40: 51 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  Q";      break;.
8c50: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 20      case TK_IS: 
8c60: 20 20 20 20 20 7a 4f 70 20 3d 20 22 49 53 22 3b       zOp = "IS";
8c70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8c80: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
8c90: 20 20 7a 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b    zOp = "ISNOT";
8ca0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8cb0: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a  se TK_AND:     z
8cc0: 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 20  Op = "AND";     
8cd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ce0: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 4f 70 20  TK_OR:      zOp 
8cf0: 3d 20 22 4f 52 22 3b 20 20 20 20 20 20 62 72 65  = "OR";      bre
8d00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8d10: 50 4c 55 53 3a 20 20 20 20 7a 4f 70 20 3d 20 22  PLUS:    zOp = "
8d20: 41 44 44 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ADD";     break;
8d30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
8d40: 52 3a 20 20 20 20 7a 4f 70 20 3d 20 22 4d 55 4c  R:    zOp = "MUL
8d50: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8d60: 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a    case TK_MINUS:
8d70: 20 20 20 7a 4f 70 20 3d 20 22 53 55 42 22 3b 20     zOp = "SUB"; 
8d80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8d90: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
8da0: 7a 4f 70 20 3d 20 22 52 45 4d 22 3b 20 20 20 20  zOp = "REM";    
8db0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8dc0: 20 54 4b 5f 42 49 54 41 4e 44 3a 20 20 7a 4f 70   TK_BITAND:  zOp
8dd0: 20 3d 20 22 42 49 54 41 4e 44 22 3b 20 20 62 72   = "BITAND";  br
8de0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8df0: 5f 42 49 54 4f 52 3a 20 20 20 7a 4f 70 20 3d 20  _BITOR:   zOp = 
8e00: 22 42 49 54 4f 52 22 3b 20 20 20 62 72 65 61 6b  "BITOR";   break
8e10: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
8e20: 41 53 48 3a 20 20 20 7a 4f 70 20 3d 20 22 44 49  ASH:   zOp = "DI
8e30: 56 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  V";     break;. 
8e40: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8e50: 54 3a 20 20 7a 4f 70 20 3d 20 22 4c 53 48 49 46  T:  zOp = "LSHIF
8e60: 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  T";  break;.    
8e70: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
8e80: 20 7a 4f 70 20 3d 20 22 52 53 48 49 46 54 22 3b   zOp = "RSHIFT";
8e90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8ea0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 7a 4f  e TK_CONCAT:  zO
8eb0: 70 20 3d 20 22 43 4f 4e 43 41 54 22 3b 20 20 62  p = "CONCAT";  b
8ec0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8ed0: 4b 5f 55 4d 49 4e 55 53 3a 20 20 7a 4f 70 20 3d  K_UMINUS:  zOp =
8ee0: 20 22 4d 49 4e 55 53 22 3b 20 20 20 62 72 65 61   "MINUS";   brea
8ef0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
8f00: 50 4c 55 53 3a 20 20 20 7a 4f 70 20 3d 20 22 50  PLUS:   zOp = "P
8f10: 4c 55 53 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  LUS";    break;.
8f20: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
8f30: 4f 54 3a 20 20 7a 4f 70 20 3d 20 22 42 49 54 4e  OT:  zOp = "BITN
8f40: 4f 54 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  OT";  break;.   
8f50: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
8f60: 20 20 7a 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20    zOp = "NOT";  
8f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8f80: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a  se TK_ISNULL:  z
8f90: 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20 20  Op = "ISNULL";  
8fa0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8fb0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4f 70 20  TK_NOTNULL: zOp 
8fc0: 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20 62 72 65  = "NOTNULL"; bre
8fd0: 61 6b 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74  ak;..    default
8fe0: 3a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 58  :.      sqlite3X
8ff0: 50 72 69 6e 74 66 28 70 2c 20 22 25 73 22 2c 20  Printf(p, "%s", 
9000: 22 65 78 70 72 22 29 3b 0a 20 20 20 20 20 20 62  "expr");.      b
9010: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  reak;.  }..  if(
9020: 20 7a 4f 70 20 29 7b 0a 20 20 20 20 73 71 6c 69   zOp ){.    sqli
9030: 74 65 33 58 50 72 69 6e 74 66 28 70 2c 20 22 25  te3XPrintf(p, "%
9040: 73 28 22 2c 20 7a 4f 70 29 3b 0a 20 20 20 20 64  s(", zOp);.    d
9050: 69 73 70 6c 61 79 50 34 45 78 70 72 28 70 2c 20  isplayP4Expr(p, 
9060: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9070: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52     if( pExpr->pR
9080: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71  ight ){.      sq
9090: 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70 70  lite3StrAccumApp
90a0: 65 6e 64 28 70 2c 20 22 2c 22 2c 20 31 29 3b 0a  end(p, ",", 1);.
90b0: 20 20 20 20 20 20 64 69 73 70 6c 61 79 50 34 45        displayP4E
90c0: 78 70 72 28 70 2c 20 70 45 78 70 72 2d 3e 70 52  xpr(p, pExpr->pR
90d0: 69 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ight);.    }.   
90e0: 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
90f0: 41 70 70 65 6e 64 28 70 2c 20 22 29 22 2c 20 31  Append(p, ")", 1
9100: 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
9110: 2f 2a 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  /* VDBE_DISPLAY_
9120: 50 34 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  P4 && defined(SQ
9130: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 55 52 53  LITE_ENABLE_CURS
9140: 4f 52 5f 48 49 4e 54 53 29 20 2a 2f 0a 0a 0a 23  OR_HINTS) */...#
9150: 69 66 20 56 44 42 45 5f 44 49 53 50 4c 41 59 5f  if VDBE_DISPLAY_
9160: 50 34 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  P4./*.** Compute
9170: 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 64   a string that d
9180: 65 73 63 72 69 62 65 73 20 74 68 65 20 50 34 20  escribes the P4 
9190: 70 61 72 61 6d 65 74 65 72 20 66 6f 72 20 61 6e  parameter for an
91a0: 20 6f 70 63 6f 64 65 2e 0a 2a 2a 20 55 73 65 20   opcode..** Use 
91b0: 7a 54 65 6d 70 20 66 6f 72 20 61 6e 79 20 72 65  zTemp for any re
91c0: 71 75 69 72 65 64 20 74 65 6d 70 6f 72 61 72 79  quired temporary
91d0: 20 62 75 66 66 65 72 20 73 70 61 63 65 2e 0a 2a   buffer space..*
91e0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 64  /.static char *d
91f0: 69 73 70 6c 61 79 50 34 28 4f 70 20 2a 70 4f 70  isplayP4(Op *pOp
9200: 2c 20 63 68 61 72 20 2a 7a 54 65 6d 70 2c 20 69  , char *zTemp, i
9210: 6e 74 20 6e 54 65 6d 70 29 7b 0a 20 20 63 68 61  nt nTemp){.  cha
9220: 72 20 2a 7a 50 34 20 3d 20 7a 54 65 6d 70 3b 0a  r *zP4 = zTemp;.
9230: 20 20 53 74 72 41 63 63 75 6d 20 78 3b 0a 20 20    StrAccum x;.  
9240: 61 73 73 65 72 74 28 20 6e 54 65 6d 70 3e 3d 32  assert( nTemp>=2
9250: 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 74  0 );.  sqlite3St
9260: 72 41 63 63 75 6d 49 6e 69 74 28 26 78 2c 20 30  rAccumInit(&x, 0
9270: 2c 20 7a 54 65 6d 70 2c 20 6e 54 65 6d 70 2c 20  , zTemp, nTemp, 
9280: 30 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 4f  0);.  switch( pO
9290: 70 2d 3e 70 34 74 79 70 65 20 29 7b 0a 20 20 20  p->p4type ){.   
92a0: 20 63 61 73 65 20 50 34 5f 4b 45 59 49 4e 46 4f   case P4_KEYINFO
92b0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b  : {.      int j;
92c0: 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a  .      KeyInfo *
92d0: 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4f 70 2d 3e  pKeyInfo = pOp->
92e0: 70 34 2e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 20  p4.pKeyInfo;.   
92f0: 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49     assert( pKeyI
9300: 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21  nfo->aSortOrder!
9310: 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
9320: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9330: 6b 28 25 64 22 2c 20 70 4b 65 79 49 6e 66 6f 2d  k(%d", pKeyInfo-
9340: 3e 6e 46 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  >nField);.      
9350: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 4b 65 79 49  for(j=0; j<pKeyI
9360: 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3b 20 6a 2b 2b  nfo->nField; j++
9370: 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
9380: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 70 4b 65 79  eq *pColl = pKey
9390: 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 6a 5d 3b 0a  Info->aColl[j];.
93a0: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
93b0: 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20 70 43 6f 6c  ar *zColl = pCol
93c0: 6c 20 3f 20 70 43 6f 6c 6c 2d 3e 7a 4e 61 6d 65  l ? pColl->zName
93d0: 20 3a 20 22 22 3b 0a 20 20 20 20 20 20 20 20 69   : "";.        i
93e0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6f 6c 6c 2c  f( strcmp(zColl,
93f0: 20 22 42 49 4e 41 52 59 22 29 3d 3d 30 20 29 20   "BINARY")==0 ) 
9400: 7a 43 6f 6c 6c 20 3d 20 22 42 22 3b 0a 20 20 20  zColl = "B";.   
9410: 20 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69       sqlite3XPri
9420: 6e 74 66 28 26 78 2c 20 22 2c 25 73 25 73 22 2c  ntf(&x, ",%s%s",
9430: 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74   pKeyInfo->aSort
9440: 4f 72 64 65 72 5b 6a 5d 20 3f 20 22 2d 22 20 3a  Order[j] ? "-" :
9450: 20 22 22 2c 20 7a 43 6f 6c 6c 29 3b 0a 20 20 20   "", zColl);.   
9460: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9470: 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64  e3StrAccumAppend
9480: 28 26 78 2c 20 22 29 22 2c 20 31 29 3b 0a 20 20  (&x, ")", 1);.  
9490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
94a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
94b0: 4e 41 42 4c 45 5f 43 55 52 53 4f 52 5f 48 49 4e  NABLE_CURSOR_HIN
94c0: 54 53 0a 20 20 20 20 63 61 73 65 20 50 34 5f 45  TS.    case P4_E
94d0: 58 50 52 3a 20 7b 0a 20 20 20 20 20 20 64 69 73  XPR: {.      dis
94e0: 70 6c 61 79 50 34 45 78 70 72 28 26 78 2c 20 70  playP4Expr(&x, p
94f0: 4f 70 2d 3e 70 34 2e 70 45 78 70 72 29 3b 0a 20  Op->p4.pExpr);. 
9500: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9510: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
9520: 65 20 50 34 5f 43 4f 4c 4c 53 45 51 3a 20 7b 0a  e P4_COLLSEQ: {.
9530: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70        CollSeq *p
9540: 43 6f 6c 6c 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  Coll = pOp->p4.p
9550: 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  Coll;.      sqli
9560: 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22  te3XPrintf(&x, "
9570: 28 25 2e 32 30 73 29 22 2c 20 70 43 6f 6c 6c 2d  (%.20s)", pColl-
9580: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 62  >zName);.      b
9590: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
95a0: 63 61 73 65 20 50 34 5f 46 55 4e 43 44 45 46 3a  case P4_FUNCDEF:
95b0: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
95c0: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
95d0: 2e 70 46 75 6e 63 3b 0a 20 20 20 20 20 20 73 71  .pFunc;.      sq
95e0: 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26 78 2c  lite3XPrintf(&x,
95f0: 20 22 25 73 28 25 64 29 22 2c 20 70 44 65 66 2d   "%s(%d)", pDef-
9600: 3e 7a 4e 61 6d 65 2c 20 70 44 65 66 2d 3e 6e 41  >zName, pDef->nA
9610: 72 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  rg);.      break
9620: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
9630: 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
9640: 63 61 73 65 20 50 34 5f 46 55 4e 43 43 54 58 3a  case P4_FUNCCTX:
9650: 20 7b 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66   {.      FuncDef
9660: 20 2a 70 44 65 66 20 3d 20 70 4f 70 2d 3e 70 34   *pDef = pOp->p4
9670: 2e 70 43 74 78 2d 3e 70 46 75 6e 63 3b 0a 20 20  .pCtx->pFunc;.  
9680: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9690: 74 66 28 26 78 2c 20 22 25 73 28 25 64 29 22 2c  tf(&x, "%s(%d)",
96a0: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 20 70 44   pDef->zName, pD
96b0: 65 66 2d 3e 6e 41 72 67 29 3b 0a 20 20 20 20 20  ef->nArg);.     
96c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
96d0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 50 34  ndif.    case P4
96e0: 5f 49 4e 54 36 34 3a 20 7b 0a 20 20 20 20 20 20  _INT64: {.      
96f0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9700: 78 2c 20 22 25 6c 6c 64 22 2c 20 2a 70 4f 70 2d  x, "%lld", *pOp-
9710: 3e 70 34 2e 70 49 36 34 29 3b 0a 20 20 20 20 20  >p4.pI64);.     
9720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9730: 20 20 63 61 73 65 20 50 34 5f 49 4e 54 33 32 3a    case P4_INT32:
9740: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9750: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 64 22  XPrintf(&x, "%d"
9760: 2c 20 70 4f 70 2d 3e 70 34 2e 69 29 3b 0a 20 20  , pOp->p4.i);.  
9770: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9780: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 52 45 41  .    case P4_REA
9790: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
97a0: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
97b0: 2e 31 36 67 22 2c 20 2a 70 4f 70 2d 3e 70 34 2e  .16g", *pOp->p4.
97c0: 70 52 65 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  pReal);.      br
97d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
97e0: 61 73 65 20 50 34 5f 4d 45 4d 3a 20 7b 0a 20 20  ase P4_MEM: {.  
97f0: 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20      Mem *pMem = 
9800: 70 4f 70 2d 3e 70 34 2e 70 4d 65 6d 3b 0a 20 20  pOp->p4.pMem;.  
9810: 20 20 20 20 69 66 28 20 70 4d 65 6d 2d 3e 66 6c      if( pMem->fl
9820: 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b  ags & MEM_Str ){
9830: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 70  .        zP4 = p
9840: 4d 65 6d 2d 3e 7a 3b 0a 20 20 20 20 20 20 7d 65  Mem->z;.      }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 49 6e 74 20 29 7b  ags & MEM_Int ){
9870: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9880: 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25 6c 6c  XPrintf(&x, "%ll
9890: 64 22 2c 20 70 4d 65 6d 2d 3e 75 2e 69 29 3b 0a  d", pMem->u.i);.
98a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
98b0: 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45  pMem->flags & ME
98c0: 4d 5f 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20  M_Real ){.      
98d0: 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66    sqlite3XPrintf
98e0: 28 26 78 2c 20 22 25 2e 31 36 67 22 2c 20 70 4d  (&x, "%.16g", pM
98f0: 65 6d 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20 20  em->u.r);.      
9900: 7d 65 6c 73 65 20 69 66 28 20 70 4d 65 6d 2d 3e  }else if( pMem->
9910: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e 75 6c 6c  flags & MEM_Null
9920: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 50 34 20   ){.        zP4 
9930: 3d 20 22 4e 55 4c 4c 22 3b 0a 20 20 20 20 20 20  = "NULL";.      
9940: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
9950: 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 66 6c 61  ssert( pMem->fla
9960: 67 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 3b  gs & MEM_Blob );
9970: 0a 20 20 20 20 20 20 20 20 7a 50 34 20 3d 20 22  .        zP4 = "
9980: 28 62 6c 6f 62 29 22 3b 0a 20 20 20 20 20 20 7d  (blob)";.      }
9990: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
99a0: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
99b0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
99c0: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 50 34  ABLE.    case P4
99d0: 5f 56 54 41 42 3a 20 7b 0a 20 20 20 20 20 20 73  _VTAB: {.      s
99e0: 71 6c 69 74 65 33 5f 76 74 61 62 20 2a 70 56 74  qlite3_vtab *pVt
99f0: 61 62 20 3d 20 70 4f 70 2d 3e 70 34 2e 70 56 74  ab = pOp->p4.pVt
9a00: 61 62 2d 3e 70 56 74 61 62 3b 0a 20 20 20 20 20  ab->pVtab;.     
9a10: 20 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28   sqlite3XPrintf(
9a20: 26 78 2c 20 22 76 74 61 62 3a 25 70 22 2c 20 70  &x, "vtab:%p", p
9a30: 56 74 61 62 29 3b 0a 20 20 20 20 20 20 62 72 65  Vtab);.      bre
9a40: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
9a50: 0a 20 20 20 20 63 61 73 65 20 50 34 5f 49 4e 54  .    case P4_INT
9a60: 41 52 52 41 59 3a 20 7b 0a 20 20 20 20 20 20 69  ARRAY: {.      i
9a70: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
9a80: 2a 61 69 20 3d 20 70 4f 70 2d 3e 70 34 2e 61 69  *ai = pOp->p4.ai
9a90: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
9aa0: 61 69 5b 30 5d 3b 20 20 20 2f 2a 20 54 68 65 20  ai[0];   /* The 
9ab0: 66 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66  first element of
9ac0: 20 61 6e 20 49 4e 54 41 52 52 41 59 20 69 73 20   an INTARRAY is 
9ad0: 61 6c 77 61 79 73 20 74 68 65 0a 20 20 20 20 20  always the.     
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68    ** count of th
9b00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d  e number of elem
9b10: 65 6e 74 73 20 74 6f 20 66 6f 6c 6c 6f 77 20 2a  ents to follow *
9b20: 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  /.      for(i=1;
9b30: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
9b40: 20 20 20 20 73 71 6c 69 74 65 33 58 50 72 69 6e      sqlite3XPrin
9b50: 74 66 28 26 78 2c 20 22 2c 25 64 22 2c 20 61 69  tf(&x, ",%d", ai
9b60: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
9b70: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 27      zTemp[0] = '
9b80: 5b 27 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  [';.      sqlite
9b90: 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28  3StrAccumAppend(
9ba0: 26 78 2c 20 22 5d 22 2c 20 31 29 3b 0a 20 20 20  &x, "]", 1);.   
9bb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9bc0: 20 20 20 20 63 61 73 65 20 50 34 5f 53 55 42 50      case P4_SUBP
9bd0: 52 4f 47 52 41 4d 3a 20 7b 0a 20 20 20 20 20 20  ROGRAM: {.      
9be0: 73 71 6c 69 74 65 33 58 50 72 69 6e 74 66 28 26  sqlite3XPrintf(&
9bf0: 78 2c 20 22 70 72 6f 67 72 61 6d 22 29 3b 0a 20  x, "program");. 
9c00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c10: 7d 0a 20 20 20 20 63 61 73 65 20 50 34 5f 41 44  }.    case P4_AD
9c20: 56 41 4e 43 45 3a 20 7b 0a 20 20 20 20 20 20 7a  VANCE: {.      z
9c30: 54 65 6d 70 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  Temp[0] = 0;.   
9c40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9c50: 20 20 20 20 63 61 73 65 20 50 34 5f 54 41 42 4c      case P4_TABL
9c60: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
9c70: 65 33 58 50 72 69 6e 74 66 28 26 78 2c 20 22 25  e3XPrintf(&x, "%
9c80: 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 70 54 61 62  s", pOp->p4.pTab
9c90: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
9ca0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9cb0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
9cc0: 20 20 7a 50 34 20 3d 20 70 4f 70 2d 3e 70 34 2e    zP4 = pOp->p4.
9cd0: 7a 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 50 34  z;.      if( zP4
9ce0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
9cf0: 50 34 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20  P4 = zTemp;.    
9d00: 20 20 20 20 7a 54 65 6d 70 5b 30 5d 20 3d 20 30      zTemp[0] = 0
9d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9d20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
9d30: 41 63 63 75 6d 46 69 6e 69 73 68 28 26 78 29 3b  AccumFinish(&x);
9d40: 0a 20 20 61 73 73 65 72 74 28 20 7a 50 34 21 3d  .  assert( zP4!=
9d50: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 50  0 );.  return zP
9d60: 34 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 56  4;.}.#endif /* V
9d70: 44 42 45 5f 44 49 53 50 4c 41 59 5f 50 34 20 2a  DBE_DISPLAY_P4 *
9d80: 2f 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  /../*.** Declare
9d90: 20 74 6f 20 74 68 65 20 56 64 62 65 20 74 68 61   to the Vdbe tha
9da0: 74 20 74 68 65 20 42 54 72 65 65 20 6f 62 6a 65  t the BTree obje
9db0: 63 74 20 61 74 20 64 62 2d 3e 61 44 62 5b 69 5d  ct at db->aDb[i]
9dc0: 20 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   is used..**.** 
9dd0: 54 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  The prepared sta
9de0: 74 65 6d 65 6e 74 73 20 6e 65 65 64 20 74 6f 20  tements need to 
9df0: 6b 6e 6f 77 20 69 6e 20 61 64 76 61 6e 63 65 20  know in advance 
9e00: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 65 74  the complete set
9e10: 20 6f 66 0a 2a 2a 20 61 74 74 61 63 68 65 64 20   of.** attached 
9e20: 64 61 74 61 62 61 73 65 73 20 74 68 61 74 20 77  databases that w
9e30: 69 6c 6c 20 62 65 20 75 73 65 2e 20 20 41 20 6d  ill be use.  A m
9e40: 61 73 6b 20 6f 66 20 74 68 65 73 65 20 64 61 74  ask of these dat
9e50: 61 62 61 73 65 73 0a 2a 2a 20 69 73 20 6d 61 69  abases.** is mai
9e60: 6e 74 61 69 6e 65 64 20 69 6e 20 70 2d 3e 62 74  ntained in p->bt
9e70: 72 65 65 4d 61 73 6b 2e 20 20 54 68 65 20 70 2d  reeMask.  The p-
9e80: 3e 6c 6f 63 6b 4d 61 73 6b 20 76 61 6c 75 65 20  >lockMask value 
9e90: 69 73 20 74 68 65 20 73 75 62 73 65 74 20 6f 66  is the subset of
9ea0: 0a 2a 2a 20 70 2d 3e 62 74 72 65 65 4d 61 73 6b  .** p->btreeMask
9eb0: 20 6f 66 20 64 61 74 61 62 61 73 65 73 20 74 68   of databases th
9ec0: 61 74 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  at will require 
9ed0: 61 20 6c 6f 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20  a lock..*/.void 
9ee0: 73 71 6c 69 74 65 33 56 64 62 65 55 73 65 73 42  sqlite3VdbeUsesB
9ef0: 74 72 65 65 28 56 64 62 65 20 2a 70 2c 20 69 6e  tree(Vdbe *p, in
9f00: 74 20 69 29 7b 0a 20 20 61 73 73 65 72 74 28 20  t i){.  assert( 
9f10: 69 3e 3d 30 20 26 26 20 69 3c 70 2d 3e 64 62 2d  i>=0 && i<p->db-
9f20: 3e 6e 44 62 20 26 26 20 69 3c 28 69 6e 74 29 73  >nDb && i<(int)s
9f30: 69 7a 65 6f 66 28 79 44 62 4d 61 73 6b 29 2a 38  izeof(yDbMask)*8
9f40: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 3c   );.  assert( i<
9f50: 28 69 6e 74 29 73 69 7a 65 6f 66 28 70 2d 3e 62  (int)sizeof(p->b
9f60: 74 72 65 65 4d 61 73 6b 29 2a 38 20 29 3b 0a 20  treeMask)*8 );. 
9f70: 20 44 62 4d 61 73 6b 53 65 74 28 70 2d 3e 62 74   DbMaskSet(p->bt
9f80: 72 65 65 4d 61 73 6b 2c 20 69 29 3b 0a 20 20 69  reeMask, i);.  i
9f90: 66 28 20 69 21 3d 31 20 26 26 20 73 71 6c 69 74  f( i!=1 && sqlit
9fa0: 65 33 42 74 72 65 65 53 68 61 72 61 62 6c 65 28  e3BtreeSharable(
9fb0: 70 2d 3e 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  p->db->aDb[i].pB
9fc0: 74 29 20 29 7b 0a 20 20 20 20 44 62 4d 61 73 6b  t) ){.    DbMask
9fd0: 53 65 74 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c  Set(p->lockMask,
9fe0: 20 69 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20   i);.  }.}..#if 
9ff0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a000: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
a010: 45 29 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 69  E)./*.** If SQLi
a020: 74 65 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 74  te is compiled t
a030: 6f 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  o support shared
a040: 2d 63 61 63 68 65 20 6d 6f 64 65 20 61 6e 64 20  -cache mode and 
a050: 74 6f 20 62 65 20 74 68 72 65 61 64 73 61 66 65  to be threadsafe
a060: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
a070: 65 20 6f 62 74 61 69 6e 73 20 74 68 65 20 6d 75  e obtains the mu
a080: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
a090: 69 74 68 20 65 61 63 68 20 42 74 53 68 61 72 65  ith each BtShare
a0a0: 64 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 74  d structure.** t
a0b0: 68 61 74 20 6d 61 79 20 62 65 20 61 63 63 65 73  hat may be acces
a0c0: 73 65 64 20 62 79 20 74 68 65 20 56 4d 20 70 61  sed by the VM pa
a0d0: 73 73 65 64 20 61 73 20 61 6e 20 61 72 67 75 6d  ssed as an argum
a0e0: 65 6e 74 2e 20 49 6e 20 64 6f 69 6e 67 20 73 6f  ent. In doing so
a0f0: 20 69 74 20 61 6c 73 6f 0a 2a 2a 20 73 65 74 73   it also.** sets
a100: 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 64 62   the BtShared.db
a110: 20 6d 65 6d 62 65 72 20 6f 66 20 65 61 63 68 20   member of each 
a120: 6f 66 20 74 68 65 20 42 74 53 68 61 72 65 64 20  of the BtShared 
a130: 73 74 72 75 63 74 75 72 65 73 2c 20 65 6e 73 75  structures, ensu
a140: 72 69 6e 67 0a 2a 2a 20 74 68 61 74 20 74 68 65  ring.** that the
a150: 20 63 6f 72 72 65 63 74 20 62 75 73 79 2d 68 61   correct busy-ha
a160: 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 69  ndler callback i
a170: 73 20 69 6e 76 6f 6b 65 64 20 69 66 20 72 65 71  s invoked if req
a180: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  uired..**.** If 
a190: 53 51 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68  SQLite is not th
a1a0: 72 65 61 64 73 61 66 65 20 62 75 74 20 64 6f 65  readsafe but doe
a1b0: 73 20 73 75 70 70 6f 72 74 20 73 68 61 72 65 64  s support shared
a1c0: 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74 68 65  -cache mode, the
a1d0: 6e 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  n.** sqlite3Btre
a1e0: 65 45 6e 74 65 72 28 29 20 69 73 20 69 6e 76 6f  eEnter() is invo
a1f0: 6b 65 64 20 74 6f 20 73 65 74 20 74 68 65 20 42  ked to set the B
a200: 74 53 68 61 72 65 64 2e 64 62 20 76 61 72 69 61  tShared.db varia
a210: 62 6c 65 73 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  bles.** of all o
a220: 66 20 42 74 53 68 61 72 65 64 20 73 74 72 75 63  f BtShared struc
a230: 74 75 72 65 73 20 61 63 63 65 73 73 69 62 6c 65  tures accessible
a240: 20 76 69 61 20 74 68 65 20 64 61 74 61 62 61 73   via the databas
a250: 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 61 73 73  e handle .** ass
a260: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
a270: 20 56 4d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51   VM..**.** If SQ
a280: 4c 69 74 65 20 69 73 20 6e 6f 74 20 74 68 72 65  Lite is not thre
a290: 61 64 73 61 66 65 20 61 6e 64 20 64 6f 65 73 20  adsafe and does 
a2a0: 6e 6f 74 20 73 75 70 70 6f 72 74 20 73 68 61 72  not support shar
a2b0: 65 64 2d 63 61 63 68 65 20 6d 6f 64 65 2c 20 74  ed-cache mode, t
a2c0: 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
a2d0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
a2e0: 2a 20 54 68 65 20 70 2d 3e 62 74 72 65 65 4d 61  * The p->btreeMa
a2f0: 73 6b 20 66 69 65 6c 64 20 69 73 20 61 20 62 69  sk field is a bi
a300: 74 6d 61 73 6b 20 6f 66 20 61 6c 6c 20 62 74 72  tmask of all btr
a310: 65 65 73 20 74 68 61 74 20 74 68 65 20 70 72 65  ees that the pre
a320: 70 61 72 65 64 20 0a 2a 2a 20 73 74 61 74 65 6d  pared .** statem
a330: 65 6e 74 20 70 20 77 69 6c 6c 20 65 76 65 72 20  ent p will ever 
a340: 75 73 65 2e 20 20 4c 65 74 20 4e 20 62 65 20 74  use.  Let N be t
a350: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74  he number of bit
a360: 73 20 69 6e 20 70 2d 3e 62 74 72 65 65 4d 61 73  s in p->btreeMas
a370: 6b 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69  k.** correspondi
a380: 6e 67 20 74 6f 20 62 74 72 65 65 73 20 74 68 61  ng to btrees tha
a390: 74 20 75 73 65 20 73 68 61 72 65 64 20 63 61 63  t use shared cac
a3a0: 68 65 2e 20 20 54 68 65 6e 20 74 68 65 20 72 75  he.  Then the ru
a3b0: 6e 74 69 6d 65 20 6f 66 0a 2a 2a 20 74 68 69 73  ntime of.** this
a3c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 4e 2a 4e 2e   routine is N*N.
a3d0: 20 20 42 75 74 20 61 73 20 4e 20 69 73 20 72 61    But as N is ra
a3e0: 72 65 6c 79 20 6d 6f 72 65 20 74 68 61 6e 20 31  rely more than 1
a3f0: 2c 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f  , this should no
a400: 74 0a 2a 2a 20 62 65 20 61 20 70 72 6f 62 6c 65  t.** be a proble
a410: 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  m..*/.void sqlit
a420: 65 33 56 64 62 65 45 6e 74 65 72 28 56 64 62 65  e3VdbeEnter(Vdbe
a430: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *p){.  int i;. 
a440: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
a450: 44 62 20 2a 61 44 62 3b 0a 20 20 69 6e 74 20 6e  Db *aDb;.  int n
a460: 44 62 3b 0a 20 20 69 66 28 20 44 62 4d 61 73 6b  Db;.  if( DbMask
a470: 41 6c 6c 5a 65 72 6f 28 70 2d 3e 6c 6f 63 6b 4d  AllZero(p->lockM
a480: 61 73 6b 29 20 29 20 72 65 74 75 72 6e 3b 20 20  ask) ) return;  
a490: 2f 2a 20 54 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  /* The common ca
a4a0: 73 65 20 2a 2f 0a 20 20 64 62 20 3d 20 70 2d 3e  se */.  db = p->
a4b0: 64 62 3b 0a 20 20 61 44 62 20 3d 20 64 62 2d 3e  db;.  aDb = db->
a4c0: 61 44 62 3b 0a 20 20 6e 44 62 20 3d 20 64 62 2d  aDb;.  nDb = db-
a4d0: 3e 6e 44 62 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  >nDb;.  for(i=0;
a4e0: 20 69 3c 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20   i<nDb; i++){.  
a4f0: 20 20 69 66 28 20 69 21 3d 31 20 26 26 20 44 62    if( i!=1 && Db
a500: 4d 61 73 6b 54 65 73 74 28 70 2d 3e 6c 6f 63 6b  MaskTest(p->lock
a510: 4d 61 73 6b 2c 69 29 20 26 26 20 41 4c 57 41 59  Mask,i) && ALWAY
a520: 53 28 61 44 62 5b 69 5d 2e 70 42 74 21 3d 30 29  S(aDb[i].pBt!=0)
a530: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
a540: 33 42 74 72 65 65 45 6e 74 65 72 28 61 44 62 5b  3BtreeEnter(aDb[
a550: 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  i].pBt);.    }. 
a560: 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66   }.}.#endif..#if
a570: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
a580: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
a590: 48 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48  HE) && SQLITE_TH
a5a0: 52 45 41 44 53 41 46 45 3e 30 0a 2f 2a 0a 2a 2a  READSAFE>0./*.**
a5b0: 20 55 6e 6c 6f 63 6b 20 61 6c 6c 20 6f 66 20 74   Unlock all of t
a5c0: 68 65 20 62 74 72 65 65 73 20 70 72 65 76 69 6f  he btrees previo
a5d0: 75 73 6c 79 20 6c 6f 63 6b 65 64 20 62 79 20 61  usly locked by a
a5e0: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
a5f0: 56 64 62 65 45 6e 74 65 72 28 29 2e 0a 2a 2f 0a  VdbeEnter()..*/.
a600: 73 74 61 74 69 63 20 53 51 4c 49 54 45 5f 4e 4f  static SQLITE_NO
a610: 49 4e 4c 49 4e 45 20 76 6f 69 64 20 76 64 62 65  INLINE void vdbe
a620: 4c 65 61 76 65 28 56 64 62 65 20 2a 70 29 7b 0a  Leave(Vdbe *p){.
a630: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
a640: 65 33 20 2a 64 62 3b 0a 20 20 44 62 20 2a 61 44  e3 *db;.  Db *aD
a650: 62 3b 0a 20 20 69 6e 74 20 6e 44 62 3b 0a 20 20  b;.  int nDb;.  
a660: 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 44  db = p->db;.  aD
a670: 62 20 3d 20 64 62 2d 3e 61 44 62 3b 0a 20 20 6e  b = db->aDb;.  n
a680: 44 62 20 3d 20 64 62 2d 3e 6e 44 62 3b 0a 20 20  Db = db->nDb;.  
a690: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 44 62 3b 20  for(i=0; i<nDb; 
a6a0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 21  i++){.    if( i!
a6b0: 3d 31 20 26 26 20 44 62 4d 61 73 6b 54 65 73 74  =1 && DbMaskTest
a6c0: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 2c 69 29 20  (p->lockMask,i) 
a6d0: 26 26 20 41 4c 57 41 59 53 28 61 44 62 5b 69 5d  && ALWAYS(aDb[i]
a6e0: 2e 70 42 74 21 3d 30 29 20 29 7b 0a 20 20 20 20  .pBt!=0) ){.    
a6f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
a700: 61 76 65 28 61 44 62 5b 69 5d 2e 70 42 74 29 3b  ave(aDb[i].pBt);
a710: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 76 6f 69  .    }.  }.}.voi
a720: 64 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61  d sqlite3VdbeLea
a730: 76 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  ve(Vdbe *p){.  i
a740: 66 28 20 44 62 4d 61 73 6b 41 6c 6c 5a 65 72 6f  f( DbMaskAllZero
a750: 28 70 2d 3e 6c 6f 63 6b 4d 61 73 6b 29 20 29 20  (p->lockMask) ) 
a760: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 54 68 65 20  return;  /* The 
a770: 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a 20  common case */. 
a780: 20 76 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 7d   vdbeLeave(p);.}
a790: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
a7a0: 69 6e 65 64 28 56 44 42 45 5f 50 52 4f 46 49 4c  ined(VDBE_PROFIL
a7b0: 45 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  E) || defined(SQ
a7c0: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
a7d0: 2a 20 50 72 69 6e 74 20 61 20 73 69 6e 67 6c 65  * Print a single
a7e0: 20 6f 70 63 6f 64 65 2e 20 20 54 68 69 73 20 72   opcode.  This r
a7f0: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 66  outine is used f
a800: 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
a810: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
a820: 65 33 56 64 62 65 50 72 69 6e 74 4f 70 28 46 49  e3VdbePrintOp(FI
a830: 4c 45 20 2a 70 4f 75 74 2c 20 69 6e 74 20 70 63  LE *pOut, int pc
a840: 2c 20 4f 70 20 2a 70 4f 70 29 7b 0a 20 20 63 68  , Op *pOp){.  ch
a850: 61 72 20 2a 7a 50 34 3b 0a 20 20 63 68 61 72 20  ar *zP4;.  char 
a860: 7a 50 74 72 5b 35 30 5d 3b 0a 20 20 63 68 61 72  zPtr[50];.  char
a870: 20 7a 43 6f 6d 5b 31 30 30 5d 3b 0a 20 20 73 74   zCom[100];.  st
a880: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
a890: 2a 7a 46 6f 72 6d 61 74 31 20 3d 20 22 25 34 64  *zFormat1 = "%4d
a8a0: 20 25 2d 31 33 73 20 25 34 64 20 25 34 64 20 25   %-13s %4d %4d %
a8b0: 34 64 20 25 2d 31 33 73 20 25 2e 32 58 20 25 73  4d %-13s %.2X %s
a8c0: 5c 6e 22 3b 0a 20 20 69 66 28 20 70 4f 75 74 3d  \n";.  if( pOut=
a8d0: 3d 30 20 29 20 70 4f 75 74 20 3d 20 73 74 64 6f  =0 ) pOut = stdo
a8e0: 75 74 3b 0a 20 20 7a 50 34 20 3d 20 64 69 73 70  ut;.  zP4 = disp
a8f0: 6c 61 79 50 34 28 70 4f 70 2c 20 7a 50 74 72 2c  layP4(pOp, zPtr,
a900: 20 73 69 7a 65 6f 66 28 7a 50 74 72 29 29 3b 0a   sizeof(zPtr));.
a910: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
a920: 41 42 4c 45 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d  ABLE_EXPLAIN_COM
a930: 4d 45 4e 54 53 0a 20 20 64 69 73 70 6c 61 79 43  MENTS.  displayC
a940: 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34 2c  omment(pOp, zP4,
a950: 20 7a 43 6f 6d 2c 20 73 69 7a 65 6f 66 28 7a 43   zCom, sizeof(zC
a960: 6f 6d 29 29 3b 0a 23 65 6c 73 65 0a 20 20 7a 43  om));.#else.  zC
a970: 6f 6d 5b 30 5d 20 3d 20 30 3b 0a 23 65 6e 64 69  om[0] = 0;.#endi
a980: 66 0a 20 20 2f 2a 20 4e 42 3a 20 20 54 68 65 20  f.  /* NB:  The 
a990: 73 71 6c 69 74 65 33 4f 70 63 6f 64 65 4e 61 6d  sqlite3OpcodeNam
a9a0: 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  e() function is 
a9b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
a9c0: 6f 64 65 20 63 72 65 61 74 65 64 0a 20 20 2a 2a  ode created.  **
a9d0: 20 62 79 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65   by the mkopcode
a9e0: 68 2e 61 77 6b 20 61 6e 64 20 6d 6b 6f 70 63 6f  h.awk and mkopco
a9f0: 64 65 63 2e 61 77 6b 20 73 63 72 69 70 74 73 20  dec.awk scripts 
aa00: 77 68 69 63 68 20 65 78 74 72 61 63 74 20 74 68  which extract th
aa10: 65 0a 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69  e.  ** informati
aa20: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 76 64 62 65  on from the vdbe
aa30: 2e 63 20 73 6f 75 72 63 65 20 74 65 78 74 20 2a  .c source text *
aa40: 2f 0a 20 20 66 70 72 69 6e 74 66 28 70 4f 75 74  /.  fprintf(pOut
aa50: 2c 20 7a 46 6f 72 6d 61 74 31 2c 20 70 63 2c 20  , zFormat1, pc, 
aa60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70  .      sqlite3Op
aa70: 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f 70  codeName(pOp->op
aa80: 63 6f 64 65 29 2c 20 70 4f 70 2d 3e 70 31 2c 20  code), pOp->p1, 
aa90: 70 4f 70 2d 3e 70 32 2c 20 70 4f 70 2d 3e 70 33  pOp->p2, pOp->p3
aaa0: 2c 20 7a 50 34 2c 20 70 4f 70 2d 3e 70 35 2c 0a  , zP4, pOp->p5,.
aab0: 20 20 20 20 20 20 7a 43 6f 6d 0a 20 20 29 3b 0a        zCom.  );.
aac0: 20 20 66 66 6c 75 73 68 28 70 4f 75 74 29 3b 0a    fflush(pOut);.
aad0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
aae0: 52 65 6c 65 61 73 65 20 61 6e 20 61 72 72 61 79  Release an array
aaf0: 20 6f 66 20 4e 20 4d 65 6d 20 65 6c 65 6d 65 6e   of N Mem elemen
ab00: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ts.*/.static voi
ab10: 64 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61  d releaseMemArra
ab20: 79 28 4d 65 6d 20 2a 70 2c 20 69 6e 74 20 4e 29  y(Mem *p, int N)
ab30: 7b 0a 20 20 69 66 28 20 70 20 26 26 20 4e 20 29  {.  if( p && N )
ab40: 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 45 6e 64 20  {.    Mem *pEnd 
ab50: 3d 20 26 70 5b 4e 5d 3b 0a 20 20 20 20 73 71 6c  = &p[N];.    sql
ab60: 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62  ite3 *db = p->db
ab70: 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 6e  ;.    if( db->pn
ab80: 42 79 74 65 73 46 72 65 65 64 20 29 7b 0a 20 20  BytesFreed ){.  
ab90: 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
aba0: 69 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20  if( p->szMalloc 
abb0: 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  ) sqlite3DbFree(
abc0: 64 62 2c 20 70 2d 3e 7a 4d 61 6c 6c 6f 63 29 3b  db, p->zMalloc);
abd0: 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 28  .      }while( (
abe0: 2b 2b 70 29 3c 70 45 6e 64 20 29 3b 0a 20 20 20  ++p)<pEnd );.   
abf0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
ac00: 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 61  .    do{.      a
ac10: 73 73 65 72 74 28 20 28 26 70 5b 31 5d 29 3d 3d  ssert( (&p[1])==
ac20: 70 45 6e 64 20 7c 7c 20 70 5b 30 5d 2e 64 62 3d  pEnd || p[0].db=
ac30: 3d 70 5b 31 5d 2e 64 62 20 29 3b 0a 20 20 20 20  =p[1].db );.    
ac40: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
ac50: 33 56 64 62 65 43 68 65 63 6b 4d 65 6d 49 6e 76  3VdbeCheckMemInv
ac60: 61 72 69 61 6e 74 73 28 70 29 20 29 3b 0a 0a 20  ariants(p) );.. 
ac70: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c 6f       /* This blo
ac80: 63 6b 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20  ck is really an 
ac90: 69 6e 6c 69 6e 65 64 20 76 65 72 73 69 6f 6e 20  inlined version 
aca0: 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65  of sqlite3VdbeMe
acb0: 6d 52 65 6c 65 61 73 65 28 29 0a 20 20 20 20 20  mRelease().     
acc0: 20 2a 2a 20 74 68 61 74 20 74 61 6b 65 73 20 61   ** that takes a
acd0: 64 76 61 6e 74 61 67 65 20 6f 66 20 74 68 65 20  dvantage of the 
ace0: 66 61 63 74 20 74 68 61 74 20 74 68 65 20 6d 65  fact that the me
acf0: 6d 6f 72 79 20 63 65 6c 6c 20 76 61 6c 75 65 20  mory cell value 
ad00: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  is .      ** bei
ad10: 6e 67 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  ng set to NULL a
ad20: 66 74 65 72 20 72 65 6c 65 61 73 69 6e 67 20 61  fter releasing a
ad30: 6e 79 20 64 79 6e 61 6d 69 63 20 72 65 73 6f 75  ny dynamic resou
ad40: 72 63 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  rces..      **. 
ad50: 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 75 73 74       ** The just
ad60: 69 66 69 63 61 74 69 6f 6e 20 66 6f 72 20 64 75  ification for du
ad70: 70 6c 69 63 61 74 69 6e 67 20 63 6f 64 65 20 69  plicating code i
ad80: 73 20 74 68 61 74 20 61 63 63 6f 72 64 69 6e 67  s that according
ad90: 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 61   to .      ** ca
ada0: 6c 6c 67 72 69 6e 64 2c 20 74 68 69 73 20 63 61  llgrind, this ca
adb0: 75 73 65 73 20 61 20 63 65 72 74 61 69 6e 20 74  uses a certain t
adc0: 65 73 74 20 63 61 73 65 20 74 6f 20 68 69 74 20  est case to hit 
add0: 74 68 65 20 43 50 55 20 34 2e 37 20 0a 20 20 20  the CPU 4.7 .   
ade0: 20 20 20 2a 2a 20 70 65 72 63 65 6e 74 20 6c 65     ** percent le
adf0: 73 73 20 28 78 38 36 20 6c 69 6e 75 78 2c 20 67  ss (x86 linux, g
ae00: 63 63 20 76 65 72 73 69 6f 6e 20 34 2e 31 2e 32  cc version 4.1.2
ae10: 2c 20 2d 4f 36 29 20 74 68 61 6e 20 69 66 20 0a  , -O6) than if .
ae20: 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33        ** sqlite3
ae30: 4d 65 6d 52 65 6c 65 61 73 65 28 29 20 77 65 72  MemRelease() wer
ae40: 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 68 65  e called from he
ae50: 72 65 2e 20 57 69 74 68 20 2d 4f 32 2c 20 74 68  re. With -O2, th
ae60: 69 73 20 6a 75 6d 70 73 0a 20 20 20 20 20 20 2a  is jumps.      *
ae70: 2a 20 74 6f 20 36 2e 36 20 70 65 72 63 65 6e 74  * to 6.6 percent
ae80: 2e 20 54 68 65 20 74 65 73 74 20 63 61 73 65 20  . The test case 
ae90: 69 73 20 69 6e 73 65 72 74 69 6e 67 20 31 30 30  is inserting 100
aea0: 30 20 72 6f 77 73 20 69 6e 74 6f 20 61 20 74 61  0 rows into a ta
aeb0: 62 6c 65 20 0a 20 20 20 20 20 20 2a 2a 20 77 69  ble .      ** wi
aec0: 74 68 20 6e 6f 20 69 6e 64 65 78 65 73 20 75 73  th no indexes us
aed0: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 70 72 65  ing a single pre
aee0: 70 61 72 65 64 20 49 4e 53 45 52 54 20 73 74 61  pared INSERT sta
aef0: 74 65 6d 65 6e 74 2c 20 62 69 6e 64 28 29 20 0a  tement, bind() .
af00: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72 65 73        ** and res
af10: 65 74 28 29 2e 20 49 6e 73 65 72 74 73 20 61 72  et(). Inserts ar
af20: 65 20 67 72 6f 75 70 65 64 20 69 6e 74 6f 20 61  e grouped into a
af30: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
af40: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
af50: 74 63 61 73 65 28 20 70 2d 3e 66 6c 61 67 73 20  tcase( p->flags 
af60: 26 20 4d 45 4d 5f 41 67 67 20 29 3b 0a 20 20 20  & MEM_Agg );.   
af70: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e     testcase( p->
af80: 66 6c 61 67 73 20 26 20 4d 45 4d 5f 44 79 6e 20  flags & MEM_Dyn 
af90: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
afa0: 65 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 4d 45  e( p->flags & ME
afb0: 4d 5f 46 72 61 6d 65 20 29 3b 0a 20 20 20 20 20  M_Frame );.     
afc0: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 6c   testcase( p->fl
afd0: 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53 65 74  ags & MEM_RowSet
afe0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   );.      if( p-
aff0: 3e 66 6c 61 67 73 26 28 4d 45 4d 5f 41 67 67 7c  >flags&(MEM_Agg|
b000: 4d 45 4d 5f 44 79 6e 7c 4d 45 4d 5f 46 72 61 6d  MEM_Dyn|MEM_Fram
b010: 65 7c 4d 45 4d 5f 52 6f 77 53 65 74 29 20 29 7b  e|MEM_RowSet) ){
b020: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b030: 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 70  VdbeMemRelease(p
b040: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
b050: 66 28 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 29  f( p->szMalloc )
b060: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b070: 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a  3DbFree(db, p->z
b080: 4d 61 6c 6c 6f 63 29 3b 0a 20 20 20 20 20 20 20  Malloc);.       
b090: 20 70 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30   p->szMalloc = 0
b0a0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
b0b0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f   p->flags = MEM_
b0c0: 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 7d  Undefined;.    }
b0d0: 77 68 69 6c 65 28 20 28 2b 2b 70 29 3c 70 45 6e  while( (++p)<pEn
b0e0: 64 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  d );.  }.}../*.*
b0f0: 2a 20 44 65 6c 65 74 65 20 61 20 56 64 62 65 46  * Delete a VdbeF
b100: 72 61 6d 65 20 6f 62 6a 65 63 74 20 61 6e 64 20  rame object and 
b110: 69 74 73 20 63 6f 6e 74 65 6e 74 73 2e 20 56 64  its contents. Vd
b120: 62 65 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 20  beFrame objects 
b130: 61 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64  are.** allocated
b140: 20 62 79 20 74 68 65 20 4f 50 5f 50 72 6f 67 72   by the OP_Progr
b150: 61 6d 20 6f 70 63 6f 64 65 20 69 6e 20 73 71 6c  am opcode in sql
b160: 69 74 65 33 56 64 62 65 45 78 65 63 28 29 2e 0a  ite3VdbeExec()..
b170: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56  */.void sqlite3V
b180: 64 62 65 46 72 61 6d 65 44 65 6c 65 74 65 28 56  dbeFrameDelete(V
b190: 64 62 65 46 72 61 6d 65 20 2a 70 29 7b 0a 20 20  dbeFrame *p){.  
b1a0: 69 6e 74 20 69 3b 0a 20 20 4d 65 6d 20 2a 61 4d  int i;.  Mem *aM
b1b0: 65 6d 20 3d 20 56 64 62 65 46 72 61 6d 65 4d 65  em = VdbeFrameMe
b1c0: 6d 28 70 29 3b 0a 20 20 56 64 62 65 43 75 72 73  m(p);.  VdbeCurs
b1d0: 6f 72 20 2a 2a 61 70 43 73 72 20 3d 20 28 56 64  or **apCsr = (Vd
b1e0: 62 65 43 75 72 73 6f 72 20 2a 2a 29 26 61 4d 65  beCursor **)&aMe
b1f0: 6d 5b 70 2d 3e 6e 43 68 69 6c 64 4d 65 6d 5d 3b  m[p->nChildMem];
b200: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
b210: 3e 6e 43 68 69 6c 64 43 73 72 3b 20 69 2b 2b 29  >nChildCsr; i++)
b220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
b230: 65 46 72 65 65 43 75 72 73 6f 72 28 70 2d 3e 76  eFreeCursor(p->v
b240: 2c 20 61 70 43 73 72 5b 69 5d 29 3b 0a 20 20 7d  , apCsr[i]);.  }
b250: 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72  .  releaseMemArr
b260: 61 79 28 61 4d 65 6d 2c 20 70 2d 3e 6e 43 68 69  ay(aMem, p->nChi
b270: 6c 64 4d 65 6d 29 3b 0a 20 20 73 71 6c 69 74 65  ldMem);.  sqlite
b280: 33 56 64 62 65 44 65 6c 65 74 65 41 75 78 44 61  3VdbeDeleteAuxDa
b290: 74 61 28 70 2d 3e 76 2d 3e 64 62 2c 20 26 70 2d  ta(p->v->db, &p-
b2a0: 3e 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30  >pAuxData, -1, 0
b2b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
b2c0: 65 65 28 70 2d 3e 76 2d 3e 64 62 2c 20 70 29 3b  ee(p->v->db, p);
b2d0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
b2e0: 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 0a  TE_OMIT_EXPLAIN.
b2f0: 2f 2a 0a 2a 2a 20 47 69 76 65 20 61 20 6c 69 73  /*.** Give a lis
b300: 74 69 6e 67 20 6f 66 20 74 68 65 20 70 72 6f 67  ting of the prog
b310: 72 61 6d 20 69 6e 20 74 68 65 20 76 69 72 74 75  ram in the virtu
b320: 61 6c 20 6d 61 63 68 69 6e 65 2e 0a 2a 2a 0a 2a  al machine..**.*
b330: 2a 20 54 68 65 20 69 6e 74 65 72 66 61 63 65 20  * The interface 
b340: 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  is the same as s
b350: 71 6c 69 74 65 33 56 64 62 65 45 78 65 63 28 29  qlite3VdbeExec()
b360: 2e 20 20 42 75 74 20 69 6e 73 74 65 61 64 20 6f  .  But instead o
b370: 66 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 74 68 65  f.** running the
b380: 20 63 6f 64 65 2c 20 69 74 20 69 6e 76 6f 6b 65   code, it invoke
b390: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 6f  s the callback o
b3a0: 6e 63 65 20 66 6f 72 20 65 61 63 68 20 69 6e 73  nce for each ins
b3b0: 74 72 75 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 69  truction..** Thi
b3c0: 73 20 66 65 61 74 75 72 65 20 69 73 20 75 73 65  s feature is use
b3d0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 22  d to implement "
b3e0: 45 58 50 4c 41 49 4e 22 2e 0a 2a 2a 0a 2a 2a 20  EXPLAIN"..**.** 
b3f0: 57 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d  When p->explain=
b400: 3d 31 2c 20 65 61 63 68 20 69 6e 73 74 72 75 63  =1, each instruc
b410: 74 69 6f 6e 20 69 73 20 6c 69 73 74 65 64 2e 20  tion is listed. 
b420: 20 57 68 65 6e 0a 2a 2a 20 70 2d 3e 65 78 70 6c   When.** p->expl
b430: 61 69 6e 3d 3d 32 2c 20 6f 6e 6c 79 20 4f 50 5f  ain==2, only OP_
b440: 45 78 70 6c 61 69 6e 20 69 6e 73 74 72 75 63 74  Explain instruct
b450: 69 6f 6e 73 20 61 72 65 20 6c 69 73 74 65 64 20  ions are listed 
b460: 61 6e 64 20 74 68 65 73 65 0a 2a 2a 20 61 72 65  and these.** are
b470: 20 73 68 6f 77 6e 20 69 6e 20 61 20 64 69 66 66   shown in a diff
b480: 65 72 65 6e 74 20 66 6f 72 6d 61 74 2e 20 20 70  erent format.  p
b490: 2d 3e 65 78 70 6c 61 69 6e 3d 3d 32 20 69 73 20  ->explain==2 is 
b4a0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
b4b0: 74 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  t.** EXPLAIN QUE
b4c0: 52 59 20 50 4c 41 4e 2e 0a 2a 2a 0a 2a 2a 20 57  RY PLAN..**.** W
b4d0: 68 65 6e 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d  hen p->explain==
b4e0: 31 2c 20 66 69 72 73 74 20 74 68 65 20 6d 61 69  1, first the mai
b4f0: 6e 20 70 72 6f 67 72 61 6d 20 69 73 20 6c 69 73  n program is lis
b500: 74 65 64 2c 20 74 68 65 6e 20 65 61 63 68 20 6f  ted, then each o
b510: 66 0a 2a 2a 20 74 68 65 20 74 72 69 67 67 65 72  f.** the trigger
b520: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
b530: 20 6c 69 73 74 65 64 20 6f 6e 65 20 62 79 20 6f   listed one by o
b540: 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ne..*/.int sqlit
b550: 65 33 56 64 62 65 4c 69 73 74 28 0a 20 20 56 64  e3VdbeList(.  Vd
b560: 62 65 20 2a 70 20 20 20 20 20 20 20 20 20 20 20  be *p           
b570: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
b580: 44 42 45 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  DBE */.){.  int 
b590: 6e 52 6f 77 3b 20 20 20 20 20 20 20 20 20 20 20  nRow;           
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 2f 2a 20 53 74 6f 70 20 77 68 65 6e 20 72 6f   /* Stop when ro
b5c0: 77 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  w count reaches 
b5d0: 74 68 69 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53  this */.  int nS
b5e0: 75 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ub = 0;         
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b600: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 2d  * Number of sub-
b610: 76 64 62 65 73 20 73 65 65 6e 20 73 6f 20 66 61  vdbes seen so fa
b620: 72 20 2a 2f 0a 20 20 53 75 62 50 72 6f 67 72 61  r */.  SubProgra
b630: 6d 20 2a 2a 61 70 53 75 62 20 3d 20 30 3b 20 20  m **apSub = 0;  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
b650: 72 72 61 79 20 6f 66 20 73 75 62 2d 76 64 62 65  rray of sub-vdbe
b660: 73 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 53 75 62  s */.  Mem *pSub
b670: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
b680: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
b690: 65 6d 6f 72 79 20 63 65 6c 6c 20 68 6f 6c 64 20  emory cell hold 
b6a0: 61 72 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67  array of subprog
b6b0: 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  s */.  sqlite3 *
b6c0: 64 62 20 3d 20 70 2d 3e 64 62 3b 20 20 20 20 20  db = p->db;     
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
b6e0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
b6f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ection */.  int 
b700: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b720: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
b730: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
b740: 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
b750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
b760: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 4d  turn code */.  M
b770: 65 6d 20 2a 70 4d 65 6d 20 3d 20 26 70 2d 3e 61  em *pMem = &p->a
b780: 4d 65 6d 5b 31 5d 3b 20 20 20 20 20 20 20 20 20  Mem[1];         
b790: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 4d 65 6d      /* First Mem
b7a0: 20 6f 66 20 72 65 73 75 6c 74 20 73 65 74 20 2a   of result set *
b7b0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  /..  assert( p->
b7c0: 65 78 70 6c 61 69 6e 20 29 3b 0a 20 20 61 73 73  explain );.  ass
b7d0: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
b7e0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 3b  DBE_MAGIC_RUN );
b7f0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 72 63  .  assert( p->rc
b800: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
b810: 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ->rc==SQLITE_BUS
b820: 59 20 7c 7c 20 70 2d 3e 72 63 3d 3d 53 51 4c 49  Y || p->rc==SQLI
b830: 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 0a 20 20 2f  TE_NOMEM );..  /
b840: 2a 20 45 76 65 6e 20 74 68 6f 75 67 68 20 74 68  * Even though th
b850: 69 73 20 6f 70 63 6f 64 65 20 64 6f 65 73 20 6e  is opcode does n
b860: 6f 74 20 75 73 65 20 64 79 6e 61 6d 69 63 20 73  ot use dynamic s
b870: 74 72 69 6e 67 73 20 66 6f 72 0a 20 20 2a 2a 20  trings for.  ** 
b880: 74 68 65 20 72 65 73 75 6c 74 2c 20 72 65 73 75  the result, resu
b890: 6c 74 20 63 6f 6c 75 6d 6e 73 20 6d 61 79 20 62  lt columns may b
b8a0: 65 63 6f 6d 65 20 64 79 6e 61 6d 69 63 20 69 66  ecome dynamic if
b8b0: 20 74 68 65 20 75 73 65 72 20 63 61 6c 6c 73 0a   the user calls.
b8c0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    ** sqlite3_col
b8d0: 75 6d 6e 5f 74 65 78 74 31 36 28 29 2c 20 63 61  umn_text16(), ca
b8e0: 75 73 69 6e 67 20 61 20 74 72 61 6e 73 6c 61 74  using a translat
b8f0: 69 6f 6e 20 74 6f 20 55 54 46 2d 31 36 20 65 6e  ion to UTF-16 en
b900: 63 6f 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 72  coding..  */.  r
b910: 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28 70  eleaseMemArray(p
b920: 4d 65 6d 2c 20 38 29 3b 0a 20 20 70 2d 3e 70 52  Mem, 8);.  p->pR
b930: 65 73 75 6c 74 53 65 74 20 3d 20 30 3b 0a 0a 20  esultSet = 0;.. 
b940: 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
b950: 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 20 29 7b  TE_NOMEM_BKPT ){
b960: 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
b970: 70 65 6e 73 20 69 66 20 61 20 6d 61 6c 6c 6f 63  pens if a malloc
b980: 28 29 20 69 6e 73 69 64 65 20 61 20 63 61 6c 6c  () inside a call
b990: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   to sqlite3_colu
b9a0: 6d 6e 5f 74 65 78 74 28 29 20 6f 72 0a 20 20 20  mn_text() or.   
b9b0: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   ** sqlite3_colu
b9c0: 6d 6e 5f 74 65 78 74 31 36 28 29 20 66 61 69 6c  mn_text16() fail
b9d0: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  ed.  */.    sqli
b9e0: 74 65 33 4f 6f 6d 46 61 75 6c 74 28 64 62 29 3b  te3OomFault(db);
b9f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
ba00: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
ba10: 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d   /* When the num
ba20: 62 65 72 20 6f 66 20 6f 75 74 70 75 74 20 72 6f  ber of output ro
ba30: 77 73 20 72 65 61 63 68 65 73 20 6e 52 6f 77 2c  ws reaches nRow,
ba40: 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 65 0a   that means the.
ba50: 20 20 2a 2a 20 6c 69 73 74 69 6e 67 20 68 61 73    ** listing has
ba60: 20 66 69 6e 69 73 68 65 64 20 61 6e 64 20 73 71   finished and sq
ba70: 6c 69 74 65 33 5f 73 74 65 70 28 29 20 73 68 6f  lite3_step() sho
ba80: 75 6c 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  uld return SQLIT
ba90: 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2a 20 6e 52 6f  E_DONE..  ** nRo
baa0: 77 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  w is the sum of 
bab0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
bac0: 77 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 70  ws in the main p
bad0: 72 6f 67 72 61 6d 2c 20 70 6c 75 73 0a 20 20 2a  rogram, plus.  *
bae0: 2a 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65  * the sum of the
baf0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
bb00: 69 6e 20 61 6c 6c 20 74 72 69 67 67 65 72 20 73  in all trigger s
bb10: 75 62 70 72 6f 67 72 61 6d 73 20 65 6e 63 6f 75  ubprograms encou
bb20: 6e 74 65 72 65 64 0a 20 20 2a 2a 20 73 6f 20 66  ntered.  ** so f
bb30: 61 72 2e 20 20 54 68 65 20 6e 52 6f 77 20 76 61  ar.  The nRow va
bb40: 6c 75 65 20 77 69 6c 6c 20 69 6e 63 72 65 61 73  lue will increas
bb50: 65 20 61 73 20 6e 65 77 20 74 72 69 67 67 65 72  e as new trigger
bb60: 20 73 75 62 70 72 6f 67 72 61 6d 73 20 61 72 65   subprograms are
bb70: 0a 20 20 2a 2a 20 65 6e 63 6f 75 6e 74 65 72 65  .  ** encountere
bb80: 64 2c 20 62 75 74 20 70 2d 3e 70 63 20 77 69 6c  d, but p->pc wil
bb90: 6c 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 74  l eventually cat
bba0: 63 68 20 75 70 20 74 6f 20 6e 52 6f 77 2e 0a 20  ch up to nRow.. 
bbb0: 20 2a 2f 0a 20 20 6e 52 6f 77 20 3d 20 70 2d 3e   */.  nRow = p->
bbc0: 6e 4f 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 78  nOp;.  if( p->ex
bbd0: 70 6c 61 69 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  plain==1 ){.    
bbe0: 2f 2a 20 54 68 65 20 66 69 72 73 74 20 38 20 6d  /* The first 8 m
bbf0: 65 6d 6f 72 79 20 63 65 6c 6c 73 20 61 72 65 20  emory cells are 
bc00: 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 65 73  used for the res
bc10: 75 6c 74 20 73 65 74 2e 20 20 53 6f 20 77 65 20  ult set.  So we 
bc20: 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 63 6f 6d 6d  will.    ** comm
bc30: 61 6e 64 65 65 72 20 74 68 65 20 39 74 68 20 63  andeer the 9th c
bc40: 65 6c 6c 20 74 6f 20 75 73 65 20 61 73 20 73 74  ell to use as st
bc50: 6f 72 61 67 65 20 66 6f 72 20 61 6e 20 61 72 72  orage for an arr
bc60: 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 0a 20  ay of pointers. 
bc70: 20 20 20 2a 2a 20 74 6f 20 74 72 69 67 67 65 72     ** to trigger
bc80: 20 73 75 62 70 72 6f 67 72 61 6d 73 2e 20 20 54   subprograms.  T
bc90: 68 65 20 56 44 42 45 20 69 73 20 67 75 61 72 61  he VDBE is guara
bca0: 6e 74 65 65 64 20 74 6f 20 68 61 76 65 20 61 74  nteed to have at
bcb0: 20 6c 65 61 73 74 20 39 0a 20 20 20 20 2a 2a 20   least 9.    ** 
bcc0: 63 65 6c 6c 73 2e 20 20 2a 2f 0a 20 20 20 20 61  cells.  */.    a
bcd0: 73 73 65 72 74 28 20 70 2d 3e 6e 4d 65 6d 3e 39  ssert( p->nMem>9
bce0: 20 29 3b 0a 20 20 20 20 70 53 75 62 20 3d 20 26   );.    pSub = &
bcf0: 70 2d 3e 61 4d 65 6d 5b 39 5d 3b 0a 20 20 20 20  p->aMem[9];.    
bd00: 69 66 28 20 70 53 75 62 2d 3e 66 6c 61 67 73 26  if( pSub->flags&
bd10: 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a 20 20 20 20  MEM_Blob ){.    
bd20: 20 20 2f 2a 20 4f 6e 20 74 68 65 20 66 69 72 73    /* On the firs
bd30: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
bd40: 33 5f 73 74 65 70 28 29 2c 20 70 53 75 62 20 77  3_step(), pSub w
bd50: 69 6c 6c 20 68 6f 6c 64 20 61 20 4e 55 4c 4c 2e  ill hold a NULL.
bd60: 20 20 49 74 20 69 73 0a 20 20 20 20 20 20 2a 2a    It is.      **
bd70: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
bd80: 61 20 42 4c 4f 42 20 62 79 20 74 68 65 20 50 34  a BLOB by the P4
bd90: 5f 53 55 42 50 52 4f 47 52 41 4d 20 70 72 6f 63  _SUBPROGRAM proc
bda0: 65 73 73 69 6e 67 20 6c 6f 67 69 63 20 62 65 6c  essing logic bel
bdb0: 6f 77 20 2a 2f 0a 20 20 20 20 20 20 6e 53 75 62  ow */.      nSub
bdc0: 20 3d 20 70 53 75 62 2d 3e 6e 2f 73 69 7a 65 6f   = pSub->n/sizeo
bdd0: 66 28 56 64 62 65 2a 29 3b 0a 20 20 20 20 20 20  f(Vdbe*);.      
bde0: 61 70 53 75 62 20 3d 20 28 53 75 62 50 72 6f 67  apSub = (SubProg
bdf0: 72 61 6d 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a  ram **)pSub->z;.
be00: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
be10: 30 3b 20 69 3c 6e 53 75 62 3b 20 69 2b 2b 29 7b  0; i<nSub; i++){
be20: 0a 20 20 20 20 20 20 6e 52 6f 77 20 2b 3d 20 61  .      nRow += a
be30: 70 53 75 62 5b 69 5d 2d 3e 6e 4f 70 3b 0a 20 20  pSub[i]->nOp;.  
be40: 20 20 7d 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20    }.  }..  do{. 
be50: 20 20 20 69 20 3d 20 70 2d 3e 70 63 2b 2b 3b 0a     i = p->pc++;.
be60: 20 20 7d 77 68 69 6c 65 28 20 69 3c 6e 52 6f 77    }while( i<nRow
be70: 20 26 26 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d   && p->explain==
be80: 32 20 26 26 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f  2 && p->aOp[i].o
be90: 70 63 6f 64 65 21 3d 4f 50 5f 45 78 70 6c 61 69  pcode!=OP_Explai
bea0: 6e 20 29 3b 0a 20 20 69 66 28 20 69 3e 3d 6e 52  n );.  if( i>=nR
beb0: 6f 77 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20  ow ){.    p->rc 
bec0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
bed0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
bee0: 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 64  E;.  }else if( d
bef0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
bf00: 74 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  ted ){.    p->rc
bf10: 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52   = SQLITE_INTERR
bf20: 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  UPT;.    rc = SQ
bf30: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
bf40: 73 71 6c 69 74 65 33 56 64 62 65 45 72 72 6f 72  sqlite3VdbeError
bf50: 28 70 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74  (p, sqlite3ErrSt
bf60: 72 28 70 2d 3e 72 63 29 29 3b 0a 20 20 7d 65 6c  r(p->rc));.  }el
bf70: 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50  se{.    char *zP
bf80: 34 3b 0a 20 20 20 20 4f 70 20 2a 70 4f 70 3b 0a  4;.    Op *pOp;.
bf90: 20 20 20 20 69 66 28 20 69 3c 70 2d 3e 6e 4f 70      if( i<p->nOp
bfa0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   ){.      /* The
bfb0: 20 6f 75 74 70 75 74 20 6c 69 6e 65 20 6e 75 6d   output line num
bfc0: 62 65 72 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f  ber is small eno
bfd0: 75 67 68 20 74 68 61 74 20 77 65 20 61 72 65 20  ugh that we are 
bfe0: 73 74 69 6c 6c 20 69 6e 20 74 68 65 0a 20 20 20  still in the.   
bff0: 20 20 20 2a 2a 20 6d 61 69 6e 20 70 72 6f 67 72     ** main progr
c000: 61 6d 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4f 70  am. */.      pOp
c010: 20 3d 20 26 70 2d 3e 61 4f 70 5b 69 5d 3b 0a 20   = &p->aOp[i];. 
c020: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c030: 2f 2a 20 57 65 20 61 72 65 20 63 75 72 72 65 6e  /* We are curren
c040: 74 6c 79 20 6c 69 73 74 69 6e 67 20 73 75 62 70  tly listing subp
c050: 72 6f 67 72 61 6d 73 2e 20 20 46 69 67 75 72 65  rograms.  Figure
c060: 20 6f 75 74 20 77 68 69 63 68 20 6f 6e 65 20 61   out which one a
c070: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 69 63 6b  nd.      ** pick
c080: 20 75 70 20 74 68 65 20 61 70 70 72 6f 70 72 69   up the appropri
c090: 61 74 65 20 6f 70 63 6f 64 65 2e 20 2a 2f 0a 20  ate opcode. */. 
c0a0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
c0b0: 20 20 69 20 2d 3d 20 70 2d 3e 6e 4f 70 3b 0a 20    i -= p->nOp;. 
c0c0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 69 3e       for(j=0; i>
c0d0: 3d 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70 3b 20  =apSub[j]->nOp; 
c0e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 20  j++){.        i 
c0f0: 2d 3d 20 61 70 53 75 62 5b 6a 5d 2d 3e 6e 4f 70  -= apSub[j]->nOp
c100: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c110: 70 4f 70 20 3d 20 26 61 70 53 75 62 5b 6a 5d 2d  pOp = &apSub[j]-
c120: 3e 61 4f 70 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20  >aOp[i];.    }. 
c130: 20 20 20 69 66 28 20 70 2d 3e 65 78 70 6c 61 69     if( p->explai
c140: 6e 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 70 4d  n==1 ){.      pM
c150: 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
c160: 49 6e 74 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  Int;.      pMem-
c170: 3e 75 2e 69 20 3d 20 69 3b 20 20 20 20 20 20 20  >u.i = i;       
c180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c190: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 6f 67           /* Prog
c1a0: 72 61 6d 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  ram counter */. 
c1b0: 20 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a       pMem++;.  .
c1c0: 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
c1d0: 73 20 3d 20 4d 45 4d 5f 53 74 61 74 69 63 7c 4d  s = MEM_Static|M
c1e0: 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d 3b  EM_Str|MEM_Term;
c1f0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a 20 3d  .      pMem->z =
c200: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 4f   (char*)sqlite3O
c210: 70 63 6f 64 65 4e 61 6d 65 28 70 4f 70 2d 3e 6f  pcodeName(pOp->o
c220: 70 63 6f 64 65 29 3b 20 2f 2a 20 4f 70 63 6f 64  pcode); /* Opcod
c230: 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
c240: 74 28 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b  t( pMem->z!=0 );
c250: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d  .      pMem->n =
c260: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
c270: 28 70 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20  (pMem->z);.     
c280: 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c   pMem->enc = SQL
c290: 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20 20  ITE_UTF8;.      
c2a0: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  pMem++;..      /
c2b0: 2a 20 57 68 65 6e 20 61 6e 20 4f 50 5f 50 72 6f  * When an OP_Pro
c2c0: 67 72 61 6d 20 6f 70 63 6f 64 65 20 69 73 20 65  gram opcode is e
c2d0: 6e 63 6f 75 6e 74 65 72 20 28 74 68 65 20 6f 6e  ncounter (the on
c2e0: 6c 79 20 6f 70 63 6f 64 65 20 74 68 61 74 20 68  ly opcode that h
c2f0: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 50 34  as.      ** a P4
c300: 5f 53 55 42 50 52 4f 47 52 41 4d 20 61 72 67 75  _SUBPROGRAM argu
c310: 6d 65 6e 74 29 2c 20 65 78 70 61 6e 64 20 74 68  ment), expand th
c320: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 61 72  e size of the ar
c330: 72 61 79 20 6f 66 20 73 75 62 70 72 6f 67 72 61  ray of subprogra
c340: 6d 73 0a 20 20 20 20 20 20 2a 2a 20 6b 65 70 74  ms.      ** kept
c350: 20 69 6e 20 70 2d 3e 61 4d 65 6d 5b 39 5d 2e 7a   in p->aMem[9].z
c360: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
c370: 20 70 72 6f 67 72 61 6d 20 2d 20 61 73 73 75 6d   program - assum
c380: 69 6e 67 20 74 68 69 73 20 73 75 62 70 72 6f 67  ing this subprog
c390: 72 61 6d 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ram.      ** has
c3a0: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 62 65 65   not already bee
c3b0: 6e 20 73 65 65 6e 2e 0a 20 20 20 20 20 20 2a 2f  n seen..      */
c3c0: 0a 20 20 20 20 20 20 69 66 28 20 70 4f 70 2d 3e  .      if( pOp->
c3d0: 70 34 74 79 70 65 3d 3d 50 34 5f 53 55 42 50 52  p4type==P4_SUBPR
c3e0: 4f 47 52 41 4d 20 29 7b 0a 20 20 20 20 20 20 20  OGRAM ){.       
c3f0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 28 6e 53   int nByte = (nS
c400: 75 62 2b 31 29 2a 73 69 7a 65 6f 66 28 53 75 62  ub+1)*sizeof(Sub
c410: 50 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20  Program*);.     
c420: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
c430: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6e 53 75    for(j=0; j<nSu
c440: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  b; j++){.       
c450: 20 20 20 69 66 28 20 61 70 53 75 62 5b 6a 5d 3d     if( apSub[j]=
c460: 3d 70 4f 70 2d 3e 70 34 2e 70 50 72 6f 67 72 61  =pOp->p4.pProgra
c470: 6d 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  m ) break;.     
c480: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
c490: 20 6a 3d 3d 6e 53 75 62 20 26 26 20 53 51 4c 49   j==nSub && SQLI
c4a0: 54 45 5f 4f 4b 3d 3d 73 71 6c 69 74 65 33 56 64  TE_OK==sqlite3Vd
c4b0: 62 65 4d 65 6d 47 72 6f 77 28 70 53 75 62 2c 20  beMemGrow(pSub, 
c4c0: 6e 42 79 74 65 2c 20 6e 53 75 62 21 3d 30 29 20  nByte, nSub!=0) 
c4d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 53  ){.          apS
c4e0: 75 62 20 3d 20 28 53 75 62 50 72 6f 67 72 61 6d  ub = (SubProgram
c4f0: 20 2a 2a 29 70 53 75 62 2d 3e 7a 3b 0a 20 20 20   **)pSub->z;.   
c500: 20 20 20 20 20 20 20 61 70 53 75 62 5b 6e 53 75         apSub[nSu
c510: 62 2b 2b 5d 20 3d 20 70 4f 70 2d 3e 70 34 2e 70  b++] = pOp->p4.p
c520: 50 72 6f 67 72 61 6d 3b 0a 20 20 20 20 20 20 20  Program;.       
c530: 20 20 20 70 53 75 62 2d 3e 66 6c 61 67 73 20 7c     pSub->flags |
c540: 3d 20 4d 45 4d 5f 42 6c 6f 62 3b 0a 20 20 20 20  = MEM_Blob;.    
c550: 20 20 20 20 20 20 70 53 75 62 2d 3e 6e 20 3d 20        pSub->n = 
c560: 6e 53 75 62 2a 73 69 7a 65 6f 66 28 53 75 62 50  nSub*sizeof(SubP
c570: 72 6f 67 72 61 6d 2a 29 3b 0a 20 20 20 20 20 20  rogram*);.      
c580: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
c590: 7d 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  }..    pMem->fla
c5a0: 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
c5b0: 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 70 4f    pMem->u.i = pO
c5c0: 70 2d 3e 70 31 3b 20 20 20 20 20 20 20 20 20 20  p->p1;          
c5d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c5e0: 2f 2a 20 50 31 20 2a 2f 0a 20 20 20 20 70 4d 65  /* P1 */.    pMe
c5f0: 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65 6d 2d 3e  m++;..    pMem->
c600: 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b  flags = MEM_Int;
c610: 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
c620: 20 70 4f 70 2d 3e 70 32 3b 20 20 20 20 20 20 20   pOp->p2;       
c630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c640: 20 20 20 2f 2a 20 50 32 20 2a 2f 0a 20 20 20 20     /* P2 */.    
c650: 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 70 4d 65  pMem++;..    pMe
c660: 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
c670: 6e 74 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  nt;.    pMem->u.
c680: 69 20 3d 20 70 4f 70 2d 3e 70 33 3b 20 20 20 20  i = pOp->p3;    
c690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6a0: 20 20 20 20 20 20 2f 2a 20 50 33 20 2a 2f 0a 20        /* P3 */. 
c6b0: 20 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20     pMem++;..    
c6c0: 69 66 28 20 73 71 6c 69 74 65 33 56 64 62 65 4d  if( sqlite3VdbeM
c6d0: 65 6d 43 6c 65 61 72 41 6e 64 52 65 73 69 7a 65  emClearAndResize
c6e0: 28 70 4d 65 6d 2c 20 31 30 30 29 20 29 7b 20 2f  (pMem, 100) ){ /
c6f0: 2a 20 50 34 20 2a 2f 0a 20 20 20 20 20 20 61 73  * P4 */.      as
c700: 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c  sert( p->db->mal
c710: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
c720: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c730: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
c740: 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
c750: 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 54 65 72 6d  MEM_Str|MEM_Term
c760: 3b 0a 20 20 20 20 7a 50 34 20 3d 20 64 69 73 70  ;.    zP4 = disp
c770: 6c 61 79 50 34 28 70 4f 70 2c 20 70 4d 65 6d 2d  layP4(pOp, pMem-
c780: 3e 7a 2c 20 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c  >z, pMem->szMall
c790: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 34  oc);.    if( zP4
c7a0: 21 3d 70 4d 65 6d 2d 3e 7a 20 29 7b 0a 20 20 20  !=pMem->z ){.   
c7b0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65     sqlite3VdbeMe
c7c0: 6d 53 65 74 53 74 72 28 70 4d 65 6d 2c 20 7a 50  mSetStr(pMem, zP
c7d0: 34 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  4, -1, SQLITE_UT
c7e0: 46 38 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  F8, 0);.    }els
c7f0: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
c800: 20 70 4d 65 6d 2d 3e 7a 21 3d 30 20 29 3b 0a 20   pMem->z!=0 );. 
c810: 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20 73       pMem->n = s
c820: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70  qlite3Strlen30(p
c830: 4d 65 6d 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 70  Mem->z);.      p
c840: 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51 4c 49 54  Mem->enc = SQLIT
c850: 45 5f 55 54 46 38 3b 0a 20 20 20 20 7d 0a 20 20  E_UTF8;.    }.  
c860: 20 20 70 4d 65 6d 2b 2b 3b 0a 0a 20 20 20 20 69    pMem++;..    i
c870: 66 28 20 70 2d 3e 65 78 70 6c 61 69 6e 3d 3d 31  f( p->explain==1
c880: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
c890: 6c 69 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61  lite3VdbeMemClea
c8a0: 72 41 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c  rAndResize(pMem,
c8b0: 20 34 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61   4) ){.        a
c8c0: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
c8d0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
c8e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
c8f0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
c900: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
c910: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
c920: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
c930: 4d 65 6d 2d 3e 6e 20 3d 20 32 3b 0a 20 20 20 20  Mem->n = 2;.    
c940: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
c950: 74 66 28 33 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 22  tf(3, pMem->z, "
c960: 25 2e 32 78 22 2c 20 70 4f 70 2d 3e 70 35 29 3b  %.2x", pOp->p5);
c970: 20 20 20 2f 2a 20 50 35 20 2a 2f 0a 20 20 20 20     /* P5 */.    
c980: 20 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 53 51    pMem->enc = SQ
c990: 4c 49 54 45 5f 55 54 46 38 3b 0a 20 20 20 20 20  LITE_UTF8;.     
c9a0: 20 70 4d 65 6d 2b 2b 3b 0a 20 20 0a 23 69 66 64   pMem++;.  .#ifd
c9b0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c9c0: 5f 45 58 50 4c 41 49 4e 5f 43 4f 4d 4d 45 4e 54  _EXPLAIN_COMMENT
c9d0: 53 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  S.      if( sqli
c9e0: 74 65 33 56 64 62 65 4d 65 6d 43 6c 65 61 72 41  te3VdbeMemClearA
c9f0: 6e 64 52 65 73 69 7a 65 28 70 4d 65 6d 2c 20 35  ndResize(pMem, 5
ca00: 30 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61  00) ){.        a
ca10: 73 73 65 72 74 28 20 70 2d 3e 64 62 2d 3e 6d 61  ssert( p->db->ma
ca20: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
ca30: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
ca40: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
ca50: 20 7d 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66   }.      pMem->f
ca60: 6c 61 67 73 20 3d 20 4d 45 4d 5f 53 74 72 7c 4d  lags = MEM_Str|M
ca70: 45 4d 5f 54 65 72 6d 3b 0a 20 20 20 20 20 20 70  EM_Term;.      p
ca80: 4d 65 6d 2d 3e 6e 20 3d 20 64 69 73 70 6c 61 79  Mem->n = display
ca90: 43 6f 6d 6d 65 6e 74 28 70 4f 70 2c 20 7a 50 34  Comment(pOp, zP4
caa0: 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 35 30 30 29 3b  , pMem->z, 500);
cab0: 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 65 6e 63  .      pMem->enc
cac0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a   = SQLITE_UTF8;.
cad0: 23 65 6c 73 65 0a 20 20 20 20 20 20 70 4d 65 6d  #else.      pMem
cae0: 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75  ->flags = MEM_Nu
caf0: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
cb00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d            /* Com
cb10: 6d 65 6e 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ment */.#endif. 
cb20: 20 20 20 7d 0a 0a 20 20 20 20 70 2d 3e 6e 52 65     }..    p->nRe
cb30: 73 43 6f 6c 75 6d 6e 20 3d 20 38 20 2d 20 34 2a  sColumn = 8 - 4*
cb40: 28 70 2d 3e 65 78 70 6c 61 69 6e 2d 31 29 3b 0a  (p->explain-1);.
cb50: 20 20 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65      p->pResultSe
cb60: 74 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b 31 5d 3b  t = &p->aMem[1];
cb70: 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
cb80: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 72 63 20 3d  ITE_OK;.    rc =
cb90: 20 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20 20 7d   SQLITE_ROW;.  }
cba0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cbb0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cbc0: 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
cbd0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
cbe0: 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  DEBUG./*.** Prin
cbf0: 74 20 74 68 65 20 53 51 4c 20 74 68 61 74 20 77  t the SQL that w
cc00: 61 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  as used to gener
cc10: 61 74 65 20 61 20 56 44 42 45 20 70 72 6f 67 72  ate a VDBE progr
cc20: 61 6d 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  am..*/.void sqli
cc30: 74 65 33 56 64 62 65 50 72 69 6e 74 53 71 6c 28  te3VdbePrintSql(
cc40: 56 64 62 65 20 2a 70 29 7b 0a 20 20 63 6f 6e 73  Vdbe *p){.  cons
cc50: 74 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20  t char *z = 0;. 
cc60: 20 69 66 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a   if( p->zSql ){.
cc70: 20 20 20 20 7a 20 3d 20 70 2d 3e 7a 53 71 6c 3b      z = p->zSql;
cc80: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e  .  }else if( p->
cc90: 6e 4f 70 3e 3d 31 20 29 7b 0a 20 20 20 20 63 6f  nOp>=1 ){.    co
cca0: 6e 73 74 20 56 64 62 65 4f 70 20 2a 70 4f 70 20  nst VdbeOp *pOp 
ccb0: 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20 20  = &p->aOp[0];.  
ccc0: 20 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64    if( pOp->opcod
ccd0: 65 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f  e==OP_Init && pO
cce0: 70 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20  p->p4.z!=0 ){.  
ccf0: 20 20 20 20 7a 20 3d 20 70 4f 70 2d 3e 70 34 2e      z = pOp->p4.
cd00: 7a 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  z;.      while( 
cd10: 73 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 2a  sqlite3Isspace(*
cd20: 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a  z) ) z++;.    }.
cd30: 20 20 7d 0a 20 20 69 66 28 20 7a 20 29 20 70 72    }.  if( z ) pr
cd40: 69 6e 74 66 28 22 53 51 4c 3a 20 5b 25 73 5d 5c  intf("SQL: [%s]\
cd50: 6e 22 2c 20 7a 29 3b 0a 7d 0a 23 65 6e 64 69 66  n", z);.}.#endif
cd60: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
cd70: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
cd80: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
cd90: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
cda0: 43 45 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  CE)./*.** Print 
cdb0: 61 6e 20 49 4f 54 52 41 43 45 20 6d 65 73 73 61  an IOTRACE messa
cdc0: 67 65 20 73 68 6f 77 69 6e 67 20 53 51 4c 20 63  ge showing SQL c
cdd0: 6f 6e 74 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  ontent..*/.void 
cde0: 73 71 6c 69 74 65 33 56 64 62 65 49 4f 54 72 61  sqlite3VdbeIOTra
cdf0: 63 65 53 71 6c 28 56 64 62 65 20 2a 70 29 7b 0a  ceSql(Vdbe *p){.
ce00: 20 20 69 6e 74 20 6e 4f 70 20 3d 20 70 2d 3e 6e    int nOp = p->n
ce10: 4f 70 3b 0a 20 20 56 64 62 65 4f 70 20 2a 70 4f  Op;.  VdbeOp *pO
ce20: 70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  p;.  if( sqlite3
ce30: 49 6f 54 72 61 63 65 3d 3d 30 20 29 20 72 65 74  IoTrace==0 ) ret
ce40: 75 72 6e 3b 0a 20 20 69 66 28 20 6e 4f 70 3c 31  urn;.  if( nOp<1
ce50: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 4f 70   ) return;.  pOp
ce60: 20 3d 20 26 70 2d 3e 61 4f 70 5b 30 5d 3b 0a 20   = &p->aOp[0];. 
ce70: 20 69 66 28 20 70 4f 70 2d 3e 6f 70 63 6f 64 65   if( pOp->opcode
ce80: 3d 3d 4f 50 5f 49 6e 69 74 20 26 26 20 70 4f 70  ==OP_Init && pOp
ce90: 2d 3e 70 34 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  ->p4.z!=0 ){.   
cea0: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 63   int i, j;.    c
ceb0: 68 61 72 20 7a 5b 31 30 30 30 5d 3b 0a 20 20 20  har z[1000];.   
cec0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
ced0: 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
cee0: 22 25 73 22 2c 20 70 4f 70 2d 3e 70 34 2e 7a 29  "%s", pOp->p4.z)
cef0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 73  ;.    for(i=0; s
cf00: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
cf10: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  i]); i++){}.    
cf20: 66 6f 72 28 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(j=0; z[i]; i
cf30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
cf40: 71 6c 69 74 65 33 49 73 73 70 61 63 65 28 7a 5b  qlite3Isspace(z[
cf50: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  i]) ){.        i
cf60: 66 28 20 7a 5b 69 2d 31 5d 21 3d 27 20 27 20 29  f( z[i-1]!=' ' )
cf70: 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  {.          z[j+
cf80: 2b 5d 20 3d 20 27 20 27 3b 0a 20 20 20 20 20 20  +] = ' ';.      
cf90: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
cfa0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
cfb0: 3d 20 7a 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  = z[i];.      }.
cfc0: 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d      }.    z[j] =
cfd0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49   0;.    sqlite3I
cfe0: 6f 54 72 61 63 65 28 22 53 51 4c 20 25 73 5c 6e  oTrace("SQL %s\n
cff0: 22 2c 20 7a 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  ", z);.  }.}.#en
d000: 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f  dif /* !SQLITE_O
d010: 4d 49 54 5f 54 52 41 43 45 20 26 26 20 53 51 4c  MIT_TRACE && SQL
d020: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
d030: 43 45 20 2a 2f 0a 0a 2f 2a 20 41 6e 20 69 6e 73  CE */../* An ins
d040: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62  tance of this ob
d050: 6a 65 63 74 20 64 65 73 63 72 69 62 65 73 20 62  ject describes b
d060: 75 6c 6b 20 6d 65 6d 6f 72 79 20 61 76 61 69 6c  ulk memory avail
d070: 61 62 6c 65 20 66 6f 72 20 75 73 65 0a 2a 2a 20  able for use.** 
d080: 62 79 20 73 75 62 63 6f 6d 70 6f 6e 65 6e 74 73  by subcomponents
d090: 20 6f 66 20 61 20 70 72 65 70 61 72 65 64 20 73   of a prepared s
d0a0: 74 61 74 65 6d 65 6e 74 2e 20 20 53 70 61 63 65  tatement.  Space
d0b0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 6f 75   is allocated ou
d0c0: 74 0a 2a 2a 20 6f 66 20 61 20 52 65 75 73 61 62  t.** of a Reusab
d0d0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 20 62  leSpace object b
d0e0: 79 20 74 68 65 20 61 6c 6c 6f 63 53 70 61 63 65  y the allocSpace
d0f0: 28 29 20 72 6f 75 74 69 6e 65 20 62 65 6c 6f 77  () routine below
d100: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 52 65 75 73  ..*/.struct Reus
d110: 61 62 6c 65 53 70 61 63 65 20 7b 0a 20 20 75 38  ableSpace {.  u8
d120: 20 2a 70 53 70 61 63 65 3b 20 20 20 20 20 20 20   *pSpace;       
d130: 20 20 20 2f 2a 20 41 76 61 69 6c 61 62 6c 65 20     /* Available 
d140: 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
d150: 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20 20 20  nFree;          
d160: 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 61 76 61   /* Bytes of ava
d170: 69 6c 61 62 6c 65 20 6d 65 6d 6f 72 79 20 2a 2f  ilable memory */
d180: 0a 20 20 69 6e 74 20 6e 4e 65 65 64 65 64 3b 20  .  int nNeeded; 
d190: 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
d1a0: 20 62 79 74 65 73 20 74 68 61 74 20 63 6f 75 6c   bytes that coul
d1b0: 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74  d not be allocat
d1c0: 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 54 72 79  ed */.};../* Try
d1d0: 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 6e 42 79   to allocate nBy
d1e0: 74 65 20 62 79 74 65 73 20 6f 66 20 38 2d 62 79  te bytes of 8-by
d1f0: 74 65 20 61 6c 69 67 6e 65 64 20 62 75 6c 6b 20  te aligned bulk 
d200: 6d 65 6d 6f 72 79 20 66 6f 72 20 70 42 75 66 0a  memory for pBuf.
d210: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 52 65 75 73  ** from the Reus
d220: 61 62 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74  ableSpace object
d230: 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  .  Return a poin
d240: 74 65 72 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63  ter to the alloc
d250: 61 74 65 64 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6f  ated.** memory o
d260: 6e 20 73 75 63 63 65 73 73 2e 20 20 49 66 20 69  n success.  If i
d270: 6e 73 75 66 66 69 63 69 65 6e 74 20 6d 65 6d 6f  nsufficient memo
d280: 72 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20  ry is available 
d290: 69 6e 20 74 68 65 0a 2a 2a 20 52 65 75 73 61 62  in the.** Reusab
d2a0: 6c 65 53 70 61 63 65 20 6f 62 6a 65 63 74 2c 20  leSpace object, 
d2b0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 52 65 75  increase the Reu
d2c0: 73 61 62 6c 65 53 70 61 63 65 2e 6e 4e 65 65 64  sableSpace.nNeed
d2d0: 65 64 0a 2a 2a 20 76 61 6c 75 65 20 62 79 20 74  ed.** value by t
d2e0: 68 65 20 61 6d 6f 75 6e 74 20 6e 65 65 64 65 64  he amount needed
d2f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
d300: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 42 75 66 20  ..**.** If pBuf 
d310: 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c 6c 79  is not initially
d320: 20 4e 55 4c 4c 2c 20 74 68 61 74 20 6d 65 61 6e   NULL, that mean
d330: 73 20 74 68 61 74 20 74 68 65 20 6d 65 6d 6f 72  s that the memor
d340: 79 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a  y has already.**
d350: 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
d360: 62 79 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  by a prior call 
d370: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  to this routine,
d380: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
d390: 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 70 42 75  a copy.** of pBu
d3a0: 66 20 61 6e 64 20 6c 65 61 76 65 20 52 65 75 73  f and leave Reus
d3b0: 61 62 6c 65 53 70 61 63 65 20 75 6e 63 68 61 6e  ableSpace unchan
d3c0: 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ged..**.** This 
d3d0: 61 6c 6c 6f 63 61 74 6f 72 20 69 73 20 65 6d 70  allocator is emp
d3e0: 6c 6f 79 65 64 20 74 6f 20 72 65 70 75 72 70 6f  loyed to repurpo
d3f0: 73 65 20 75 6e 75 73 65 64 20 73 6c 6f 74 73 20  se unused slots 
d400: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  at the end of th
d410: 65 0a 2a 2a 20 6f 70 63 6f 64 65 20 61 72 72 61  e.** opcode arra
d420: 79 20 6f 66 20 70 72 65 70 61 72 65 64 20 73 74  y of prepared st
d430: 61 74 65 20 66 6f 72 20 6f 74 68 65 72 20 6d 65  ate for other me
d440: 6d 6f 72 79 20 6e 65 65 64 73 20 6f 66 20 74 68  mory needs of th
d450: 65 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  e prepared.** st
d460: 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
d470: 69 63 20 76 6f 69 64 20 2a 61 6c 6c 6f 63 53 70  ic void *allocSp
d480: 61 63 65 28 0a 20 20 73 74 72 75 63 74 20 52 65  ace(.  struct Re
d490: 75 73 61 62 6c 65 53 70 61 63 65 20 2a 70 2c 20  usableSpace *p, 
d4a0: 20 2f 2a 20 42 75 6c 6b 20 6d 65 6d 6f 72 79 20   /* Bulk memory 
d4b0: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 61 6c  available for al
d4c0: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f  location */.  vo
d4d0: 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
d4e0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
d4f0: 65 72 20 74 6f 20 61 20 70 72 69 6f 72 20 61 6c  er to a prior al
d500: 6c 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  location */.  in
d510: 74 20 6e 42 79 74 65 20 20 20 20 20 20 20 20 20  t nByte         
d520: 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
d530: 20 6f 66 20 6d 65 6d 6f 72 79 20 6e 65 65 64 65   of memory neede
d540: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
d550: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
d560: 47 4e 4d 45 4e 54 28 70 2d 3e 70 53 70 61 63 65  GNMENT(p->pSpace
d570: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  ) );.  if( pBuf=
d580: 3d 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65 20  =0 ){.    nByte 
d590: 3d 20 52 4f 55 4e 44 38 28 6e 42 79 74 65 29 3b  = ROUND8(nByte);
d5a0: 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65 20 3c  .    if( nByte <
d5b0: 3d 20 70 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  = p->nFree ){.  
d5c0: 20 20 20 20 70 2d 3e 6e 46 72 65 65 20 2d 3d 20      p->nFree -= 
d5d0: 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 70 42 75  nByte;.      pBu
d5e0: 66 20 3d 20 26 70 2d 3e 70 53 70 61 63 65 5b 70  f = &p->pSpace[p
d5f0: 2d 3e 6e 46 72 65 65 5d 3b 0a 20 20 20 20 7d 65  ->nFree];.    }e
d600: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e 4e  lse{.      p->nN
d610: 65 65 64 65 64 20 2b 3d 20 6e 42 79 74 65 3b 0a  eeded += nByte;.
d620: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
d630: 72 74 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41  rt( EIGHT_BYTE_A
d640: 4c 49 47 4e 4d 45 4e 54 28 70 42 75 66 29 20 29  LIGNMENT(pBuf) )
d650: 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 75 66 3b  ;.  return pBuf;
d660: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 77 69 6e 64  .}../*.** Rewind
d670: 20 74 68 65 20 56 44 42 45 20 62 61 63 6b 20 74   the VDBE back t
d680: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
d690: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
d6a0: 6f 72 0a 2a 2a 20 72 75 6e 6e 69 6e 67 20 69 74  or.** running it
d6b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
d6c0: 33 56 64 62 65 52 65 77 69 6e 64 28 56 64 62 65  3VdbeRewind(Vdbe
d6d0: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65   *p){.#if define
d6e0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
d6f0: 7c 7c 20 64 65 66 69 6e 65 64 28 56 44 42 45 5f  || defined(VDBE_
d700: 50 52 4f 46 49 4c 45 29 0a 20 20 69 6e 74 20 69  PROFILE).  int i
d710: 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72  ;.#endif.  asser
d720: 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73  t( p!=0 );.  ass
d730: 65 72 74 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56  ert( p->magic==V
d740: 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 20 29  DBE_MAGIC_INIT )
d750: 3b 0a 0a 20 20 2f 2a 20 54 68 65 72 65 20 73 68  ;..  /* There sh
d760: 6f 75 6c 64 20 62 65 20 61 74 20 6c 65 61 73 74  ould be at least
d770: 20 6f 6e 65 20 6f 70 63 6f 64 65 2e 0a 20 20 2a   one opcode..  *
d780: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6e  /.  assert( p->n
d790: 4f 70 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 65  Op>0 );..  /* Se
d7a0: 74 20 74 68 65 20 6d 61 67 69 63 20 74 6f 20 56  t the magic to V
d7b0: 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 73 6f  DBE_MAGIC_RUN so
d7c0: 6f 6e 65 72 20 72 61 74 68 65 72 20 74 68 61 6e  oner rather than
d7d0: 20 6c 61 74 65 72 2e 20 2a 2f 0a 20 20 70 2d 3e   later. */.  p->
d7e0: 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47  magic = VDBE_MAG
d7f0: 49 43 5f 52 55 4e 3b 0a 0a 23 69 66 64 65 66 20  IC_RUN;..#ifdef 
d800: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 66  SQLITE_DEBUG.  f
d810: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65  or(i=0; i<p->nMe
d820: 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73  m; i++){.    ass
d830: 65 72 74 28 20 70 2d 3e 61 4d 65 6d 5b 69 5d 2e  ert( p->aMem[i].
d840: 64 62 3d 3d 70 2d 3e 64 62 20 29 3b 0a 20 20 7d  db==p->db );.  }
d850: 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e 70 63 20  .#endif.  p->pc 
d860: 3d 20 2d 31 3b 0a 20 20 70 2d 3e 72 63 20 3d 20  = -1;.  p->rc = 
d870: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 2d 3e  SQLITE_OK;.  p->
d880: 65 72 72 6f 72 41 63 74 69 6f 6e 20 3d 20 4f 45  errorAction = OE
d890: 5f 41 62 6f 72 74 3b 0a 20 20 70 2d 3e 6e 43 68  _Abort;.  p->nCh
d8a0: 61 6e 67 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 63  ange = 0;.  p->c
d8b0: 61 63 68 65 43 74 72 20 3d 20 31 3b 0a 20 20 70  acheCtr = 1;.  p
d8c0: 2d 3e 6d 69 6e 57 72 69 74 65 46 69 6c 65 46 6f  ->minWriteFileFo
d8d0: 72 6d 61 74 20 3d 20 32 35 35 3b 0a 20 20 70 2d  rmat = 255;.  p-
d8e0: 3e 69 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >iStatement = 0;
d8f0: 0a 20 20 70 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61  .  p->nFkConstra
d900: 69 6e 74 20 3d 20 30 3b 0a 23 69 66 64 65 66 20  int = 0;.#ifdef 
d910: 56 44 42 45 5f 50 52 4f 46 49 4c 45 0a 20 20 66  VDBE_PROFILE.  f
d920: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70  or(i=0; i<p->nOp
d930: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 2d 3e 61  ; i++){.    p->a
d940: 4f 70 5b 69 5d 2e 63 6e 74 20 3d 20 30 3b 0a 20  Op[i].cnt = 0;. 
d950: 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63     p->aOp[i].cyc
d960: 6c 65 73 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  les = 0;.  }.#en
d970: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 65  dif.}../*.** Pre
d980: 70 61 72 65 20 61 20 76 69 72 74 75 61 6c 20 6d  pare a virtual m
d990: 61 63 68 69 6e 65 20 66 6f 72 20 65 78 65 63 75  achine for execu
d9a0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 66 69 72  tion for the fir
d9b0: 73 74 20 74 69 6d 65 20 61 66 74 65 72 0a 2a 2a  st time after.**
d9c0: 20 63 72 65 61 74 69 6e 67 20 74 68 65 20 76 69   creating the vi
d9d0: 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 20  rtual machine.  
d9e0: 54 68 69 73 20 69 6e 76 6f 6c 76 65 73 20 74 68  This involves th
d9f0: 69 6e 67 73 20 73 75 63 68 0a 2a 2a 20 61 73 20  ings such.** as 
da00: 61 6c 6c 6f 63 61 74 69 6e 67 20 72 65 67 69 73  allocating regis
da10: 74 65 72 73 20 61 6e 64 20 69 6e 69 74 69 61 6c  ters and initial
da20: 69 7a 69 6e 67 20 74 68 65 20 70 72 6f 67 72 61  izing the progra
da30: 6d 20 63 6f 75 6e 74 65 72 2e 0a 2a 2a 20 41 66  m counter..** Af
da40: 74 65 72 20 74 68 65 20 56 44 42 45 20 68 61 73  ter the VDBE has
da50: 20 62 65 20 70 72 65 70 70 65 64 2c 20 69 74 20   be prepped, it 
da60: 63 61 6e 20 62 65 20 65 78 65 63 75 74 65 64 20  can be executed 
da70: 62 79 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 2a  by one or more.*
da80: 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  * calls to sqlit
da90: 65 33 56 64 62 65 45 78 65 63 28 29 2e 20 20 0a  e3VdbeExec().  .
daa0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
dab0: 69 6f 6e 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  ion may be calle
dac0: 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 6f  d exactly once o
dad0: 6e 20 65 61 63 68 20 76 69 72 74 75 61 6c 20 6d  n each virtual m
dae0: 61 63 68 69 6e 65 2e 0a 2a 2a 20 41 66 74 65 72  achine..** After
daf0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
db00: 20 63 61 6c 6c 65 64 20 74 68 65 20 56 4d 20 68   called the VM h
db10: 61 73 20 62 65 65 6e 20 22 70 61 63 6b 61 67 65  as been "package
db20: 64 22 20 61 6e 64 20 69 73 20 72 65 61 64 79 0a  d" and is ready.
db30: 2a 2a 20 74 6f 20 72 75 6e 2e 20 20 41 66 74 65  ** to run.  Afte
db40: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  r this routine i
db50: 73 20 63 61 6c 6c 65 64 2c 20 66 75 72 74 68 65  s called, furthe
db60: 72 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 73  r calls to .** s
db70: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
db80: 29 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20  ) functions are 
db90: 70 72 6f 68 69 62 69 74 65 64 2e 20 20 54 68 69  prohibited.  Thi
dba0: 73 20 72 6f 75 74 69 6e 65 20 64 69 73 63 6f 6e  s routine discon
dbb0: 6e 65 63 74 73 0a 2a 2a 20 74 68 65 20 56 64 62  nects.** the Vdb
dbc0: 65 20 66 72 6f 6d 20 74 68 65 20 50 61 72 73 65  e from the Parse
dbd0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 68 65 6c   object that hel
dbe0: 70 65 64 20 67 65 6e 65 72 61 74 65 20 69 74 20  ped generate it 
dbf0: 73 6f 20 74 68 61 74 20 74 68 65 0a 2a 2a 20 74  so that the.** t
dc00: 68 65 20 56 64 62 65 20 62 65 63 6f 6d 65 73 20  he Vdbe becomes 
dc10: 61 6e 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 65  an independent e
dc20: 6e 74 69 74 79 20 61 6e 64 20 74 68 65 20 50 61  ntity and the Pa
dc30: 72 73 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 62  rse object can b
dc40: 65 0a 2a 2a 20 64 65 73 74 72 6f 79 65 64 2e 0a  e.** destroyed..
dc50: 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 73 71  **.** Use the sq
dc60: 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e 64 28  lite3VdbeRewind(
dc70: 29 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 72  ) procedure to r
dc80: 65 73 74 6f 72 65 20 61 20 76 69 72 74 75 61 6c  estore a virtual
dc90: 20 6d 61 63 68 69 6e 65 20 62 61 63 6b 0a 2a 2a   machine back.**
dca0: 20 74 6f 20 69 74 73 20 69 6e 69 74 69 61 6c 20   to its initial 
dcb0: 73 74 61 74 65 20 61 66 74 65 72 20 69 74 20 68  state after it h
dcc0: 61 73 20 62 65 65 6e 20 72 75 6e 2e 0a 2a 2f 0a  as been run..*/.
dcd0: 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
dce0: 4d 61 6b 65 52 65 61 64 79 28 0a 20 20 56 64 62  MakeReady(.  Vdb
dcf0: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
dd00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
dd10: 68 65 20 56 44 42 45 20 2a 2f 0a 20 20 50 61 72  he VDBE */.  Par
dd20: 73 65 20 2a 70 50 61 72 73 65 20 20 20 20 20 20  se *pParse      
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
dd40: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
dd50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
dd60: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  db;             
dd70: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
dd80: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
dd90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 56 61 72 3b 20   */.  int nVar; 
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ddc0: 66 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  f parameters */.
ddd0: 20 20 69 6e 74 20 6e 4d 65 6d 3b 20 20 20 20 20    int nMem;     
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 56 4d   /* Number of VM
de00: 20 6d 65 6d 6f 72 79 20 72 65 67 69 73 74 65 72   memory register
de10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 73  s */.  int nCurs
de20: 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  or;             
de30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
de40: 6f 66 20 63 75 72 73 6f 72 73 20 72 65 71 75 69  of cursors requi
de50: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72  red */.  int nAr
de60: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
de70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
de80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 69  r of arguments i
de90: 6e 20 73 75 62 70 72 6f 67 72 61 6d 73 20 2a 2f  n subprograms */
dea0: 0a 20 20 69 6e 74 20 6e 4f 6e 63 65 3b 20 20 20  .  int nOnce;   
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4f    /* Number of O
ded0: 50 5f 4f 6e 63 65 20 69 6e 73 74 72 75 63 74 69  P_Once instructi
dee0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ons */.  int n; 
def0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df00: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
df10: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 73 74 72  counter */.  str
df20: 75 63 74 20 52 65 75 73 61 62 6c 65 53 70 61 63  uct ReusableSpac
df30: 65 20 78 3b 20 20 20 20 20 20 20 20 2f 2a 20 52  e x;        /* R
df40: 65 75 73 61 62 6c 65 20 62 75 6c 6b 20 6d 65 6d  eusable bulk mem
df50: 6f 72 79 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ory */..  assert
df60: 28 20 70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ( p!=0 );.  asse
df70: 72 74 28 20 70 2d 3e 6e 4f 70 3e 30 20 29 3b 0a  rt( p->nOp>0 );.
df80: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
df90: 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
dfa0: 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f   p->magic==VDBE_
dfb0: 4d 41 47 49 43 5f 49 4e 49 54 20 29 3b 0a 20 20  MAGIC_INIT );.  
dfc0: 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d  assert( pParse==
dfd0: 70 2d 3e 70 50 61 72 73 65 20 29 3b 0a 20 20 64  p->pParse );.  d
dfe0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
dff0: 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
e000: 61 69 6c 65 64 3d 3d 30 20 29 3b 0a 20 20 6e 56  ailed==0 );.  nV
e010: 61 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  ar = pParse->nVa
e020: 72 3b 0a 20 20 6e 4d 65 6d 20 3d 20 70 50 61 72  r;.  nMem = pPar
e030: 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 6e 43 75 72  se->nMem;.  nCur
e040: 73 6f 72 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54  sor = pParse->nT
e050: 61 62 3b 0a 20 20 6e 41 72 67 20 3d 20 70 50 61  ab;.  nArg = pPa
e060: 72 73 65 2d 3e 6e 4d 61 78 41 72 67 3b 0a 20 20  rse->nMaxArg;.  
e070: 6e 4f 6e 63 65 20 3d 20 70 50 61 72 73 65 2d 3e  nOnce = pParse->
e080: 6e 4f 6e 63 65 3b 0a 20 20 69 66 28 20 6e 4f 6e  nOnce;.  if( nOn
e090: 63 65 3d 3d 30 20 29 20 6e 4f 6e 63 65 20 3d 20  ce==0 ) nOnce = 
e0a0: 31 3b 20 2f 2a 20 45 6e 73 75 72 65 20 61 74 20  1; /* Ensure at 
e0b0: 6c 65 61 73 74 20 6f 6e 65 20 62 79 74 65 20 69  least one byte i
e0c0: 6e 20 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 5b 5d  n p->aOnceFlag[]
e0d0: 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 45 61 63 68   */.  .  /* Each
e0e0: 20 63 75 72 73 6f 72 20 75 73 65 73 20 61 20 6d   cursor uses a m
e0f0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 20 20 54 68 65  emory cell.  The
e100: 20 66 69 72 73 74 20 63 75 72 73 6f 72 20 28 63   first cursor (c
e110: 75 72 73 6f 72 20 30 29 20 63 61 6e 0a 20 20 2a  ursor 0) can.  *
e120: 2a 20 75 73 65 20 61 4d 65 6d 5b 30 5d 20 77 68  * use aMem[0] wh
e130: 69 63 68 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  ich is not other
e140: 77 69 73 65 20 75 73 65 64 20 62 79 20 74 68 65  wise used by the
e150: 20 56 44 42 45 20 70 72 6f 67 72 61 6d 2e 20 20   VDBE program.  
e160: 41 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 73 70  Allocate.  ** sp
e170: 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
e180: 66 20 61 4d 65 6d 5b 5d 20 66 6f 72 20 63 75 72  f aMem[] for cur
e190: 73 6f 72 73 20 31 20 61 6e 64 20 67 72 65 61 74  sors 1 and great
e1a0: 65 72 2e 0a 20 20 2a 2a 20 53 65 65 20 61 6c 73  er..  ** See als
e1b0: 6f 3a 20 61 6c 6c 6f 63 61 74 65 43 75 72 73 6f  o: allocateCurso
e1c0: 72 28 29 2e 0a 20 20 2a 2f 0a 20 20 6e 4d 65 6d  r()..  */.  nMem
e1d0: 20 2b 3d 20 6e 43 75 72 73 6f 72 3b 0a 20 20 69   += nCursor;.  i
e1e0: 66 28 20 6e 43 75 72 73 6f 72 3d 3d 30 20 26 26  f( nCursor==0 &&
e1f0: 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d 65 6d 2b 2b   nMem>0 ) nMem++
e200: 3b 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20  ;  /* Space for 
e210: 61 4d 65 6d 5b 30 5d 20 65 76 65 6e 20 69 66 20  aMem[0] even if 
e220: 6e 6f 74 20 75 73 65 64 20 2a 2f 0a 0a 20 20 2f  not used */..  /
e230: 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
e240: 20 6d 75 63 68 20 72 65 75 73 61 62 6c 65 20 6d   much reusable m
e250: 65 6d 6f 72 79 20 69 73 20 61 76 61 69 6c 61 62  emory is availab
e260: 6c 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  le at the end of
e270: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 63 6f 64 65   the.  ** opcode
e280: 20 61 72 72 61 79 2e 20 20 54 68 69 73 20 65 78   array.  This ex
e290: 74 72 61 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  tra memory will 
e2a0: 62 65 20 72 65 61 6c 6c 6f 63 61 74 65 64 20 66  be reallocated f
e2b0: 6f 72 20 6f 74 68 65 72 20 65 6c 65 6d 65 6e 74  or other element
e2c0: 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 72  s.  ** of the pr
e2d0: 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
e2e0: 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d 20 52 4f 55  ..  */.  n = ROU
e2f0: 4e 44 38 28 73 69 7a 65 6f 66 28 4f 70 29 2a 70  ND8(sizeof(Op)*p
e300: 2d 3e 6e 4f 70 29 3b 20 20 20 20 20 20 20 20 20  ->nOp);         
e310: 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
e320: 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 75   opcode memory u
e330: 73 65 64 20 2a 2f 0a 20 20 78 2e 70 53 70 61 63  sed */.  x.pSpac
e340: 65 20 3d 20 26 28 28 75 38 2a 29 70 2d 3e 61 4f  e = &((u8*)p->aO
e350: 70 29 5b 6e 5d 3b 20 20 20 20 20 20 20 20 20 20  p)[n];          
e360: 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20 6f       /* Unused o
e370: 70 63 6f 64 65 20 6d 65 6d 6f 72 79 20 2a 2f 0a  pcode memory */.
e380: 20 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f    assert( EIGHT_
e390: 42 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 78  BYTE_ALIGNMENT(x
e3a0: 2e 70 53 70 61 63 65 29 20 29 3b 0a 20 20 78 2e  .pSpace) );.  x.
e3b0: 6e 46 72 65 65 20 3d 20 52 4f 55 4e 44 44 4f 57  nFree = ROUNDDOW
e3c0: 4e 38 28 70 50 61 72 73 65 2d 3e 73 7a 4f 70 41  N8(pParse->szOpA
e3d0: 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20 2f 2a 20 42  lloc - n);  /* B
e3e0: 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 6d  ytes of unused m
e3f0: 65 6d 6f 72 79 20 2a 2f 0a 20 20 61 73 73 65 72  emory */.  asser
e400: 74 28 20 78 2e 6e 46 72 65 65 3e 3d 30 20 29 3b  t( x.nFree>=0 );
e410: 0a 20 20 69 66 28 20 78 2e 6e 46 72 65 65 3e 30  .  if( x.nFree>0
e420: 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 78   ){.    memset(x
e430: 2e 70 53 70 61 63 65 2c 20 30 2c 20 78 2e 6e 46  .pSpace, 0, x.nF
e440: 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ree);.    assert
e450: 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
e460: 47 4e 4d 45 4e 54 28 26 78 2e 70 53 70 61 63 65  GNMENT(&x.pSpace
e470: 5b 78 2e 6e 46 72 65 65 5d 29 20 29 3b 0a 20 20  [x.nFree]) );.  
e480: 7d 0a 0a 20 20 72 65 73 6f 6c 76 65 50 32 56 61  }..  resolveP2Va
e490: 6c 75 65 73 28 70 2c 20 26 6e 41 72 67 29 3b 0a  lues(p, &nArg);.
e4a0: 20 20 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75    p->usesStmtJou
e4b0: 72 6e 61 6c 20 3d 20 28 75 38 29 28 70 50 61 72  rnal = (u8)(pPar
e4c0: 73 65 2d 3e 69 73 4d 75 6c 74 69 57 72 69 74 65  se->isMultiWrite
e4d0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6d 61 79 41   && pParse->mayA
e4e0: 62 6f 72 74 29 3b 0a 20 20 69 66 28 20 70 50 61  bort);.  if( pPa
e4f0: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 20 26 26 20  rse->explain && 
e500: 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20 20 20 20 6e  nMem<10 ){.    n
e510: 4d 65 6d 20 3d 20 31 30 3b 0a 20 20 7d 0a 20 20  Mem = 10;.  }.  
e520: 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 30 3b 0a  p->expired = 0;.
e530: 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 66 6f 72  .  /* Memory for
e540: 20 72 65 67 69 73 74 65 72 73 2c 20 70 61 72 61   registers, para
e550: 6d 65 74 65 72 73 2c 20 63 75 72 73 6f 72 2c 20  meters, cursor, 
e560: 65 74 63 2c 20 69 73 20 61 6c 6c 6f 63 61 74 65  etc, is allocate
e570: 64 20 69 6e 20 6f 6e 65 20 6f 72 20 74 77 6f 0a  d in one or two.
e580: 20 20 2a 2a 20 70 61 73 73 65 73 2e 20 20 4f 6e    ** passes.  On
e590: 20 74 68 65 20 66 69 72 73 74 20 70 61 73 73 2c   the first pass,
e5a0: 20 77 65 20 74 72 79 20 74 6f 20 72 65 75 73 65   we try to reuse
e5b0: 20 75 6e 75 73 65 64 20 6d 65 6d 6f 72 79 20 61   unused memory a
e5c0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 65 6e 64 20  t the .  ** end 
e5d0: 6f 66 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72  of the opcode ar
e5e0: 72 61 79 2e 20 20 49 66 20 77 65 20 61 72 65 20  ray.  If we are 
e5f0: 75 6e 61 62 6c 65 20 74 6f 20 73 61 74 69 73 66  unable to satisf
e600: 79 20 61 6c 6c 20 6d 65 6d 6f 72 79 0a 20 20 2a  y all memory.  *
e610: 2a 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 62  * requirements b
e620: 79 20 72 65 75 73 69 6e 67 20 74 68 65 20 6f 70  y reusing the op
e630: 63 6f 64 65 20 61 72 72 61 79 20 74 61 69 6c 2c  code array tail,
e640: 20 74 68 65 6e 20 74 68 65 20 73 65 63 6f 6e 64   then the second
e650: 0a 20 20 2a 2a 20 70 61 73 73 20 77 69 6c 6c 20  .  ** pass will 
e660: 66 69 6c 6c 20 69 6e 20 74 68 65 20 72 65 6d 61  fill in the rema
e670: 69 6e 64 65 72 20 75 73 69 6e 67 20 61 20 66 72  inder using a fr
e680: 65 73 68 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  esh memory alloc
e690: 61 74 69 6f 6e 2e 20 20 0a 20 20 2a 2a 0a 20 20  ation.  .  **.  
e6a0: 2a 2a 20 54 68 69 73 20 74 77 6f 2d 70 61 73 73  ** This two-pass
e6b0: 20 61 70 70 72 6f 61 63 68 20 74 68 61 74 20 72   approach that r
e6c0: 65 75 73 65 73 20 61 73 20 6d 75 63 68 20 6d 65  euses as much me
e6d0: 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c 65  mory as possible
e6e0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 6c   from.  ** the l
e6f0: 65 66 74 6f 76 65 72 20 6d 65 6d 6f 72 79 20 61  eftover memory a
e700: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
e710: 20 6f 70 63 6f 64 65 20 61 72 72 61 79 2e 20 20   opcode array.  
e720: 54 68 69 73 20 63 61 6e 20 73 69 67 6e 69 66 69  This can signifi
e730: 63 61 6e 74 6c 79 0a 20 20 2a 2a 20 72 65 64 75  cantly.  ** redu
e740: 63 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66  ce the amount of
e750: 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20 62 79 20   memory held by 
e760: 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
e770: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 64 6f 20  ment..  */.  do 
e780: 7b 0a 20 20 20 20 78 2e 6e 4e 65 65 64 65 64 20  {.    x.nNeeded 
e790: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 4d 65 6d  = 0;.    p->aMem
e7a0: 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78   = allocSpace(&x
e7b0: 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e 4d 65 6d 2a  , p->aMem, nMem*
e7c0: 73 69 7a 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20  sizeof(Mem));.  
e7d0: 20 20 70 2d 3e 61 56 61 72 20 3d 20 61 6c 6c 6f    p->aVar = allo
e7e0: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 56  cSpace(&x, p->aV
e7f0: 61 72 2c 20 6e 56 61 72 2a 73 69 7a 65 6f 66 28  ar, nVar*sizeof(
e800: 4d 65 6d 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70  Mem));.    p->ap
e810: 41 72 67 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Arg = allocSpace
e820: 28 26 78 2c 20 70 2d 3e 61 70 41 72 67 2c 20 6e  (&x, p->apArg, n
e830: 41 72 67 2a 73 69 7a 65 6f 66 28 4d 65 6d 2a 29  Arg*sizeof(Mem*)
e840: 29 3b 0a 20 20 20 20 70 2d 3e 61 70 43 73 72 20  );.    p->apCsr 
e850: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
e860: 20 70 2d 3e 61 70 43 73 72 2c 20 6e 43 75 72 73   p->apCsr, nCurs
e870: 6f 72 2a 73 69 7a 65 6f 66 28 56 64 62 65 43 75  or*sizeof(VdbeCu
e880: 72 73 6f 72 2a 29 29 3b 0a 20 20 20 20 70 2d 3e  rsor*));.    p->
e890: 61 4f 6e 63 65 46 6c 61 67 20 3d 20 61 6c 6c 6f  aOnceFlag = allo
e8a0: 63 53 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 4f  cSpace(&x, p->aO
e8b0: 6e 63 65 46 6c 61 67 2c 20 6e 4f 6e 63 65 29 3b  nceFlag, nOnce);
e8c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e8d0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
e8e0: 54 41 54 55 53 0a 20 20 20 20 70 2d 3e 61 6e 45  TATUS.    p->anE
e8f0: 78 65 63 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  xec = allocSpace
e900: 28 26 78 2c 20 70 2d 3e 61 6e 45 78 65 63 2c 20  (&x, p->anExec, 
e910: 70 2d 3e 6e 4f 70 2a 73 69 7a 65 6f 66 28 69 36  p->nOp*sizeof(i6
e920: 34 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  4));.#endif.    
e930: 69 66 28 20 78 2e 6e 4e 65 65 64 65 64 3d 3d 30  if( x.nNeeded==0
e940: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 78 2e   ) break;.    x.
e950: 70 53 70 61 63 65 20 3d 20 70 2d 3e 70 46 72 65  pSpace = p->pFre
e960: 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  e = sqlite3DbMal
e970: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 78 2e 6e 4e  locZero(db, x.nN
e980: 65 65 64 65 64 29 3b 0a 20 20 20 20 78 2e 6e 46  eeded);.    x.nF
e990: 72 65 65 20 3d 20 78 2e 6e 4e 65 65 64 65 64 3b  ree = x.nNeeded;
e9a0: 0a 20 20 7d 77 68 69 6c 65 28 20 21 64 62 2d 3e  .  }while( !db->
e9b0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
e9c0: 0a 20 20 70 2d 3e 6e 43 75 72 73 6f 72 20 3d 20  .  p->nCursor = 
e9d0: 6e 43 75 72 73 6f 72 3b 0a 20 20 70 2d 3e 6e 4f  nCursor;.  p->nO
e9e0: 6e 63 65 46 6c 61 67 20 3d 20 6e 4f 6e 63 65 3b  nceFlag = nOnce;
e9f0: 0a 20 20 69 66 28 20 70 2d 3e 61 56 61 72 20 29  .  if( p->aVar )
ea00: 7b 0a 20 20 20 20 70 2d 3e 6e 56 61 72 20 3d 20  {.    p->nVar = 
ea10: 28 79 6e 56 61 72 29 6e 56 61 72 3b 0a 20 20 20  (ynVar)nVar;.   
ea20: 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 56 61 72   for(n=0; n<nVar
ea30: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d  ; n++){.      p-
ea40: 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61 67 73 20 3d  >aVar[n].flags =
ea50: 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
ea60: 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 64 62 20 3d   p->aVar[n].db =
ea70: 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   db;.    }.  }. 
ea80: 20 70 2d 3e 6e 7a 56 61 72 20 3d 20 70 50 61 72   p->nzVar = pPar
ea90: 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20 20 70 2d 3e  se->nzVar;.  p->
eaa0: 61 7a 56 61 72 20 3d 20 70 50 61 72 73 65 2d 3e  azVar = pParse->
eab0: 61 7a 56 61 72 3b 0a 20 20 70 50 61 72 73 65 2d  azVar;.  pParse-
eac0: 3e 6e 7a 56 61 72 20 3d 20 20 30 3b 0a 20 20 70  >nzVar =  0;.  p
ead0: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 30  Parse->azVar = 0
eae0: 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20  ;.  if( p->aMem 
eaf0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d 65 6d 20 3d  ){.    p->nMem =
eb00: 20 6e 4d 65 6d 3b 0a 20 20 20 20 66 6f 72 28 6e   nMem;.    for(n
eb10: 3d 30 3b 20 6e 3c 6e 4d 65 6d 3b 20 6e 2b 2b 29  =0; n<nMem; n++)
eb20: 7b 0a 20 20 20 20 20 20 70 2d 3e 61 4d 65 6d 5b  {.      p->aMem[
eb30: 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 55  n].flags = MEM_U
eb40: 6e 64 65 66 69 6e 65 64 3b 0a 20 20 20 20 20 20  ndefined;.      
eb50: 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64 62 20 3d 20  p->aMem[n].db = 
eb60: 64 62 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  db;.    }.  }.  
eb70: 70 2d 3e 65 78 70 6c 61 69 6e 20 3d 20 70 50 61  p->explain = pPa
eb80: 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3b 0a 20 20  rse->explain;.  
eb90: 73 71 6c 69 74 65 33 56 64 62 65 52 65 77 69 6e  sqlite3VdbeRewin
eba0: 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  d(p);.}../*.** C
ebb0: 6c 6f 73 65 20 61 20 56 44 42 45 20 63 75 72 73  lose a VDBE curs
ebc0: 6f 72 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  or and release a
ebd0: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
ebe0: 20 74 68 61 74 20 63 75 72 73 6f 72 20 0a 2a 2a   that cursor .**
ebf0: 20 68 61 70 70 65 6e 73 20 74 6f 20 68 6f 6c 64   happens to hold
ec00: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ec10: 33 56 64 62 65 46 72 65 65 43 75 72 73 6f 72 28  3VdbeFreeCursor(
ec20: 56 64 62 65 20 2a 70 2c 20 56 64 62 65 43 75 72  Vdbe *p, VdbeCur
ec30: 73 6f 72 20 2a 70 43 78 29 7b 0a 20 20 69 66 28  sor *pCx){.  if(
ec40: 20 70 43 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72   pCx==0 ){.    r
ec50: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73  eturn;.  }.  ass
ec60: 65 72 74 28 20 70 43 78 2d 3e 70 42 74 3d 3d 30  ert( pCx->pBt==0
ec70: 20 7c 7c 20 70 43 78 2d 3e 65 43 75 72 54 79 70   || pCx->eCurTyp
ec80: 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45  e==CURTYPE_BTREE
ec90: 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 70 43   );.  switch( pC
eca0: 78 2d 3e 65 43 75 72 54 79 70 65 20 29 7b 0a 20  x->eCurType ){. 
ecb0: 20 20 20 63 61 73 65 20 43 55 52 54 59 50 45 5f     case CURTYPE_
ecc0: 53 4f 52 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  SORTER: {.      
ecd0: 73 71 6c 69 74 65 33 56 64 62 65 53 6f 72 74 65  sqlite3VdbeSorte
ece0: 72 43 6c 6f 73 65 28 70 2d 3e 64 62 2c 20 70 43  rClose(p->db, pC
ecf0: 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
ed00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ed10: 43 55 52 54 59 50 45 5f 42 54 52 45 45 3a 20 7b  CURTYPE_BTREE: {
ed20: 0a 20 20 20 20 20 20 69 66 28 20 70 43 78 2d 3e  .      if( pCx->
ed30: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pBt ){.        s
ed40: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ed50: 28 70 43 78 2d 3e 70 42 74 29 3b 0a 20 20 20 20  (pCx->pBt);.    
ed60: 20 20 20 20 2f 2a 20 54 68 65 20 70 43 78 2d 3e      /* The pCx->
ed70: 70 43 75 72 73 6f 72 20 77 69 6c 6c 20 62 65 20  pCursor will be 
ed80: 63 6c 6f 73 65 20 61 75 74 6f 6d 61 74 69 63 61  close automatica
ed90: 6c 6c 79 2c 20 69 66 20 69 74 20 65 78 69 73 74  lly, if it exist
eda0: 73 2c 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a  s, by.        **
edb0: 20 74 68 65 20 63 61 6c 6c 20 61 62 6f 76 65 2e   the call above.
edc0: 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   */.      }else{
edd0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
ede0: 20 70 43 78 2d 3e 75 63 2e 70 43 75 72 73 6f 72   pCx->uc.pCursor
edf0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 73  !=0 );.        s
ee00: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
ee10: 43 75 72 73 6f 72 28 70 43 78 2d 3e 75 63 2e 70  Cursor(pCx->uc.p
ee20: 43 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 7d  Cursor);.      }
ee30: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ee40: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ee50: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
ee60: 41 42 4c 45 0a 20 20 20 20 63 61 73 65 20 43 55  ABLE.    case CU
ee70: 52 54 59 50 45 5f 56 54 41 42 3a 20 7b 0a 20 20  RTYPE_VTAB: {.  
ee80: 20 20 20 20 73 71 6c 69 74 65 33 5f 76 74 61 62      sqlite3_vtab
ee90: 5f 63 75 72 73 6f 72 20 2a 70 56 43 75 72 20 3d  _cursor *pVCur =
eea0: 20 70 43 78 2d 3e 75 63 2e 70 56 43 75 72 3b 0a   pCx->uc.pVCur;.
eeb0: 20 20 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69        const sqli
eec0: 74 65 33 5f 6d 6f 64 75 6c 65 20 2a 70 4d 6f 64  te3_module *pMod
eed0: 75 6c 65 20 3d 20 70 56 43 75 72 2d 3e 70 56 74  ule = pVCur->pVt
eee0: 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b 0a 20 20 20  ab->pModule;.   
eef0: 20 20 20 61 73 73 65 72 74 28 20 70 56 43 75 72     assert( pVCur
ef00: 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 3e 30 20  ->pVtab->nRef>0 
ef10: 29 3b 0a 20 20 20 20 20 20 70 56 43 75 72 2d 3e  );.      pVCur->
ef20: 70 56 74 61 62 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  pVtab->nRef--;. 
ef30: 20 20 20 20 20 70 4d 6f 64 75 6c 65 2d 3e 78 43       pModule->xC
ef40: 6c 6f 73 65 28 70 56 43 75 72 29 3b 0a 20 20 20  lose(pVCur);.   
ef50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ef60: 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a  #endif.  }.}../*
ef70: 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75  .** Close all cu
ef80: 72 73 6f 72 73 20 69 6e 20 74 68 65 20 63 75 72  rsors in the cur
ef90: 72 65 6e 74 20 66 72 61 6d 65 2e 0a 2a 2f 0a 73  rent frame..*/.s
efa0: 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65  tatic void close
efb0: 43 75 72 73 6f 72 73 49 6e 46 72 61 6d 65 28 56  CursorsInFrame(V
efc0: 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70  dbe *p){.  if( p
efd0: 2d 3e 61 70 43 73 72 20 29 7b 0a 20 20 20 20 69  ->apCsr ){.    i
efe0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
eff0: 30 3b 20 69 3c 70 2d 3e 6e 43 75 72 73 6f 72 3b  0; i<p->nCursor;
f000: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 56 64 62   i++){.      Vdb
f010: 65 43 75 72 73 6f 72 20 2a 70 43 20 3d 20 70 2d  eCursor *pC = p-
f020: 3e 61 70 43 73 72 5b 69 5d 3b 0a 20 20 20 20 20  >apCsr[i];.     
f030: 20 69 66 28 20 70 43 20 29 7b 0a 20 20 20 20 20   if( pC ){.     
f040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 46 72     sqlite3VdbeFr
f050: 65 65 43 75 72 73 6f 72 28 70 2c 20 70 43 29 3b  eeCursor(p, pC);
f060: 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 70 43 73  .        p->apCs
f070: 72 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  r[i] = 0;.      
f080: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  }.    }.  }.}../
f090: 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 76 61  *.** Copy the va
f0a0: 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74  lues stored in t
f0b0: 68 65 20 56 64 62 65 46 72 61 6d 65 20 73 74 72  he VdbeFrame str
f0c0: 75 63 74 75 72 65 20 74 6f 20 69 74 73 20 56 64  ucture to its Vd
f0d0: 62 65 2e 20 54 68 69 73 0a 2a 2a 20 69 73 20 75  be. This.** is u
f0e0: 73 65 64 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  sed, for example
f0f0: 2c 20 77 68 65 6e 20 61 20 74 72 69 67 67 65 72  , when a trigger
f100: 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 69 73 20   sub-program is 
f110: 68 61 6c 74 65 64 20 74 6f 20 72 65 73 74 6f 72  halted to restor
f120: 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 20 74 6f 20  e.** control to 
f130: 74 68 65 20 6d 61 69 6e 20 70 72 6f 67 72 61 6d  the main program
f140: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
f150: 56 64 62 65 46 72 61 6d 65 52 65 73 74 6f 72 65  VdbeFrameRestore
f160: 28 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72 61  (VdbeFrame *pFra
f170: 6d 65 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  me){.  Vdbe *v =
f180: 20 70 46 72 61 6d 65 2d 3e 76 3b 0a 20 20 63 6c   pFrame->v;.  cl
f190: 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61 6d  oseCursorsInFram
f1a0: 65 28 76 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  e(v);.#ifdef SQL
f1b0: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f  ITE_ENABLE_STMT_
f1c0: 53 43 41 4e 53 54 41 54 55 53 0a 20 20 76 2d 3e  SCANSTATUS.  v->
f1d0: 61 6e 45 78 65 63 20 3d 20 70 46 72 61 6d 65 2d  anExec = pFrame-
f1e0: 3e 61 6e 45 78 65 63 3b 0a 23 65 6e 64 69 66 0a  >anExec;.#endif.
f1f0: 20 20 76 2d 3e 61 4f 6e 63 65 46 6c 61 67 20 3d    v->aOnceFlag =
f200: 20 70 46 72 61 6d 65 2d 3e 61 4f 6e 63 65 46 6c   pFrame->aOnceFl
f210: 61 67 3b 0a 20 20 76 2d 3e 6e 4f 6e 63 65 46 6c  ag;.  v->nOnceFl
f220: 61 67 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 4f 6e  ag = pFrame->nOn
f230: 63 65 46 6c 61 67 3b 0a 20 20 76 2d 3e 61 4f 70  ceFlag;.  v->aOp
f240: 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a   = pFrame->aOp;.
f250: 20 20 76 2d 3e 6e 4f 70 20 3d 20 70 46 72 61 6d    v->nOp = pFram
f260: 65 2d 3e 6e 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65  e->nOp;.  v->aMe
f270: 6d 20 3d 20 70 46 72 61 6d 65 2d 3e 61 4d 65 6d  m = pFrame->aMem
f280: 3b 0a 20 20 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46  ;.  v->nMem = pF
f290: 72 61 6d 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d  rame->nMem;.  v-
f2a0: 3e 61 70 43 73 72 20 3d 20 70 46 72 61 6d 65 2d  >apCsr = pFrame-
f2b0: 3e 61 70 43 73 72 3b 0a 20 20 76 2d 3e 6e 43 75  >apCsr;.  v->nCu
f2c0: 72 73 6f 72 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  rsor = pFrame->n
f2d0: 43 75 72 73 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d  Cursor;.  v->db-
f2e0: 3e 6c 61 73 74 52 6f 77 69 64 20 3d 20 70 46 72  >lastRowid = pFr
f2f0: 61 6d 65 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a  ame->lastRowid;.
f300: 20 20 76 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70    v->nChange = p
f310: 46 72 61 6d 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a  Frame->nChange;.
f320: 20 20 76 2d 3e 64 62 2d 3e 6e 43 68 61 6e 67 65    v->db->nChange
f330: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 44 62 43 68   = pFrame->nDbCh
f340: 61 6e 67 65 3b 0a 20 20 73 71 6c 69 74 65 33 56  ange;.  sqlite3V
f350: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
f360: 28 76 2d 3e 64 62 2c 20 26 76 2d 3e 70 41 75 78  (v->db, &v->pAux
f370: 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
f380: 76 2d 3e 70 41 75 78 44 61 74 61 20 3d 20 70 46  v->pAuxData = pF
f390: 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 3b 0a  rame->pAuxData;.
f3a0: 20 20 70 46 72 61 6d 65 2d 3e 70 41 75 78 44 61    pFrame->pAuxDa
f3b0: 74 61 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  ta = 0;.  return
f3c0: 20 70 46 72 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a   pFrame->pc;.}..
f3d0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
f3e0: 63 75 72 73 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41  cursors..**.** A
f3f0: 6c 73 6f 20 72 65 6c 65 61 73 65 20 61 6e 79 20  lso release any 
f400: 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 68  dynamic memory h
f410: 65 6c 64 20 62 79 20 74 68 65 20 56 4d 20 69 6e  eld by the VM in
f420: 20 74 68 65 20 56 64 62 65 2e 61 4d 65 6d 20 6d   the Vdbe.aMem m
f430: 65 6d 6f 72 79 20 0a 2a 2a 20 63 65 6c 6c 20 61  emory .** cell a
f440: 72 72 61 79 2e 20 54 68 69 73 20 69 73 20 6e 65  rray. This is ne
f450: 63 65 73 73 61 72 79 20 61 73 20 74 68 65 20 6d  cessary as the m
f460: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 72 72 61 79  emory cell array
f470: 20 6d 61 79 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20   may contain.** 
f480: 70 6f 69 6e 74 65 72 73 20 74 6f 20 56 64 62 65  pointers to Vdbe
f490: 46 72 61 6d 65 20 6f 62 6a 65 63 74 73 2c 20 77  Frame objects, w
f4a0: 68 69 63 68 20 6d 61 79 20 69 6e 20 74 75 72 6e  hich may in turn
f4b0: 20 63 6f 6e 74 61 69 6e 20 70 6f 69 6e 74 65 72   contain pointer
f4c0: 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e 20 63 75 72  s to.** open cur
f4d0: 73 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sors..*/.static 
f4e0: 76 6f 69 64 20 63 6c 6f 73 65 41 6c 6c 43 75 72  void closeAllCur
f4f0: 73 6f 72 73 28 56 64 62 65 20 2a 70 29 7b 0a 20  sors(Vdbe *p){. 
f500: 20 69 66 28 20 70 2d 3e 70 46 72 61 6d 65 20 29   if( p->pFrame )
f510: 7b 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20  {.    VdbeFrame 
f520: 2a 70 46 72 61 6d 65 3b 0a 20 20 20 20 66 6f 72  *pFrame;.    for
f530: 28 70 46 72 61 6d 65 3d 70 2d 3e 70 46 72 61 6d  (pFrame=p->pFram
f540: 65 3b 20 70 46 72 61 6d 65 2d 3e 70 50 61 72 65  e; pFrame->pPare
f550: 6e 74 3b 20 70 46 72 61 6d 65 3d 70 46 72 61 6d  nt; pFrame=pFram
f560: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 20  e->pParent);.   
f570: 20 73 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d   sqlite3VdbeFram
f580: 65 52 65 73 74 6f 72 65 28 70 46 72 61 6d 65 29  eRestore(pFrame)
f590: 3b 0a 20 20 20 20 70 2d 3e 70 46 72 61 6d 65 20  ;.    p->pFrame 
f5a0: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 46 72 61  = 0;.    p->nFra
f5b0: 6d 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  me = 0;.  }.  as
f5c0: 73 65 72 74 28 20 70 2d 3e 6e 46 72 61 6d 65 3d  sert( p->nFrame=
f5d0: 3d 30 20 29 3b 0a 20 20 63 6c 6f 73 65 43 75 72  =0 );.  closeCur
f5e0: 73 6f 72 73 49 6e 46 72 61 6d 65 28 70 29 3b 0a  sorsInFrame(p);.
f5f0: 20 20 69 66 28 20 70 2d 3e 61 4d 65 6d 20 29 7b    if( p->aMem ){
f600: 0a 20 20 20 20 72 65 6c 65 61 73 65 4d 65 6d 41  .    releaseMemA
f610: 72 72 61 79 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d  rray(p->aMem, p-
f620: 3e 6e 4d 65 6d 29 3b 0a 20 20 7d 0a 20 20 77 68  >nMem);.  }.  wh
f630: 69 6c 65 28 20 70 2d 3e 70 44 65 6c 46 72 61 6d  ile( p->pDelFram
f640: 65 20 29 7b 0a 20 20 20 20 56 64 62 65 46 72 61  e ){.    VdbeFra
f650: 6d 65 20 2a 70 44 65 6c 20 3d 20 70 2d 3e 70 44  me *pDel = p->pD
f660: 65 6c 46 72 61 6d 65 3b 0a 20 20 20 20 70 2d 3e  elFrame;.    p->
f670: 70 44 65 6c 46 72 61 6d 65 20 3d 20 70 44 65 6c  pDelFrame = pDel
f680: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 73  ->pParent;.    s
f690: 71 6c 69 74 65 33 56 64 62 65 46 72 61 6d 65 44  qlite3VdbeFrameD
f6a0: 65 6c 65 74 65 28 70 44 65 6c 29 3b 0a 20 20 7d  elete(pDel);.  }
f6b0: 0a 0a 20 20 2f 2a 20 44 65 6c 65 74 65 20 61 6e  ..  /* Delete an
f6c0: 79 20 61 75 78 64 61 74 61 20 61 6c 6c 6f 63 61  y auxdata alloca
f6d0: 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 20 74 68  tions made by th
f6e0: 65 20 56 4d 20 2a 2f 0a 20 20 69 66 28 20 70 2d  e VM */.  if( p-
f6f0: 3e 70 41 75 78 44 61 74 61 20 29 20 73 71 6c 69  >pAuxData ) sqli
f700: 74 65 33 56 64 62 65 44 65 6c 65 74 65 41 75 78  te3VdbeDeleteAux
f710: 44 61 74 61 28 70 2d 3e 64 62 2c 20 26 70 2d 3e  Data(p->db, &p->
f720: 70 41 75 78 44 61 74 61 2c 20 2d 31 2c 20 30 29  pAuxData, -1, 0)
f730: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  ;.  assert( p->p
f740: 41 75 78 44 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a  AuxData==0 );.}.
f750: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20  ./*.** Clean up 
f760: 74 68 65 20 56 4d 20 61 66 74 65 72 20 61 20 73  the VM after a s
f770: 69 6e 67 6c 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74  ingle run..*/.st
f780: 61 74 69 63 20 76 6f 69 64 20 43 6c 65 61 6e 75  atic void Cleanu
f790: 70 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  p(Vdbe *p){.  sq
f7a0: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
f7b0: 62 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b;..#ifdef SQLIT
f7c0: 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 45 78 65  E_DEBUG.  /* Exe
f7d0: 63 75 74 65 20 61 73 73 65 72 74 28 29 20 73 74  cute assert() st
f7e0: 61 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75  atements to ensu
f7f0: 72 65 20 74 68 61 74 20 74 68 65 20 56 64 62 65  re that the Vdbe
f800: 2e 61 70 43 73 72 5b 5d 20 61 6e 64 20 0a 20 20  .apCsr[] and .  
f810: 2a 2a 20 56 64 62 65 2e 61 4d 65 6d 5b 5d 20 61  ** Vdbe.aMem[] a
f820: 72 72 61 79 73 20 68 61 76 65 20 61 6c 72 65 61  rrays have alrea
f830: 64 79 20 62 65 65 6e 20 63 6c 65 61 6e 65 64 20  dy been cleaned 
f840: 75 70 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  up.  */.  int i;
f850: 0a 20 20 69 66 28 20 70 2d 3e 61 70 43 73 72 20  .  if( p->apCsr 
f860: 29 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e  ) for(i=0; i<p->
f870: 6e 43 75 72 73 6f 72 3b 20 69 2b 2b 29 20 61 73  nCursor; i++) as
f880: 73 65 72 74 28 20 70 2d 3e 61 70 43 73 72 5b 69  sert( p->apCsr[i
f890: 5d 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  ]==0 );.  if( p-
f8a0: 3e 61 4d 65 6d 20 29 7b 0a 20 20 20 20 66 6f 72  >aMem ){.    for
f8b0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b  (i=0; i<p->nMem;
f8c0: 20 69 2b 2b 29 20 61 73 73 65 72 74 28 20 70 2d   i++) assert( p-
f8d0: 3e 61 4d 65 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d  >aMem[i].flags==
f8e0: 4d 45 4d 5f 55 6e 64 65 66 69 6e 65 64 20 29 3b  MEM_Undefined );
f8f0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
f900: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
f910: 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
f920: 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  p->zErrMsg = 0;.
f930: 20 20 70 2d 3e 70 52 65 73 75 6c 74 53 65 74 20    p->pResultSet 
f940: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  = 0;.}../*.** Se
f950: 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
f960: 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 74  result columns t
f970: 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
f980: 72 6e 65 64 20 62 79 20 74 68 69 73 20 53 51 4c  rned by this SQL
f990: 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 2e 20 54  .** statement. T
f9a0: 68 69 73 20 69 73 20 6e 6f 77 20 73 65 74 20 61  his is now set a
f9b0: 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
f9c0: 72 61 74 68 65 72 20 74 68 61 6e 20 64 75 72 69  rather than duri
f9d0: 6e 67 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 20  ng.** execution 
f9e0: 6f 66 20 74 68 65 20 76 64 62 65 20 70 72 6f 67  of the vdbe prog
f9f0: 72 61 6d 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ram so that sqli
fa00: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
fa10: 28 29 20 63 61 6e 0a 2a 2a 20 62 65 20 63 61 6c  () can.** be cal
fa20: 6c 65 64 20 6f 6e 20 61 6e 20 53 51 4c 20 73 74  led on an SQL st
fa30: 61 74 65 6d 65 6e 74 20 62 65 66 6f 72 65 20 73  atement before s
fa40: 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 0a 2a  qlite3_step()..*
fa50: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
fa60: 62 65 53 65 74 4e 75 6d 43 6f 6c 73 28 56 64 62  beSetNumCols(Vdb
fa70: 65 20 2a 70 2c 20 69 6e 74 20 6e 52 65 73 43 6f  e *p, int nResCo
fa80: 6c 75 6d 6e 29 7b 0a 20 20 4d 65 6d 20 2a 70 43  lumn){.  Mem *pC
fa90: 6f 6c 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b  olName;.  int n;
faa0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
fab0: 20 70 2d 3e 64 62 3b 0a 0a 20 20 72 65 6c 65 61   p->db;..  relea
fac0: 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43  seMemArray(p->aC
fad0: 6f 6c 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43  olName, p->nResC
fae0: 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29  olumn*COLNAME_N)
faf0: 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
fb00: 65 28 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d  e(db, p->aColNam
fb10: 65 29 3b 0a 20 20 6e 20 3d 20 6e 52 65 73 43 6f  e);.  n = nResCo
fb20: 6c 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a  lumn*COLNAME_N;.
fb30: 20 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20    p->nResColumn 
fb40: 3d 20 28 75 31 36 29 6e 52 65 73 43 6f 6c 75 6d  = (u16)nResColum
fb50: 6e 3b 0a 20 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  n;.  p->aColName
fb60: 20 3d 20 70 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d   = pColName = (M
fb70: 65 6d 2a 29 73 71 6c 69 74 65 33 44 62 4d 61 6c  em*)sqlite3DbMal
fb80: 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65  locZero(db, size
fb90: 6f 66 28 4d 65 6d 29 2a 6e 20 29 3b 0a 20 20 69  of(Mem)*n );.  i
fba0: 66 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d  f( p->aColName==
fbb0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
fbc0: 69 6c 65 28 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a  ile( n-- > 0 ){.
fbd0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c      pColName->fl
fbe0: 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a  ags = MEM_Null;.
fbf0: 20 20 20 20 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62      pColName->db
fc00: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 70 43   = p->db;.    pC
fc10: 6f 6c 4e 61 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a  olName++;.  }.}.
fc20: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6e  ./*.** Set the n
fc30: 61 6d 65 20 6f 66 20 74 68 65 20 69 64 78 27 74  ame of the idx't
fc40: 68 20 63 6f 6c 75 6d 6e 20 74 6f 20 62 65 20 72  h column to be r
fc50: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
fc60: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  QL statement..**
fc70: 20 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61   zName must be a
fc80: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 75   pointer to a nu
fc90: 6c 20 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  l terminated str
fca0: 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
fcb0: 63 61 6c 6c 20 6d 75 73 74 20 62 65 20 6d 61 64  call must be mad
fcc0: 65 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74  e after a call t
fcd0: 6f 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74  o sqlite3VdbeSet
fce0: 4e 75 6d 43 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a  NumCols()..**.**
fcf0: 20 54 68 65 20 66 69 6e 61 6c 20 70 61 72 61 6d   The final param
fd00: 65 74 65 72 2c 20 78 44 65 6c 2c 20 6d 75 73 74  eter, xDel, must
fd10: 20 62 65 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   be one of SQLIT
fd20: 45 5f 44 59 4e 41 4d 49 43 2c 20 53 51 4c 49 54  E_DYNAMIC, SQLIT
fd30: 45 5f 53 54 41 54 49 43 0a 2a 2a 20 6f 72 20 53  E_STATIC.** or S
fd40: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 2e  QLITE_TRANSIENT.
fd50: 20 49 66 20 69 74 20 69 73 20 53 51 4c 49 54 45   If it is SQLITE
fd60: 5f 44 59 4e 41 4d 49 43 2c 20 74 68 65 6e 20 74  _DYNAMIC, then t
fd70: 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  he buffer pointe
fd80: 64 0a 2a 2a 20 74 6f 20 62 79 20 7a 4e 61 6d 65  d.** to by zName
fd90: 20 77 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62   will be freed b
fda0: 79 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  y sqlite3DbFree(
fdb0: 29 20 77 68 65 6e 20 74 68 65 20 76 64 62 65 20  ) when the vdbe 
fdc0: 69 73 20 64 65 73 74 72 6f 79 65 64 2e 0a 2a 2f  is destroyed..*/
fdd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
fde0: 53 65 74 43 6f 6c 4e 61 6d 65 28 0a 20 20 56 64  SetColName(.  Vd
fdf0: 62 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  be *p,          
fe00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
fe10: 2a 20 56 64 62 65 20 62 65 69 6e 67 20 63 6f 6e  * Vdbe being con
fe20: 66 69 67 75 72 65 64 20 2a 2f 0a 20 20 69 6e 74  figured */.  int
fe30: 20 69 64 78 2c 20 20 20 20 20 20 20 20 20 20 20   idx,           
fe40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe50: 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75 6d 6e   Index of column
fe60: 20 7a 4e 61 6d 65 20 61 70 70 6c 69 65 73 20 74   zName applies t
fe70: 6f 20 2a 2f 0a 20 20 69 6e 74 20 76 61 72 2c 20  o */.  int var, 
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe90: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
fea0: 66 20 74 68 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20  f the COLNAME_* 
feb0: 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 20 20 63  constants */.  c
fec0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
fed0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fee0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
fef0: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
ff00: 6e 61 6d 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28  name */.  void (
ff10: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 20 20  *xDel)(void*)   
ff20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
ff30: 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
ff40: 73 74 72 61 74 65 67 79 20 66 6f 72 20 7a 4e 61  strategy for zNa
ff50: 6d 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  me */.){.  int r
ff60: 63 3b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  c;.  Mem *pColNa
ff70: 6d 65 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  me;.  assert( id
ff80: 78 3c 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20  x<p->nResColumn 
ff90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 76 61 72  );.  assert( var
ffa0: 3c 43 4f 4c 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20  <COLNAME_N );.  
ffb0: 69 66 28 20 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  if( p->db->mallo
ffc0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 61  cFailed ){.    a
ffd0: 73 73 65 72 74 28 20 21 7a 4e 61 6d 65 20 7c 7c  ssert( !zName ||
ffe0: 20 78 44 65 6c 21 3d 53 51 4c 49 54 45 5f 44 59   xDel!=SQLITE_DY
fff0: 4e 41 4d 49 43 20 29 3b 0a 20 20 20 20 72 65 74  NAMIC );.    ret
10000 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
10010 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 61 73 73  _BKPT;.  }.  ass
10020 65 72 74 28 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65  ert( p->aColName
10030 21 3d 30 20 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d  !=0 );.  pColNam
10040 65 20 3d 20 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d  e = &(p->aColNam
10050 65 5b 69 64 78 2b 76 61 72 2a 70 2d 3e 6e 52 65  e[idx+var*p->nRe
10060 73 43 6f 6c 75 6d 6e 5d 29 3b 0a 20 20 72 63 20  sColumn]);.  rc 
10070 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  = sqlite3VdbeMem
10080 53 65 74 53 74 72 28 70 43 6f 6c 4e 61 6d 65 2c  SetStr(pColName,
10090 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
100a0 54 45 5f 55 54 46 38 2c 20 78 44 65 6c 29 3b 0a  TE_UTF8, xDel);.
100b0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 30 20    assert( rc!=0 
100c0 7c 7c 20 21 7a 4e 61 6d 65 20 7c 7c 20 28 70 43  || !zName || (pC
100d0 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 26 4d 45  olName->flags&ME
100e0 4d 5f 54 65 72 6d 29 21 3d 30 20 29 3b 0a 20 20  M_Term)!=0 );.  
100f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10100 0a 2a 2a 20 41 20 72 65 61 64 20 6f 72 20 77 72  .** A read or wr
10110 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
10120 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
10130 65 20 61 63 74 69 76 65 20 6f 6e 20 64 61 74 61  e active on data
10140 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64  base handle.** d
10150 62 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  b. If a transact
10160 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 63  ion is active, c
10170 6f 6d 6d 69 74 20 69 74 2e 20 49 66 20 74 68 65  ommit it. If the
10180 72 65 20 69 73 20 61 0a 2a 2a 20 77 72 69 74 65  re is a.** write
10190 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 70 61  -transaction spa
101a0 6e 6e 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  nning more than 
101b0 6f 6e 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  one database fil
101c0 65 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  e, this routine.
101d0 2a 2a 20 74 61 6b 65 73 20 63 61 72 65 20 6f 66  ** takes care of
101e0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
101f0 6e 61 6c 20 74 72 69 63 6b 65 72 79 2e 0a 2a 2f  nal trickery..*/
10200 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62 65  .static int vdbe
10210 43 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  Commit(sqlite3 *
10220 64 62 2c 20 56 64 62 65 20 2a 70 29 7b 0a 20 20  db, Vdbe *p){.  
10230 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 54 72  int i;.  int nTr
10240 61 6e 73 20 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d  ans = 0;  /* Num
10250 62 65 72 20 6f 66 20 64 61 74 61 62 61 73 65 73  ber of databases
10260 20 77 69 74 68 20 61 6e 20 61 63 74 69 76 65 20   with an active 
10270 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
10280 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n.              
10290 20 20 20 20 20 2a 2a 20 74 68 61 74 20 61 72 65       ** that are
102a0 20 63 61 6e 64 69 64 61 74 65 73 20 66 6f 72 20   candidates for 
102b0 61 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d  a two-phase comm
102c0 69 74 20 75 73 69 6e 67 20 61 0a 20 20 20 20 20  it using a.     
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
102e0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
102f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
10300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e  LITE_OK;.  int n
10310 65 65 64 58 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a  eedXcommit = 0;.
10320 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10330 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
10340 0a 20 20 2f 2a 20 57 69 74 68 20 74 68 69 73 20  .  /* With this 
10350 6f 70 74 69 6f 6e 2c 20 73 71 6c 69 74 65 33 56  option, sqlite3V
10360 74 61 62 53 79 6e 63 28 29 20 69 73 20 64 65 66  tabSync() is def
10370 69 6e 65 64 20 74 6f 20 62 65 20 73 69 6d 70 6c  ined to be simpl
10380 79 20 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f  y .  ** SQLITE_O
10390 4b 20 73 6f 20 70 20 69 73 20 6e 6f 74 20 75 73  K so p is not us
103a0 65 64 2e 20 0a 20 20 2a 2f 0a 20 20 55 4e 55 53  ed. .  */.  UNUS
103b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b  ED_PARAMETER(p);
103c0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 42 65  .#endif..  /* Be
103d0 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 79 74 68  fore doing anyth
103e0 69 6e 67 20 65 6c 73 65 2c 20 63 61 6c 6c 20 74  ing else, call t
103f0 68 65 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  he xSync() callb
10400 61 63 6b 20 66 6f 72 20 61 6e 79 0a 20 20 2a 2a  ack for any.  **
10410 20 76 69 72 74 75 61 6c 20 6d 6f 64 75 6c 65 20   virtual module 
10420 74 61 62 6c 65 73 20 77 72 69 74 74 65 6e 20 69  tables written i
10430 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
10440 6f 6e 2e 20 54 68 69 73 20 68 61 73 20 74 6f 0a  on. This has to.
10450 20 20 2a 2a 20 62 65 20 64 6f 6e 65 20 62 65 66    ** be done bef
10460 6f 72 65 20 64 65 74 65 72 6d 69 6e 69 6e 67 20  ore determining 
10470 77 68 65 74 68 65 72 20 61 20 6d 61 73 74 65 72  whether a master
10480 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
10490 20 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 64 2c   .  ** required,
104a0 20 61 73 20 61 6e 20 78 53 79 6e 63 28 29 20 63   as an xSync() c
104b0 61 6c 6c 62 61 63 6b 20 6d 61 79 20 61 64 64 20  allback may add 
104c0 61 6e 20 61 74 74 61 63 68 65 64 20 64 61 74 61  an attached data
104d0 62 61 73 65 0a 20 20 2a 2a 20 74 6f 20 74 68 65  base.  ** to the
104e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
104f0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
10500 33 56 74 61 62 53 79 6e 63 28 64 62 2c 20 70 29  3VtabSync(db, p)
10510 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f  ;..  /* This loo
10520 70 20 64 65 74 65 72 6d 69 6e 65 73 20 28 61 29  p determines (a)
10530 20 69 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 68   if the commit h
10540 6f 6f 6b 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ook should be in
10550 76 6f 6b 65 64 20 61 6e 64 0a 20 20 2a 2a 20 28  voked and.  ** (
10560 62 29 20 68 6f 77 20 6d 61 6e 79 20 64 61 74 61  b) how many data
10570 62 61 73 65 20 66 69 6c 65 73 20 68 61 76 65 20  base files have 
10580 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e 73  open write trans
10590 61 63 74 69 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20  actions, not .  
105a0 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
105b0 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 2e 20   temp database. 
105c0 28 62 29 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  (b) is important
105d0 20 62 65 63 61 75 73 65 20 69 66 20 6d 6f 72 65   because if more
105e0 20 74 68 61 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20   than .  ** one 
105f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
10600 73 20 61 6e 20 6f 70 65 6e 20 77 72 69 74 65 20  s an open write 
10610 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20 6d  transaction, a m
10620 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 20 20  aster journal.  
10630 2a 2a 20 66 69 6c 65 20 69 73 20 72 65 71 75 69  ** file is requi
10640 72 65 64 20 66 6f 72 20 61 6e 20 61 74 6f 6d 69  red for an atomi
10650 63 20 63 6f 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a  c commit..  */ .
10660 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
10670 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
10680 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20  ->nDb; i++){ .  
10690 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
106a0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
106b0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
106c0 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 42 74  reeIsInTrans(pBt
106d0 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68  ) ){.      /* Wh
106e0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 64  ether or not a d
106f0 61 74 61 62 61 73 65 20 6d 69 67 68 74 20 6e 65  atabase might ne
10700 65 64 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ed a master jour
10710 6e 61 6c 20 64 65 70 65 6e 64 73 20 75 70 6f 6e  nal depends upon
10720 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 20 6a 6f  .      ** its jo
10730 75 72 6e 61 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e  urnal mode (amon
10740 67 20 6f 74 68 65 72 20 74 68 69 6e 67 73 29 2e  g other things).
10750 20 20 54 68 69 73 20 6d 61 74 72 69 78 20 64 65    This matrix de
10760 74 65 72 6d 69 6e 65 73 20 77 68 69 63 68 0a 20  termines which. 
10770 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
10780 6d 6f 64 65 73 20 75 73 65 20 61 20 6d 61 73 74  modes use a mast
10790 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 77  er journal and w
107a0 68 69 63 68 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20  hich do not */. 
107b0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
107c0 74 20 75 38 20 61 4d 4a 4e 65 65 64 65 64 5b 5d  t u8 aMJNeeded[]
107d0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   = {.        /* 
107e0 44 45 4c 45 54 45 20 20 20 2a 2f 20 20 31 2c 0a  DELETE   */  1,.
107f0 20 20 20 20 20 20 20 20 2f 2a 20 50 45 52 53 49          /* PERSI
10800 53 54 20 20 20 2a 2f 20 31 2c 0a 20 20 20 20 20  ST   */ 1,.     
10810 20 20 20 2f 2a 20 4f 46 46 20 20 20 20 20 20 20     /* OFF       
10820 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20 2f 2a  */ 0,.        /*
10830 20 54 52 55 4e 43 41 54 45 20 20 2a 2f 20 31 2c   TRUNCATE  */ 1,
10840 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 45 4d 4f  .        /* MEMO
10850 52 59 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  RY    */ 0,.    
10860 20 20 20 20 2f 2a 20 57 41 4c 20 20 20 20 20 20      /* WAL      
10870 20 2a 2f 20 30 0a 20 20 20 20 20 20 7d 3b 0a 20   */ 0.      };. 
10880 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
10890 65 72 3b 20 20 20 2f 2a 20 50 61 67 65 72 20 61  er;   /* Pager a
108a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
108b0 42 74 20 2a 2f 0a 20 20 20 20 20 20 6e 65 65 64  Bt */.      need
108c0 58 63 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20  Xcommit = 1;.   
108d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
108e0 6e 74 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20  nter(pBt);.     
108f0 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
10900 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 29  3BtreePager(pBt)
10910 3b 0a 20 20 20 20 20 20 69 66 28 20 64 62 2d 3e  ;.      if( db->
10920 61 44 62 5b 69 5d 2e 73 61 66 65 74 79 5f 6c 65  aDb[i].safety_le
10930 76 65 6c 21 3d 50 41 47 45 52 5f 53 59 4e 43 48  vel!=PAGER_SYNCH
10940 52 4f 4e 4f 55 53 5f 4f 46 46 0a 20 20 20 20 20  RONOUS_OFF.     
10950 20 20 26 26 20 61 4d 4a 4e 65 65 64 65 64 5b 73    && aMJNeeded[s
10960 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 4a 6f  qlite3PagerGetJo
10970 75 72 6e 61 6c 4d 6f 64 65 28 70 50 61 67 65 72  urnalMode(pPager
10980 29 5d 0a 20 20 20 20 20 20 29 7b 20 0a 20 20 20  )].      ){ .   
10990 20 20 20 20 20 61 73 73 65 72 74 28 20 69 21 3d       assert( i!=
109a0 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 54 72  1 );.        nTr
109b0 61 6e 73 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ans++;.      }. 
109c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
109d0 33 50 61 67 65 72 45 78 63 6c 75 73 69 76 65 4c  3PagerExclusiveL
109e0 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ock(pPager);.   
109f0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
10a00 65 61 76 65 28 70 42 74 29 3b 0a 20 20 20 20 7d  eave(pBt);.    }
10a10 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
10a20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10a30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
10a40 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
10a50 65 20 61 6e 79 20 77 72 69 74 65 2d 74 72 61 6e  e any write-tran
10a60 73 61 63 74 69 6f 6e 73 20 61 74 20 61 6c 6c 2c  sactions at all,
10a70 20 69 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d   invoke the comm
10a80 69 74 20 68 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28  it hook */.  if(
10a90 20 6e 65 65 64 58 63 6f 6d 6d 69 74 20 26 26 20   needXcommit && 
10aa0 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
10ab0 61 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ack ){.    rc = 
10ac0 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
10ad0 61 63 6b 28 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ack(db->pCommitA
10ae0 72 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  rg);.    if( rc 
10af0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10b00 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
10b10 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20  T_COMMITHOOK;.  
10b20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
10b30 65 20 73 69 6d 70 6c 65 20 63 61 73 65 20 2d 20  e simple case - 
10b40 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
10b50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
10b60 6e 6f 74 20 63 6f 75 6e 74 69 6e 67 20 74 68 65  not counting the
10b70 0a 20 20 2a 2a 20 54 45 4d 50 20 64 61 74 61 62  .  ** TEMP datab
10b80 61 73 65 29 20 68 61 73 20 61 20 74 72 61 6e 73  ase) has a trans
10b90 61 63 74 69 6f 6e 20 61 63 74 69 76 65 2e 20 20  action active.  
10ba0 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   There is no nee
10bb0 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 6d  d for the.  ** m
10bc0 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20  aster-journal.. 
10bd0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
10be0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66 20  return value of 
10bf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
10c00 69 6c 65 6e 61 6d 65 28 29 20 69 73 20 61 20 7a  ilename() is a z
10c10 65 72 6f 20 6c 65 6e 67 74 68 0a 20 20 2a 2a 20  ero length.  ** 
10c20 73 74 72 69 6e 67 2c 20 69 74 20 6d 65 61 6e 73  string, it means
10c30 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
10c40 73 65 20 69 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f  se is :memory: o
10c50 72 20 61 20 74 65 6d 70 20 66 69 6c 65 2e 20 20  r a temp file.  
10c60 49 6e 20 0a 20 20 2a 2a 20 74 68 61 74 20 63 61  In .  ** that ca
10c70 73 65 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70  se we do not sup
10c80 70 6f 72 74 20 61 74 6f 6d 69 63 20 6d 75 6c 74  port atomic mult
10c90 69 2d 66 69 6c 65 20 63 6f 6d 6d 69 74 73 2c 20  i-file commits, 
10ca0 73 6f 20 75 73 65 20 74 68 65 20 0a 20 20 2a 2a  so use the .  **
10cb0 20 73 69 6d 70 6c 65 20 63 61 73 65 20 74 68 65   simple case the
10cc0 6e 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66  n too..  */.  if
10cd0 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c  ( 0==sqlite3Strl
10ce0 65 6e 33 30 28 73 71 6c 69 74 65 33 42 74 72 65  en30(sqlite3Btre
10cf0 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 64 62 2d  eGetFilename(db-
10d00 3e 61 44 62 5b 30 5d 2e 70 42 74 29 29 0a 20 20  >aDb[0].pBt)).  
10d10 20 7c 7c 20 6e 54 72 61 6e 73 3c 3d 31 0a 20 20   || nTrans<=1.  
10d20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
10d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10d40 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
10d50 7b 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70  {.      Btree *p
10d60 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  Bt = db->aDb[i].
10d70 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  pBt;.      if( p
10d80 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  Bt ){.        rc
10d90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
10da0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 42  ommitPhaseOne(pB
10db0 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  t, 0);.      }. 
10dc0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20     }..    /* Do 
10dd0 74 68 65 20 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20  the commit only 
10de0 69 66 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  if all databases
10df0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
10e00 6d 70 6c 65 74 65 20 70 68 61 73 65 20 31 2e 20  mplete phase 1. 
10e10 0a 20 20 20 20 2a 2a 20 49 66 20 6f 6e 65 20 6f  .    ** If one o
10e20 66 20 74 68 65 20 42 74 72 65 65 43 6f 6d 6d 69  f the BtreeCommi
10e30 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
10e40 73 20 66 61 69 6c 73 2c 20 74 68 69 73 20 69 6e  s fails, this in
10e50 64 69 63 61 74 65 73 20 61 6e 0a 20 20 20 20 2a  dicates an.    *
10e60 2a 20 49 4f 20 65 72 72 6f 72 20 77 68 69 6c 65  * IO error while
10e70 20 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75   deleting or tru
10e80 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  ncating a journa
10e90 6c 20 66 69 6c 65 2e 20 49 74 20 69 73 20 75 6e  l file. It is un
10ea0 6c 69 6b 65 6c 79 2c 0a 20 20 20 20 2a 2a 20 62  likely,.    ** b
10eb0 75 74 20 63 6f 75 6c 64 20 68 61 70 70 65 6e 2e  ut could happen.
10ec0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 62   In this case ab
10ed0 61 6e 64 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67  andon processing
10ee0 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
10ef0 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  error..    */.  
10f00 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53    for(i=0; rc==S
10f10 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62  QLITE_OK && i<db
10f20 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
10f30 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
10f40 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
10f50 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
10f60 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
10f70 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
10f80 50 68 61 73 65 54 77 6f 28 70 42 74 2c 20 30 29  PhaseTwo(pBt, 0)
10f90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10fa0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10fb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
10fc0 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69 74  qlite3VtabCommit
10fd0 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
10fe0 0a 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 6c 65  .  /* The comple
10ff0 78 20 63 61 73 65 20 2d 20 54 68 65 72 65 20 69  x case - There i
11000 73 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 77  s a multi-file w
11010 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
11020 20 61 63 74 69 76 65 2e 0a 20 20 2a 2a 20 54 68   active..  ** Th
11030 69 73 20 72 65 71 75 69 72 65 73 20 61 20 6d 61  is requires a ma
11040 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
11050 65 20 74 6f 20 65 6e 73 75 72 65 20 74 68 65 20  e to ensure the 
11060 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20  transaction is. 
11070 20 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 20 61 74   ** committed at
11080 6f 6d 69 63 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23  omically..  */.#
11090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
110a0 49 54 5f 44 49 53 4b 49 4f 0a 20 20 65 6c 73 65  IT_DISKIO.  else
110b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
110c0 73 20 2a 70 56 66 73 20 3d 20 64 62 2d 3e 70 56  s *pVfs = db->pV
110d0 66 73 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d  fs;.    char *zM
110e0 61 73 74 65 72 20 3d 20 30 3b 20 20 20 2f 2a 20  aster = 0;   /* 
110f0 46 69 6c 65 2d 6e 61 6d 65 20 66 6f 72 20 74 68  File-name for th
11100 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11110 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 63 6f 6e   */.    char con
11120 73 74 20 2a 7a 4d 61 69 6e 46 69 6c 65 20 3d 20  st *zMainFile = 
11130 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 46  sqlite3BtreeGetF
11140 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62 5b  ilename(db->aDb[
11150 30 5d 2e 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  0].pBt);.    sql
11160 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
11170 65 72 20 3d 20 30 3b 0a 20 20 20 20 69 36 34 20  er = 0;.    i64 
11180 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
11190 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 69 6e 74  int res;.    int
111a0 20 72 65 74 72 79 43 6f 75 6e 74 20 3d 20 30 3b   retryCount = 0;
111b0 0a 20 20 20 20 69 6e 74 20 6e 4d 61 69 6e 46 69  .    int nMainFi
111c0 6c 65 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 6c 65  le;..    /* Sele
111d0 63 74 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  ct a master jour
111e0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 2a 2f  nal file name */
111f0 0a 20 20 20 20 6e 4d 61 69 6e 46 69 6c 65 20 3d  .    nMainFile =
11200 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
11210 28 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20  (zMainFile);.   
11220 20 7a 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   zMaster = sqlit
11230 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 25  e3MPrintf(db, "%
11240 73 2d 6d 6a 58 58 58 58 58 58 39 58 58 7a 22 2c  s-mjXXXXXX9XXz",
11250 20 7a 4d 61 69 6e 46 69 6c 65 29 3b 0a 20 20 20   zMainFile);.   
11260 20 69 66 28 20 7a 4d 61 73 74 65 72 3d 3d 30 20   if( zMaster==0 
11270 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11280 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20  NOMEM_BKPT;.    
11290 64 6f 20 7b 0a 20 20 20 20 20 20 75 33 32 20 69  do {.      u32 i
112a0 52 61 6e 64 6f 6d 3b 0a 20 20 20 20 20 20 69 66  Random;.      if
112b0 28 20 72 65 74 72 79 43 6f 75 6e 74 20 29 7b 0a  ( retryCount ){.
112c0 20 20 20 20 20 20 20 20 69 66 28 20 72 65 74 72          if( retr
112d0 79 43 6f 75 6e 74 3e 31 30 30 20 29 7b 0a 20 20  yCount>100 ){.  
112e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
112f0 6c 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c  log(SQLITE_FULL,
11300 20 22 4d 4a 20 64 65 6c 65 74 65 3a 20 25 73 22   "MJ delete: %s"
11310 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11320 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44        sqlite3OsD
11330 65 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73  elete(pVfs, zMas
11340 74 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ter, 0);.       
11350 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11360 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 74 72    }else if( retr
11370 79 43 6f 75 6e 74 3d 3d 31 20 29 7b 0a 20 20 20  yCount==1 ){.   
11380 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
11390 6f 67 28 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20  og(SQLITE_FULL, 
113a0 22 4d 4a 20 63 6f 6c 6c 69 64 65 3a 20 25 73 22  "MJ collide: %s"
113b0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
113c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
113d0 20 20 20 20 72 65 74 72 79 43 6f 75 6e 74 2b 2b      retryCount++
113e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
113f0 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
11400 66 28 69 52 61 6e 64 6f 6d 29 2c 20 26 69 52 61  f(iRandom), &iRa
11410 6e 64 6f 6d 29 3b 0a 20 20 20 20 20 20 73 71 6c  ndom);.      sql
11420 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31 33  ite3_snprintf(13
11430 2c 20 26 7a 4d 61 73 74 65 72 5b 6e 4d 61 69 6e  , &zMaster[nMain
11440 46 69 6c 65 5d 2c 20 22 2d 6d 6a 25 30 36 58 39  File], "-mj%06X9
11450 25 30 32 58 22 2c 0a 20 20 20 20 20 20 20 20 20  %02X",.         
11460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11470 20 20 20 20 20 20 28 69 52 61 6e 64 6f 6d 3e 3e        (iRandom>>
11480 38 29 26 30 78 66 66 66 66 66 66 2c 20 69 52 61  8)&0xffffff, iRa
11490 6e 64 6f 6d 26 30 78 66 66 29 3b 0a 20 20 20 20  ndom&0xff);.    
114a0 20 20 2f 2a 20 54 68 65 20 61 6e 74 69 70 65 6e    /* The antipen
114b0 75 6c 74 69 6d 61 74 65 20 63 68 61 72 61 63 74  ultimate charact
114c0 65 72 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  er of the master
114d0 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
114e0 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 22  st.      ** be "
114f0 39 22 20 74 6f 20 61 76 6f 69 64 20 6e 61 6d 65  9" to avoid name
11500 20 63 6f 6c 6c 69 73 69 6f 6e 73 20 77 68 65 6e   collisions when
11510 20 75 73 69 6e 67 20 38 2b 33 20 66 69 6c 65 6e   using 8+3 filen
11520 61 6d 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 61  ames. */.      a
11530 73 73 65 72 74 28 20 7a 4d 61 73 74 65 72 5b 73  ssert( zMaster[s
11540 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
11550 4d 61 73 74 65 72 29 2d 33 5d 3d 3d 27 39 27 20  Master)-3]=='9' 
11560 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
11570 46 69 6c 65 53 75 66 66 69 78 33 28 7a 4d 61 69  FileSuffix3(zMai
11580 6e 46 69 6c 65 2c 20 7a 4d 61 73 74 65 72 29 3b  nFile, zMaster);
11590 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
115a0 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73  te3OsAccess(pVfs
115b0 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54  , zMaster, SQLIT
115c0 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 2c  E_ACCESS_EXISTS,
115d0 20 26 72 65 73 29 3b 0a 20 20 20 20 7d 77 68 69   &res);.    }whi
115e0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
115f0 4b 20 26 26 20 72 65 73 20 29 3b 0a 20 20 20 20  K && res );.    
11600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11610 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4f 70  K ){.      /* Op
11620 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
11630 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20 20 20 20 20  urnal. */.      
11640 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
11650 65 6e 4d 61 6c 6c 6f 63 28 70 56 66 73 2c 20 7a  enMalloc(pVfs, z
11660 4d 61 73 74 65 72 2c 20 26 70 4d 61 73 74 65 72  Master, &pMaster
11670 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  , .          SQL
11680 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
11690 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  TE|SQLITE_OPEN_C
116a0 52 45 41 54 45 7c 0a 20 20 20 20 20 20 20 20 20  REATE|.         
116b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
116c0 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f 4f 50  LUSIVE|SQLITE_OP
116d0 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
116e0 4c 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20  L, 0.      );.  
116f0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
11700 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11710 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11720 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11730 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11740 20 20 20 20 7d 0a 20 0a 20 20 20 20 2f 2a 20 57      }. .    /* W
11750 72 69 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  rite the name of
11760 20 65 61 63 68 20 64 61 74 61 62 61 73 65 20 66   each database f
11770 69 6c 65 20 69 6e 20 74 68 65 20 74 72 61 6e 73  ile in the trans
11780 61 63 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  action into the 
11790 6e 65 77 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  new.    ** maste
117a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
117b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
117c0 72 73 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  rs at this point
117d0 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 61 6e   close.    ** an
117e0 64 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  d delete the mas
117f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11800 2e 20 41 6c 6c 20 74 68 65 20 69 6e 64 69 76 69  . All the indivi
11810 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
11820 65 73 0a 20 20 20 20 2a 2a 20 73 74 69 6c 6c 20  es.    ** still 
11830 68 61 76 65 20 27 6e 75 6c 6c 27 20 61 73 20 74  have 'null' as t
11840 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11850 6c 20 70 6f 69 6e 74 65 72 2c 20 73 6f 20 74 68  l pointer, so th
11860 65 79 20 77 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20  ey will roll.   
11870 20 2a 2a 20 62 61 63 6b 20 69 6e 64 65 70 65 6e   ** back indepen
11880 64 65 6e 74 6c 79 20 69 66 20 61 20 66 61 69 6c  dently if a fail
11890 75 72 65 20 6f 63 63 75 72 73 2e 0a 20 20 20 20  ure occurs..    
118a0 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
118b0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
118c0 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
118d0 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
118e0 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  Bt;.      if( sq
118f0 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
11900 61 6e 73 28 70 42 74 29 20 29 7b 0a 20 20 20 20  ans(pBt) ){.    
11910 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
11920 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 42  zFile = sqlite3B
11930 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e 61  treeGetJournalna
11940 6d 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  me(pBt);.       
11950 20 69 66 28 20 7a 46 69 6c 65 3d 3d 30 20 29 7b   if( zFile==0 ){
11960 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
11970 6e 75 65 3b 20 20 2f 2a 20 49 67 6e 6f 72 65 20  nue;  /* Ignore 
11980 54 45 4d 50 20 61 6e 64 20 3a 6d 65 6d 6f 72 79  TEMP and :memory
11990 3a 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20  : databases */. 
119a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
119b0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 5b 30   assert( zFile[0
119c0 5d 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  ]!=0 );.        
119d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
119e0 69 74 65 28 70 4d 61 73 74 65 72 2c 20 7a 46 69  ite(pMaster, zFi
119f0 6c 65 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  le, sqlite3Strle
11a00 6e 33 30 28 7a 46 69 6c 65 29 2b 31 2c 20 6f 66  n30(zFile)+1, of
11a10 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 6f  fset);.        o
11a20 66 66 73 65 74 20 2b 3d 20 73 71 6c 69 74 65 33  ffset += sqlite3
11a30 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
11a40 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  1;.        if( r
11a50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11a60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11a70 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61  3OsCloseFree(pMa
11a80 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ster);.         
11a90 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
11aa0 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20  (pVfs, zMaster, 
11ab0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
11ac0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
11ad0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
11ae0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
11af0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53  .    }..    /* S
11b10 79 6e 63 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ync the master j
11b20 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
11b30 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e  the IOCAP_SEQUEN
11b40 54 49 41 4c 20 64 65 76 69 63 65 0a 20 20 20 20  TIAL device.    
11b50 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  ** flag is set t
11b60 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
11b70 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
11b80 69 66 28 20 30 3d 3d 28 73 71 6c 69 74 65 33 4f  if( 0==(sqlite3O
11b90 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
11ba0 69 73 74 69 63 73 28 70 4d 61 73 74 65 72 29 26  istics(pMaster)&
11bb0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
11bc0 55 45 4e 54 49 41 4c 29 0a 20 20 20 20 20 26 26  UENTIAL).     &&
11bd0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
11be0 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  = sqlite3OsSync(
11bf0 70 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  pMaster, SQLITE_
11c00 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20  SYNC_NORMAL)).  
11c10 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
11c20 65 33 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d  e3OsCloseFree(pM
11c30 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 73 71  aster);.      sq
11c40 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
11c50 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  fs, zMaster, 0);
11c60 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62  .      sqlite3Db
11c70 46 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72  Free(db, zMaster
11c80 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
11c90 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
11ca0 2a 20 53 79 6e 63 20 61 6c 6c 20 74 68 65 20 64  * Sync all the d
11cb0 62 20 66 69 6c 65 73 20 69 6e 76 6f 6c 76 65 64  b files involved
11cc0 20 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74   in the transact
11cd0 69 6f 6e 2e 20 54 68 65 20 73 61 6d 65 20 63 61  ion. The same ca
11ce0 6c 6c 0a 20 20 20 20 2a 2a 20 73 65 74 73 20 74  ll.    ** sets t
11cf0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
11d00 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 65 61 63  l pointer in eac
11d10 68 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75  h individual jou
11d20 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 2a 2a 20  rnal. If.    ** 
11d30 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
11d40 68 65 72 65 2c 20 64 6f 20 6e 6f 74 20 64 65 6c  here, do not del
11d50 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
11d60 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11d70 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
11d80 65 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  e error occurs d
11d90 75 72 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  uring the first 
11da0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
11db0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
11dc0 74 50 68 61 73 65 4f 6e 65 28 29 2c 20 74 68 65  tPhaseOne(), the
11dd0 6e 20 74 68 65 72 65 20 69 73 20 61 20 63 68 61  n there is a cha
11de0 6e 63 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  nce that the.   
11df0 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   ** master journ
11e00 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  al file will be 
11e10 6f 72 70 68 61 6e 65 64 2e 20 42 75 74 20 77 65  orphaned. But we
11e20 20 63 61 6e 6e 6f 74 20 64 65 6c 65 74 65 20 69   cannot delete i
11e30 74 2c 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73  t,.    ** in cas
11e40 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11e50 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 77  rnal file name w
11e60 61 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  as written into 
11e70 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
11e80 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72 65 20 74  ** file before t
11e90 68 65 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  he failure occur
11ea0 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
11eb0 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c  for(i=0; rc==SQL
11ec0 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e  ITE_OK && i<db->
11ed0 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  nDb; i++){ .    
11ee0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
11ef0 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
11f00 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a       if( pBt ){.
11f10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11f20 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
11f30 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 7a 4d 61  haseOne(pBt, zMa
11f40 73 74 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ster);.      }. 
11f50 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
11f60 4f 73 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73  OsCloseFree(pMas
11f70 74 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ter);.    assert
11f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc!=SQLITE_BUS
11f90 59 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Y );.    if( rc!
11fa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11fb0 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
11fc0 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a  e(db, zMaster);.
11fd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11fe0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44  .    }..    /* D
11ff0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
12000 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
12010 68 69 73 20 63 6f 6d 6d 69 74 73 20 74 68 65 20  his commits the 
12020 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 66 74  transaction. Aft
12030 65 72 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  er.    ** doing 
12040 74 68 69 73 20 74 68 65 20 64 69 72 65 63 74 6f  this the directo
12050 72 79 20 69 73 20 73 79 6e 63 65 64 20 61 67 61  ry is synced aga
12060 69 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 69 6e  in before any in
12070 64 69 76 69 64 75 61 6c 0a 20 20 20 20 2a 2a 20  dividual.    ** 
12080 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 6c 65  transaction file
12090 73 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 20  s are deleted.. 
120a0 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73     */.    rc = s
120b0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
120c0 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 31 29  Vfs, zMaster, 1)
120d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  ;.    sqlite3DbF
120e0 72 65 65 28 64 62 2c 20 7a 4d 61 73 74 65 72 29  ree(db, zMaster)
120f0 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  ;.    zMaster = 
12100 30 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  0;.    if( rc ){
12110 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12120 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
12130 41 6c 6c 20 66 69 6c 65 73 20 61 6e 64 20 64 69  All files and di
12140 72 65 63 74 6f 72 69 65 73 20 68 61 76 65 20 61  rectories have a
12150 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
12160 65 64 2c 20 73 6f 20 74 68 65 20 66 6f 6c 6c 6f  ed, so the follo
12170 77 69 6e 67 0a 20 20 20 20 2a 2a 20 63 61 6c 6c  wing.    ** call
12180 73 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  s to sqlite3Btre
12190 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
121a0 29 20 61 72 65 20 6f 6e 6c 79 20 63 6c 6f 73 69  ) are only closi
121b0 6e 67 20 66 69 6c 65 73 20 61 6e 64 0a 20 20 20  ng files and.   
121c0 20 2a 2a 20 64 65 6c 65 74 69 6e 67 20 6f 72 20   ** deleting or 
121d0 74 72 75 6e 63 61 74 69 6e 67 20 6a 6f 75 72 6e  truncating journ
121e0 61 6c 73 2e 20 49 66 20 73 6f 6d 65 74 68 69 6e  als. If somethin
121f0 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 77 68 69  g goes wrong whi
12200 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69  le.    ** this i
12210 73 20 68 61 70 70 65 6e 69 6e 67 20 77 65 20 64  s happening we d
12220 6f 6e 27 74 20 72 65 61 6c 6c 79 20 63 61 72 65  on't really care
12230 2e 20 54 68 65 20 69 6e 74 65 67 72 69 74 79 20  . The integrity 
12240 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72  of the.    ** tr
12250 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72  ansaction is alr
12260 65 61 64 79 20 67 75 61 72 61 6e 74 65 65 64 2c  eady guaranteed,
12270 20 62 75 74 20 73 6f 6d 65 20 73 74 72 61 79 20   but some stray 
12280 27 63 6f 6c 64 27 20 6a 6f 75 72 6e 61 6c 73 0a  'cold' journals.
12290 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 6c 79      ** may be ly
122a0 69 6e 67 20 61 72 6f 75 6e 64 2e 20 52 65 74 75  ing around. Retu
122b0 72 6e 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 63  rning an error c
122c0 6f 64 65 20 77 6f 6e 27 74 20 68 65 6c 70 20 6d  ode won't help m
122d0 61 74 74 65 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  atters..    */. 
122e0 20 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c     disable_simul
122f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
12300 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
12310 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
12320 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
12330 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20  <db->nDb; i++){ 
12340 0a 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42  .      Btree *pB
12350 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  t = db->aDb[i].p
12360 42 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  Bt;.      if( pB
12370 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
12380 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12390 68 61 73 65 54 77 6f 28 70 42 74 2c 20 31 29 3b  haseTwo(pBt, 1);
123a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
123b0 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
123c0 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
123d0 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65   enable_simulate
123e0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 0a  d_io_errors();..
123f0 20 20 20 20 73 71 6c 69 74 65 33 56 74 61 62 43      sqlite3VtabC
12400 6f 6d 6d 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  ommit(db);.  }.#
12410 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
12420 72 63 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  rc;.}../* .** Th
12430 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
12440 73 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74  s that the sqlit
12450 65 33 2e 6e 56 64 62 65 41 63 74 69 76 65 20 63  e3.nVdbeActive c
12460 6f 75 6e 74 20 76 61 72 69 61 62 6c 65 0a 2a 2a  ount variable.**
12470 20 6d 61 74 63 68 65 73 20 74 68 65 20 6e 75 6d   matches the num
12480 62 65 72 20 6f 66 20 76 64 62 65 27 73 20 69 6e  ber of vdbe's in
12490 20 74 68 65 20 6c 69 73 74 20 73 71 6c 69 74 65   the list sqlite
124a0 33 2e 70 56 64 62 65 20 74 68 61 74 20 61 72 65  3.pVdbe that are
124b0 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 61 63  .** currently ac
124c0 74 69 76 65 2e 20 41 6e 20 61 73 73 65 72 74 69  tive. An asserti
124d0 6f 6e 20 66 61 69 6c 73 20 69 66 20 74 68 65 20  on fails if the 
124e0 74 77 6f 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f  two counts do no
124f0 74 20 6d 61 74 63 68 2e 0a 2a 2a 20 54 68 69 73  t match..** This
12500 20 69 73 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   is an internal 
12510 73 65 6c 66 2d 63 68 65 63 6b 20 6f 6e 6c 79 20  self-check only 
12520 2d 20 69 74 20 69 73 20 6e 6f 74 20 61 6e 20 65  - it is not an e
12530 73 73 65 6e 74 69 61 6c 20 70 72 6f 63 65 73 73  ssential process
12540 69 6e 67 0a 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a  ing.** step..**.
12550 2a 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  ** This is a no-
12560 6f 70 20 69 66 20 4e 44 45 42 55 47 20 69 73 20  op if NDEBUG is 
12570 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e  defined..*/.#ifn
12580 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74 69  def NDEBUG.stati
12590 63 20 76 6f 69 64 20 63 68 65 63 6b 41 63 74 69  c void checkActi
125a0 76 65 56 64 62 65 43 6e 74 28 73 71 6c 69 74 65  veVdbeCnt(sqlite
125b0 33 20 2a 64 62 29 7b 0a 20 20 56 64 62 65 20 2a  3 *db){.  Vdbe *
125c0 70 3b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  p;.  int cnt = 0
125d0 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74 65 20 3d  ;.  int nWrite =
125e0 20 30 3b 0a 20 20 69 6e 74 20 6e 52 65 61 64 20   0;.  int nRead 
125f0 3d 20 30 3b 0a 20 20 70 20 3d 20 64 62 2d 3e 70  = 0;.  p = db->p
12600 56 64 62 65 3b 0a 20 20 77 68 69 6c 65 28 20 70  Vdbe;.  while( p
12610 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
12620 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 28 73  te3_stmt_busy((s
12630 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 29 20  qlite3_stmt*)p) 
12640 29 7b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  ){.      cnt++;.
12650 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 65 61        if( p->rea
12660 64 4f 6e 6c 79 3d 3d 30 20 29 20 6e 57 72 69 74  dOnly==0 ) nWrit
12670 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  e++;.      if( p
12680 2d 3e 62 49 73 52 65 61 64 65 72 20 29 20 6e 52  ->bIsReader ) nR
12690 65 61 64 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ead++;.    }.   
126a0 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20   p = p->pNext;. 
126b0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74   }.  assert( cnt
126c0 3d 3d 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76  ==db->nVdbeActiv
126d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
126e0 57 72 69 74 65 3d 3d 64 62 2d 3e 6e 56 64 62 65  Write==db->nVdbe
126f0 57 72 69 74 65 20 29 3b 0a 20 20 61 73 73 65 72  Write );.  asser
12700 74 28 20 6e 52 65 61 64 3d 3d 64 62 2d 3e 6e 56  t( nRead==db->nV
12710 64 62 65 52 65 61 64 20 29 3b 0a 7d 0a 23 65 6c  dbeRead );.}.#el
12720 73 65 0a 23 64 65 66 69 6e 65 20 63 68 65 63 6b  se.#define check
12730 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 78 29  ActiveVdbeCnt(x)
12740 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
12750 66 20 74 68 65 20 56 64 62 65 20 70 61 73 73 65  f the Vdbe passe
12760 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
12770 72 67 75 6d 65 6e 74 20 6f 70 65 6e 65 64 20 61  rgument opened a
12780 20 73 74 61 74 65 6d 65 6e 74 2d 74 72 61 6e 73   statement-trans
12790 61 63 74 69 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65  action,.** close
127a0 20 69 74 20 6e 6f 77 2e 20 41 72 67 75 6d 65 6e   it now. Argumen
127b0 74 20 65 4f 70 20 6d 75 73 74 20 62 65 20 65 69  t eOp must be ei
127c0 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
127d0 4f 4c 4c 42 41 43 4b 20 6f 72 0a 2a 2a 20 53 41  OLLBACK or.** SA
127e0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e  VEPOINT_RELEASE.
127f0 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
12800 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68  INT_ROLLBACK, th
12810 65 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  en the statement
12820 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
12830 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
12840 49 66 20 65 4f 70 20 69 73 20 53 41 56 45 50 4f  If eOp is SAVEPO
12850 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
12860 6e 20 74 68 65 20 0a 2a 2a 20 73 74 61 74 65 6d  n the .** statem
12870 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12880 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a  is committed..**
12890 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
128a0 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
128b0 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
128c0 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
128d0 75 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72  urned. .** Other
128e0 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
128f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
12900 62 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74  beCloseStatement
12910 28 56 64 62 65 20 2a 70 2c 20 69 6e 74 20 65 4f  (Vdbe *p, int eO
12920 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 63  p){.  sqlite3 *c
12930 6f 6e 73 74 20 64 62 20 3d 20 70 2d 3e 64 62 3b  onst db = p->db;
12940 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12950 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20  TE_OK;..  /* If 
12960 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20 69 73  p->iStatement is
12970 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65   greater than ze
12980 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 56 64  ro, then this Vd
12990 62 65 20 6f 70 65 6e 65 64 20 61 20 0a 20 20 2a  be opened a .  *
129a0 2a 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  * statement tran
129b0 73 61 63 74 69 6f 6e 20 74 68 61 74 20 73 68 6f  saction that sho
129c0 75 6c 64 20 62 65 20 63 6c 6f 73 65 64 20 68 65  uld be closed he
129d0 72 65 2e 20 54 68 65 20 6f 6e 6c 79 20 65 78 63  re. The only exc
129e0 65 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74  eption.  ** is t
129f0 68 61 74 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hat an IO error 
12a00 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
12a10 64 2c 20 63 61 75 73 69 6e 67 20 61 6e 20 65 6d  d, causing an em
12a20 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
12a30 2e 0a 20 20 2a 2a 20 49 6e 20 74 68 69 73 20 63  ..  ** In this c
12a40 61 73 65 20 28 64 62 2d 3e 6e 53 74 61 74 65 6d  ase (db->nStatem
12a50 65 6e 74 3d 3d 30 29 2c 20 61 6e 64 20 74 68 65  ent==0), and the
12a60 72 65 20 69 73 20 6e 6f 74 68 69 6e 67 20 74 6f  re is nothing to
12a70 20 64 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   do..  */.  if( 
12a80 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 26  db->nStatement &
12a90 26 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74 20  & p->iStatement 
12aa0 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
12ab0 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 53 61 76    const int iSav
12ac0 65 70 6f 69 6e 74 20 3d 20 70 2d 3e 69 53 74 61  epoint = p->iSta
12ad0 74 65 6d 65 6e 74 2d 31 3b 0a 0a 20 20 20 20 61  tement-1;..    a
12ae0 73 73 65 72 74 28 20 65 4f 70 3d 3d 53 41 56 45  ssert( eOp==SAVE
12af0 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c  POINT_ROLLBACK |
12b00 7c 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  | eOp==SAVEPOINT
12b10 5f 52 45 4c 45 41 53 45 29 3b 0a 20 20 20 20 61  _RELEASE);.    a
12b20 73 73 65 72 74 28 20 64 62 2d 3e 6e 53 74 61 74  ssert( db->nStat
12b30 65 6d 65 6e 74 3e 30 20 29 3b 0a 20 20 20 20 61  ement>0 );.    a
12b40 73 73 65 72 74 28 20 70 2d 3e 69 53 74 61 74 65  ssert( p->iState
12b50 6d 65 6e 74 3d 3d 28 64 62 2d 3e 6e 53 74 61 74  ment==(db->nStat
12b60 65 6d 65 6e 74 2b 64 62 2d 3e 6e 53 61 76 65 70  ement+db->nSavep
12b70 6f 69 6e 74 29 20 29 3b 0a 0a 20 20 20 20 66 6f  oint) );..    fo
12b80 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
12b90 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 69  ; i++){ .      i
12ba0 6e 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f  nt rc2 = SQLITE_
12bb0 4f 4b 3b 0a 20 20 20 20 20 20 42 74 72 65 65 20  OK;.      Btree 
12bc0 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
12bd0 5d 2e 70 42 74 3b 0a 20 20 20 20 20 20 69 66 28  ].pBt;.      if(
12be0 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20   pBt ){.        
12bf0 69 66 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49  if( eOp==SAVEPOI
12c00 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20  NT_ROLLBACK ){. 
12c10 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
12c20 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
12c30 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
12c40 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c 20 69 53  INT_ROLLBACK, iS
12c50 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
12c60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12c70 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2==SQLITE_OK 
12c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 32  ){.          rc2
12c90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 53   = sqlite3BtreeS
12ca0 61 76 65 70 6f 69 6e 74 28 70 42 74 2c 20 53 41  avepoint(pBt, SA
12cb0 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c  VEPOINT_RELEASE,
12cc0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
12cd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12ce0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12cf0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
12d00 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 20  c = rc2;.       
12d10 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12d20 0a 20 20 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d  .    db->nStatem
12d30 65 6e 74 2d 2d 3b 0a 20 20 20 20 70 2d 3e 69 53  ent--;.    p->iS
12d40 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20  tatement = 0;.. 
12d50 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12d60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
12d70 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54  ( eOp==SAVEPOINT
12d80 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20  _ROLLBACK ){.   
12d90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12da0 33 56 74 61 62 53 61 76 65 70 6f 69 6e 74 28 64  3VtabSavepoint(d
12db0 62 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  b, SAVEPOINT_ROL
12dc0 4c 42 41 43 4b 2c 20 69 53 61 76 65 70 6f 69 6e  LBACK, iSavepoin
12dd0 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
12de0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12df0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
12e00 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61 62 53  c = sqlite3VtabS
12e10 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53 41 56  avepoint(db, SAV
12e20 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20  EPOINT_RELEASE, 
12e30 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20  iSavepoint);.   
12e40 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
12e50 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
12e60 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12e70 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  is being rolled 
12e80 62 61 63 6b 2c 20 61 6c 73 6f 20 72 65 73 74 6f  back, also resto
12e90 72 65 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64  re the .    ** d
12ea0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 73 20  atabase handles 
12eb0 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
12ec0 69 6e 74 20 63 6f 75 6e 74 65 72 20 74 6f 20 74  int counter to t
12ed0 68 65 20 76 61 6c 75 65 20 69 74 20 68 61 64 20  he value it had 
12ee0 77 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65  when .    ** the
12ef0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
12f00 61 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65  action was opene
12f10 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 65  d.  */.    if( e
12f20 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  Op==SAVEPOINT_RO
12f30 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20  LLBACK ){.      
12f40 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e  db->nDeferredCon
12f50 73 20 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 43  s = p->nStmtDefC
12f60 6f 6e 73 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e  ons;.      db->n
12f70 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73 20  DeferredImmCons 
12f80 3d 20 70 2d 3e 6e 53 74 6d 74 44 65 66 49 6d 6d  = p->nStmtDefImm
12f90 43 6f 6e 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cons;.    }.  }.
12fa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
12fb0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
12fc0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
12fd0 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
12fe0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20 64   opened by the d
12ff0 61 74 61 62 61 73 65 20 0a 2a 2a 20 68 61 6e 64  atabase .** hand
13000 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
13010 74 68 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  th the VM passed
13020 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 20   as an argument 
13030 69 73 20 61 62 6f 75 74 20 74 6f 20 62 65 20 0a  is about to be .
13040 2a 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 66  ** committed. If
13050 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
13060 61 6e 64 69 6e 67 20 64 65 66 65 72 72 65 64 20  anding deferred 
13070 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
13080 74 72 61 69 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74  traint.** violat
13090 69 6f 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c  ions, return SQL
130a0 49 54 45 5f 45 52 52 4f 52 2e 20 4f 74 68 65 72  ITE_ERROR. Other
130b0 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e  wise, SQLITE_OK.
130c0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
130d0 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
130e0 46 4b 20 76 69 6f 6c 61 74 69 6f 6e 73 20 61 6e  FK violations an
130f0 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  d this function 
13100 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49  returns .** SQLI
13110 54 45 5f 45 52 52 4f 52 2c 20 73 65 74 20 74 68  TE_ERROR, set th
13120 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
13130 56 4d 20 74 6f 20 53 51 4c 49 54 45 5f 43 4f 4e  VM to SQLITE_CON
13140 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
13150 45 59 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  EY.** and write 
13160 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
13170 20 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 74   to it. Then ret
13180 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
13190 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
131a0 49 54 45 5f 4f 4d 49 54 5f 46 4f 52 45 49 47 4e  ITE_OMIT_FOREIGN
131b0 5f 4b 45 59 0a 69 6e 74 20 73 71 6c 69 74 65 33  _KEY.int sqlite3
131c0 56 64 62 65 43 68 65 63 6b 46 6b 28 56 64 62 65  VdbeCheckFk(Vdbe
131d0 20 2a 70 2c 20 69 6e 74 20 64 65 66 65 72 72 65   *p, int deferre
131e0 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  d){.  sqlite3 *d
131f0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
13200 20 28 64 65 66 65 72 72 65 64 20 26 26 20 28 64   (deferred && (d
13210 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
13220 2b 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d  +db->nDeferredIm
13230 6d 43 6f 6e 73 29 3e 30 29 20 0a 20 20 20 7c 7c  mCons)>0) .   ||
13240 20 28 21 64 65 66 65 72 72 65 64 20 26 26 20 70   (!deferred && p
13250 2d 3e 6e 46 6b 43 6f 6e 73 74 72 61 69 6e 74 3e  ->nFkConstraint>
13260 30 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 2d 3e  0) .  ){.    p->
13270 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53  rc = SQLITE_CONS
13280 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
13290 59 3b 0a 20 20 20 20 70 2d 3e 65 72 72 6f 72 41  Y;.    p->errorA
132a0 63 74 69 6f 6e 20 3d 20 4f 45 5f 41 62 6f 72 74  ction = OE_Abort
132b0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
132c0 65 45 72 72 6f 72 28 70 2c 20 22 46 4f 52 45 49  eError(p, "FOREI
132d0 47 4e 20 4b 45 59 20 63 6f 6e 73 74 72 61 69 6e  GN KEY constrain
132e0 74 20 66 61 69 6c 65 64 22 29 3b 0a 20 20 20 20  t failed");.    
132f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
13300 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
13310 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
13320 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
13330 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
13340 6c 65 64 20 74 68 65 20 77 68 65 6e 20 61 20 56  led the when a V
13350 44 42 45 20 74 72 69 65 73 20 74 6f 20 68 61 6c  DBE tries to hal
13360 74 2e 20 20 49 66 20 74 68 65 20 56 44 42 45 0a  t.  If the VDBE.
13370 2a 2a 20 68 61 73 20 6d 61 64 65 20 63 68 61 6e  ** has made chan
13380 67 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 75  ges and is in au
13390 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 2c 20 74  tocommit mode, t
133a0 68 65 6e 20 63 6f 6d 6d 69 74 20 74 68 6f 73 65  hen commit those
133b0 0a 2a 2a 20 63 68 61 6e 67 65 73 2e 20 20 49 66  .** changes.  If
133c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e   a rollback is n
133d0 65 65 64 65 64 2c 20 74 68 65 6e 20 64 6f 20 74  eeded, then do t
133e0 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  he rollback..**.
133f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13400 69 73 20 74 68 65 20 6f 6e 6c 79 20 77 61 79 20  is the only way 
13410 74 6f 20 6d 6f 76 65 20 74 68 65 20 73 74 61 74  to move the stat
13420 65 20 6f 66 20 61 20 56 4d 20 66 72 6f 6d 0a 2a  e of a VM from.*
13430 2a 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 52  * SQLITE_MAGIC_R
13440 55 4e 20 74 6f 20 53 51 4c 49 54 45 5f 4d 41 47  UN to SQLITE_MAG
13450 49 43 5f 48 41 4c 54 2e 20 20 49 74 20 69 73 20  IC_HALT.  It is 
13460 68 61 72 6d 6c 65 73 73 20 74 6f 0a 2a 2a 20 63  harmless to.** c
13470 61 6c 6c 20 74 68 69 73 20 6f 6e 20 61 20 56 4d  all this on a VM
13480 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
13490 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48 41 4c  SQLITE_MAGIC_HAL
134a0 54 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52  T state..**.** R
134b0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
134c0 6f 64 65 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ode.  If the com
134d0 6d 69 74 20 63 6f 75 6c 64 20 6e 6f 74 20 63 6f  mit could not co
134e0 6d 70 6c 65 74 65 20 62 65 63 61 75 73 65 20 6f  mplete because o
134f0 66 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e  f.** lock conten
13500 74 69 6f 6e 2c 20 72 65 74 75 72 6e 20 53 51 4c  tion, return SQL
13510 49 54 45 5f 42 55 53 59 2e 20 20 49 66 20 53 51  ITE_BUSY.  If SQ
13520 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74  LITE_BUSY is ret
13530 75 72 6e 65 64 2c 20 69 74 0a 2a 2a 20 6d 65 61  urned, it.** mea
13540 6e 73 20 74 68 65 20 63 6c 6f 73 65 20 64 69 64  ns the close did
13550 20 6e 6f 74 20 68 61 70 70 65 6e 20 61 6e 64 20   not happen and 
13560 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 70 65  needs to be repe
13570 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ated..*/.int sql
13580 69 74 65 33 56 64 62 65 48 61 6c 74 28 56 64 62  ite3VdbeHalt(Vdb
13590 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
135c0 20 74 6f 20 73 74 6f 72 65 20 74 72 61 6e 73 69   to store transi
135d0 65 6e 74 20 72 65 74 75 72 6e 20 63 6f 64 65 73  ent return codes
135e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
135f0 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a  b = p->db;..  /*
13600 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
13610 6f 6e 74 61 69 6e 73 20 74 68 65 20 6c 6f 67 69  ontains the logi
13620 63 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  c that determine
13630 73 20 69 66 20 61 20 73 74 61 74 65 6d 65 6e 74  s if a statement
13640 20 6f 72 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63   or.  ** transac
13650 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 63 6f 6d  tion will be com
13660 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64  mitted or rolled
13670 20 62 61 63 6b 20 61 73 20 61 20 72 65 73 75 6c   back as a resul
13680 74 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 65 78  t of the.  ** ex
13690 65 63 75 74 69 6f 6e 20 6f 66 20 74 68 69 73 20  ecution of this 
136a0 76 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 2e  virtual machine.
136b0 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 61   .  **.  ** If a
136c0 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
136d0 69 6e 67 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ing errors occur
136e0 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
136f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a  SQLITE_NOMEM.  *
13700 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45  *     SQLITE_IOE
13710 52 52 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  RR.  **     SQLI
13720 54 45 5f 46 55 4c 4c 0a 20 20 2a 2a 20 20 20 20  TE_FULL.  **    
13730 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
13740 54 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e  T.  **.  ** Then
13750 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 63 61   the internal ca
13760 63 68 65 20 6d 69 67 68 74 20 68 61 76 65 20 62  che might have b
13770 65 65 6e 20 6c 65 66 74 20 69 6e 20 61 6e 20 69  een left in an i
13780 6e 63 6f 6e 73 69 73 74 65 6e 74 0a 20 20 2a 2a  nconsistent.  **
13790 20 73 74 61 74 65 2e 20 20 57 65 20 6e 65 65 64   state.  We need
137a0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
137b0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
137c0 61 63 74 69 6f 6e 2c 20 69 66 20 74 68 65 72 65  action, if there
137d0 20 69 73 0a 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72   is.  ** one, or
137e0 20 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 74 72   the complete tr
137f0 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
13800 72 65 20 69 73 20 6e 6f 20 73 74 61 74 65 6d 65  re is no stateme
13810 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
13820 20 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20    */..  assert( 
13830 70 2d 3e 61 4f 6e 63 65 46 6c 61 67 21 3d 30 20  p->aOnceFlag!=0 
13840 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
13850 6c 65 64 20 29 3b 0a 20 20 69 66 28 20 64 62 2d  led );.  if( db-
13860 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
13870 0a 20 20 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c  .    p->rc = SQL
13880 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a  ITE_NOMEM_BKPT;.
13890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
138a0 73 65 74 28 70 2d 3e 61 4f 6e 63 65 46 6c 61 67  set(p->aOnceFlag
138b0 2c 20 30 2c 20 70 2d 3e 6e 4f 6e 63 65 46 6c 61  , 0, p->nOnceFla
138c0 67 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65 41  g);.  }.  closeA
138d0 6c 6c 43 75 72 73 6f 72 73 28 70 29 3b 0a 20 20  llCursors(p);.  
138e0 69 66 28 20 70 2d 3e 6d 61 67 69 63 21 3d 56 44  if( p->magic!=VD
138f0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 29 7b 0a  BE_MAGIC_RUN ){.
13900 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
13910 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 63 68 65 63  E_OK;.  }.  chec
13920 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
13930 62 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20 63 6f 6d  b);..  /* No com
13940 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b 20  mit or rollback 
13950 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 70 72  needed if the pr
13960 6f 67 72 61 6d 20 6e 65 76 65 72 20 73 74 61 72  ogram never star
13970 74 65 64 20 6f 72 20 69 66 20 74 68 65 0a 20 20  ted or if the.  
13980 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
13990 20 64 6f 65 73 20 6e 6f 74 20 72 65 61 64 20 6f   does not read o
139a0 72 20 77 72 69 74 65 20 61 20 64 61 74 61 62 61  r write a databa
139b0 73 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 69  se file.  */.  i
139c0 66 28 20 70 2d 3e 70 63 3e 3d 30 20 26 26 20 70  f( p->pc>=0 && p
139d0 2d 3e 62 49 73 52 65 61 64 65 72 20 29 7b 0a 20  ->bIsReader ){. 
139e0 20 20 20 69 6e 74 20 6d 72 63 3b 20 20 20 2f 2a     int mrc;   /*
139f0 20 50 72 69 6d 61 72 79 20 65 72 72 6f 72 20 63   Primary error c
13a00 6f 64 65 20 66 72 6f 6d 20 70 2d 3e 72 63 20 2a  ode from p->rc *
13a10 2f 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65  /.    int eState
13a20 6d 65 6e 74 4f 70 20 3d 20 30 3b 0a 20 20 20 20  mentOp = 0;.    
13a30 69 6e 74 20 69 73 53 70 65 63 69 61 6c 45 72 72  int isSpecialErr
13a40 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  or;            /
13a50 2a 20 53 65 74 20 74 6f 20 74 72 75 65 20 69 66  * Set to true if
13a60 20 61 20 27 73 70 65 63 69 61 6c 27 20 65 72 72   a 'special' err
13a70 6f 72 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4c 6f  or */..    /* Lo
13a80 63 6b 20 61 6c 6c 20 62 74 72 65 65 73 20 75 73  ck all btrees us
13a90 65 64 20 62 79 20 74 68 65 20 73 74 61 74 65 6d  ed by the statem
13aa0 65 6e 74 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ent */.    sqlit
13ab0 65 33 56 64 62 65 45 6e 74 65 72 28 70 29 3b 0a  e3VdbeEnter(p);.
13ac0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13ad0 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65  r one of the spe
13ae0 63 69 61 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20  cial errors */. 
13af0 20 20 20 6d 72 63 20 3d 20 70 2d 3e 72 63 20 26     mrc = p->rc &
13b00 20 30 78 66 66 3b 0a 20 20 20 20 69 73 53 70 65   0xff;.    isSpe
13b10 63 69 61 6c 45 72 72 6f 72 20 3d 20 6d 72 63 3d  cialError = mrc=
13b20 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c 7c  =SQLITE_NOMEM ||
13b30 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   mrc==SQLITE_IOE
13b40 52 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR.             
13b50 20 20 20 20 20 20 20 20 7c 7c 20 6d 72 63 3d 3d          || mrc==
13b60 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
13b70 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f   || mrc==SQLITE_
13b80 46 55 4c 4c 3b 0a 20 20 20 20 69 66 28 20 69 73  FULL;.    if( is
13b90 53 70 65 63 69 61 6c 45 72 72 6f 72 20 29 7b 0a  SpecialError ){.
13ba0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
13bb0 71 75 65 72 79 20 77 61 73 20 72 65 61 64 2d 6f  query was read-o
13bc0 6e 6c 79 20 61 6e 64 20 74 68 65 20 65 72 72 6f  nly and the erro
13bd0 72 20 63 6f 64 65 20 69 73 20 53 51 4c 49 54 45  r code is SQLITE
13be0 5f 49 4e 54 45 52 52 55 50 54 2c 20 0a 20 20 20  _INTERRUPT, .   
13bf0 20 20 20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63     ** no rollbac
13c00 6b 20 69 73 20 6e 65 63 65 73 73 61 72 79 2e 20  k is necessary. 
13c10 4f 74 68 65 72 77 69 73 65 2c 20 61 74 20 6c 65  Otherwise, at le
13c20 61 73 74 20 61 20 73 61 76 65 70 6f 69 6e 74 20  ast a savepoint 
13c30 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  .      ** transa
13c40 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 72 6f  ction must be ro
13c50 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 72 65 73  lled back to res
13c60 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
13c70 65 20 74 6f 20 61 20 0a 20 20 20 20 20 20 2a 2a  e to a .      **
13c80 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61 74   consistent stat
13c90 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
13ca0 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 74 68 65    ** Even if the
13cb0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65   statement is re
13cc0 61 64 2d 6f 6e 6c 79 2c 20 69 74 20 69 73 20 69  ad-only, it is i
13cd0 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 65 72 66  mportant to perf
13ce0 6f 72 6d 0a 20 20 20 20 20 20 2a 2a 20 61 20 73  orm.      ** a s
13cf0 74 61 74 65 6d 65 6e 74 20 6f 72 20 74 72 61 6e  tatement or tran
13d00 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61 63 6b  saction rollback
13d10 20 6f 70 65 72 61 74 69 6f 6e 2e 20 49 66 20 74   operation. If t
13d20 68 65 20 65 72 72 6f 72 20 0a 20 20 20 20 20 20  he error .      
13d30 2a 2a 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  ** occurred whil
13d40 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
13d50 20 6a 6f 75 72 6e 61 6c 2c 20 73 75 62 2d 6a 6f   journal, sub-jo
13d60 75 72 6e 61 6c 20 6f 72 20 64 61 74 61 62 61 73  urnal or databas
13d70 65 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20  e.      ** file 
13d80 61 73 20 70 61 72 74 20 6f 66 20 61 6e 20 65 66  as part of an ef
13d90 66 6f 72 74 20 74 6f 20 66 72 65 65 20 75 70 20  fort to free up 
13da0 63 61 63 68 65 20 73 70 61 63 65 20 28 73 65 65  cache space (see
13db0 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20   function.      
13dc0 2a 2a 20 70 61 67 65 72 53 74 72 65 73 73 28 29  ** pagerStress()
13dd0 20 69 6e 20 70 61 67 65 72 2e 63 29 2c 20 74 68   in pager.c), th
13de0 65 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 72 65  e rollback is re
13df0 71 75 69 72 65 64 20 74 6f 20 72 65 73 74 6f 72  quired to restor
13e00 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  e .      ** the 
13e10 70 61 67 65 72 20 74 6f 20 61 20 63 6f 6e 73 69  pager to a consi
13e20 73 74 65 6e 74 20 73 74 61 74 65 2e 0a 20 20 20  stent state..   
13e30 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
13e40 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 7c 7c 20  !p->readOnly || 
13e50 6d 72 63 21 3d 53 51 4c 49 54 45 5f 49 4e 54 45  mrc!=SQLITE_INTE
13e60 52 52 55 50 54 20 29 7b 0a 20 20 20 20 20 20 20  RRUPT ){.       
13e70 20 69 66 28 20 28 6d 72 63 3d 3d 53 51 4c 49 54   if( (mrc==SQLIT
13e80 45 5f 4e 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d  E_NOMEM || mrc==
13e90 53 51 4c 49 54 45 5f 46 55 4c 4c 29 20 26 26 20  SQLITE_FULL) && 
13ea0 70 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e  p->usesStmtJourn
13eb0 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  al ){.          
13ec0 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53  eStatementOp = S
13ed0 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
13ee0 4b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  K;.        }else
13ef0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
13f00 65 20 61 72 65 20 66 6f 72 63 65 64 20 74 6f 20  e are forced to 
13f10 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 20 61 63  roll back the ac
13f20 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
13f30 2e 20 42 65 66 6f 72 65 20 64 6f 69 6e 67 0a 20  . Before doing. 
13f40 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20           ** so, 
13f50 61 62 6f 72 74 20 61 6e 79 20 6f 74 68 65 72 20  abort any other 
13f60 73 74 61 74 65 6d 65 6e 74 73 20 74 68 69 73 20  statements this 
13f70 68 61 6e 64 6c 65 20 63 75 72 72 65 6e 74 6c 79  handle currently
13f80 20 68 61 73 20 61 63 74 69 76 65 2e 0a 20 20 20   has active..   
13f90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
13fa0 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62      sqlite3Rollb
13fb0 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54  ackAll(db, SQLIT
13fc0 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
13fd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
13fe0 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
13ff0 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20  nts(db);.       
14000 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69     db->autoCommi
14010 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
14020 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b   p->nChange = 0;
14030 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
14040 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
14050 20 43 68 65 63 6b 20 66 6f 72 20 69 6d 6d 65 64   Check for immed
14060 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
14070 20 76 69 6f 6c 61 74 69 6f 6e 73 2e 20 2a 2f 0a   violations. */.
14080 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53      if( p->rc==S
14090 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
140a0 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 65    sqlite3VdbeChe
140b0 63 6b 46 6b 28 70 2c 20 30 29 3b 0a 20 20 20 20  ckFk(p, 0);.    
140c0 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
140d0 68 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66  he auto-commit f
140e0 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
140f0 68 69 73 20 69 73 20 74 68 65 20 6f 6e 6c 79 20  his is the only 
14100 61 63 74 69 76 65 20 77 72 69 74 65 72 20 0a 20  active writer . 
14110 20 20 20 2a 2a 20 56 4d 2c 20 74 68 65 6e 20 77     ** VM, then w
14120 65 20 64 6f 20 65 69 74 68 65 72 20 61 20 63 6f  e do either a co
14130 6d 6d 69 74 20 6f 72 20 72 6f 6c 6c 62 61 63 6b  mmit or rollback
14140 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
14150 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 0a 20 20  transaction. .  
14160 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4e 6f 74 65    **.    ** Note
14170 3a 20 54 68 69 73 20 62 6c 6f 63 6b 20 61 6c 73  : This block als
14180 6f 20 72 75 6e 73 20 69 66 20 6f 6e 65 20 6f 66  o runs if one of
14190 20 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72   the special err
141a0 6f 72 73 20 68 61 6e 64 6c 65 64 20 0a 20 20 20  ors handled .   
141b0 20 2a 2a 20 61 62 6f 76 65 20 68 61 73 20 6f 63   ** above has oc
141c0 63 75 72 72 65 64 2e 20 0a 20 20 20 20 2a 2f 0a  curred. .    */.
141d0 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
141e0 56 74 61 62 49 6e 53 79 6e 63 28 64 62 29 20 0a  VtabInSync(db) .
141f0 20 20 20 20 20 26 26 20 64 62 2d 3e 61 75 74 6f       && db->auto
14200 43 6f 6d 6d 69 74 20 0a 20 20 20 20 20 26 26 20  Commit .     && 
14210 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65 3d 3d  db->nVdbeWrite==
14220 28 70 2d 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 29  (p->readOnly==0)
14230 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69   .    ){.      i
14240 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  f( p->rc==SQLITE
14250 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 65 72 72 6f 72  _OK || (p->error
14260 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69 6c 20  Action==OE_Fail 
14270 26 26 20 21 69 73 53 70 65 63 69 61 6c 45 72 72  && !isSpecialErr
14280 6f 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  or) ){.        r
14290 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  c = sqlite3VdbeC
142a0 68 65 63 6b 46 6b 28 70 2c 20 31 29 3b 0a 20 20  heckFk(p, 1);.  
142b0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
142c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
142d0 20 20 20 20 20 69 66 28 20 4e 45 56 45 52 28 70       if( NEVER(p
142e0 2d 3e 72 65 61 64 4f 6e 6c 79 29 20 29 7b 0a 20  ->readOnly) ){. 
142f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
14300 65 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a  e3VdbeLeave(p);.
14310 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
14320 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
14330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14340 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14350 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
14360 52 45 49 47 4e 4b 45 59 3b 0a 20 20 20 20 20 20  REIGNKEY;.      
14370 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 20 20    }else{ .      
14380 20 20 20 20 2f 2a 20 54 68 65 20 61 75 74 6f 2d      /* The auto-
14390 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 74  commit flag is t
143a0 72 75 65 2c 20 74 68 65 20 76 64 62 65 20 70 72  rue, the vdbe pr
143b0 6f 67 72 61 6d 20 77 61 73 20 73 75 63 63 65 73  ogram was succes
143c0 73 66 75 6c 20 0a 20 20 20 20 20 20 20 20 20 20  sful .          
143d0 2a 2a 20 6f 72 20 68 69 74 20 61 6e 20 27 4f 52  ** or hit an 'OR
143e0 20 46 41 49 4c 27 20 63 6f 6e 73 74 72 61 69 6e   FAIL' constrain
143f0 74 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  t and there are 
14400 6e 6f 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  no deferred fore
14410 69 67 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ign.          **
14420 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
14430 20 74 6f 20 68 6f 6c 64 20 75 70 20 74 68 65 20   to hold up the 
14440 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 54 68 69  transaction. Thi
14450 73 20 6d 65 61 6e 73 20 61 20 63 6f 6d 6d 69 74  s means a commit
14460 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
14470 73 20 72 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20  s required. */. 
14480 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 76 64           rc = vd
14490 62 65 43 6f 6d 6d 69 74 28 64 62 2c 20 70 29 3b  beCommit(db, p);
144a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
144b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
144c0 45 5f 42 55 53 59 20 26 26 20 70 2d 3e 72 65 61  E_BUSY && p->rea
144d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
144e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65     sqlite3VdbeLe
144f0 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ave(p);.        
14500 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14510 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 7d 65  BUSY;.        }e
14520 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49  lse if( rc!=SQLI
14530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
14540 20 20 20 70 2d 3e 72 63 20 3d 20 72 63 3b 0a 20     p->rc = rc;. 
14550 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
14560 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
14570 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20  SQLITE_OK);.    
14580 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67 65        p->nChange
14590 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
145a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 64  lse{.          d
145b0 62 2d 3e 6e 44 65 66 65 72 72 65 64 43 6f 6e 73  b->nDeferredCons
145c0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
145d0 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
145e0 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  Cons = 0;.      
145f0 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
14600 20 7e 53 51 4c 49 54 45 5f 44 65 66 65 72 46 4b   ~SQLITE_DeferFK
14610 73 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  s;.          sql
14620 69 74 65 33 43 6f 6d 6d 69 74 49 6e 74 65 72 6e  ite3CommitIntern
14630 61 6c 43 68 61 6e 67 65 73 28 64 62 29 3b 0a 20  alChanges(db);. 
14640 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14650 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
14660 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c  lite3RollbackAll
14670 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b  (db, SQLITE_OK);
14680 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
14690 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
146a0 0a 20 20 20 20 20 20 64 62 2d 3e 6e 53 74 61 74  .      db->nStat
146b0 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  ement = 0;.    }
146c0 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65 6d  else if( eStatem
146d0 65 6e 74 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  entOp==0 ){.    
146e0 20 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c    if( p->rc==SQL
146f0 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 65 72 72  ITE_OK || p->err
14700 6f 72 41 63 74 69 6f 6e 3d 3d 4f 45 5f 46 61 69  orAction==OE_Fai
14710 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 65 53 74  l ){.        eSt
14720 61 74 65 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45  atementOp = SAVE
14730 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 3b 0a 20  POINT_RELEASE;. 
14740 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
14750 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
14760 45 5f 41 62 6f 72 74 20 29 7b 0a 20 20 20 20 20  E_Abort ){.     
14770 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20     eStatementOp 
14780 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c  = SAVEPOINT_ROLL
14790 42 41 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  BACK;.      }els
147a0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
147b0 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
147c0 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
147d0 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
147e0 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
147f0 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 20 20  vepoints(db);.  
14800 20 20 20 20 20 20 64 62 2d 3e 61 75 74 6f 43 6f        db->autoCo
14810 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  mmit = 1;.      
14820 20 20 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30    p->nChange = 0
14830 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14840 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 65 53 74    .    /* If eSt
14850 61 74 65 6d 65 6e 74 4f 70 20 69 73 20 6e 6f 6e  atementOp is non
14860 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 20 73 74  -zero, then a st
14870 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14880 69 6f 6e 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  ion needs to.   
14890 20 2a 2a 20 62 65 20 63 6f 6d 6d 69 74 74 65 64   ** be committed
148a0 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   or rolled back.
148b0 20 43 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   Call sqlite3Vdb
148c0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
148d0 29 20 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 20 73  ) to.    ** do s
148e0 6f 2e 20 49 66 20 74 68 69 73 20 6f 70 65 72 61  o. If this opera
148f0 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 6e 20  tion returns an 
14900 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 65 20 63  error, and the c
14910 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  urrent statement
14920 0a 20 20 20 20 2a 2a 20 65 72 72 6f 72 20 63 6f  .    ** error co
14930 64 65 20 69 73 20 53 51 4c 49 54 45 5f 4f 4b 20  de is SQLITE_OK 
14940 6f 72 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  or SQLITE_CONSTR
14950 41 49 4e 54 2c 20 74 68 65 6e 20 70 72 6f 6d 6f  AINT, then promo
14960 74 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 75  te the.    ** cu
14970 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 20  rrent statement 
14980 65 72 72 6f 72 20 63 6f 64 65 2e 0a 20 20 20 20  error code..    
14990 2a 2f 0a 20 20 20 20 69 66 28 20 65 53 74 61 74  */.    if( eStat
149a0 65 6d 65 6e 74 4f 70 20 29 7b 0a 20 20 20 20 20  ementOp ){.     
149b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
149c0 65 43 6c 6f 73 65 53 74 61 74 65 6d 65 6e 74 28  eCloseStatement(
149d0 70 2c 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 29  p, eStatementOp)
149e0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
149f0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  {.        if( p-
14a00 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  >rc==SQLITE_OK |
14a10 7c 20 28 70 2d 3e 72 63 26 30 78 66 66 29 3d 3d  | (p->rc&0xff)==
14a20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
14a30 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  T ){.          p
14a40 2d 3e 72 63 20 3d 20 72 63 3b 0a 20 20 20 20 20  ->rc = rc;.     
14a50 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
14a60 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73  ee(db, p->zErrMs
14a70 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  g);.          p-
14a80 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
14a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
14aa0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
14ab0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 41 42  ll(db, SQLITE_AB
14ac0 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20  ORT_ROLLBACK);. 
14ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6c         sqlite3Cl
14ae0 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
14af0 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d 3e 61  );.        db->a
14b00 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
14b10 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67         p->nChang
14b20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 0;.      }. 
14b30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49     }.  .    /* I
14b40 66 20 74 68 69 73 20 77 61 73 20 61 6e 20 49 4e  f this was an IN
14b50 53 45 52 54 2c 20 55 50 44 41 54 45 20 6f 72 20  SERT, UPDATE or 
14b60 44 45 4c 45 54 45 20 61 6e 64 20 6e 6f 20 73 74  DELETE and no st
14b70 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
14b80 69 6f 6e 0a 20 20 20 20 2a 2a 20 68 61 73 20 62  ion.    ** has b
14b90 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c  een rolled back,
14ba0 20 75 70 64 61 74 65 20 74 68 65 20 64 61 74 61   update the data
14bb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
14bc0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20  change-counter. 
14bd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14be0 70 2d 3e 63 68 61 6e 67 65 43 6e 74 4f 6e 20 29  p->changeCntOn )
14bf0 7b 0a 20 20 20 20 20 20 69 66 28 20 65 53 74 61  {.      if( eSta
14c00 74 65 6d 65 6e 74 4f 70 21 3d 53 41 56 45 50 4f  tementOp!=SAVEPO
14c10 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 7b 0a  INT_ROLLBACK ){.
14c20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
14c30 64 62 65 53 65 74 43 68 61 6e 67 65 73 28 64 62  dbeSetChanges(db
14c40 2c 20 70 2d 3e 6e 43 68 61 6e 67 65 29 3b 0a 20  , p->nChange);. 
14c50 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14c60 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
14c70 65 74 43 68 61 6e 67 65 73 28 64 62 2c 20 30 29  etChanges(db, 0)
14c80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
14c90 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
14ca0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
14cb0 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 73 20  lease the locks 
14cc0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  */.    sqlite3Vd
14cd0 62 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  beLeave(p);.  }.
14ce0 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 73 75  .  /* We have su
14cf0 63 63 65 73 73 66 75 6c 6c 79 20 68 61 6c 74 65  ccessfully halte
14d00 64 20 61 6e 64 20 63 6c 6f 73 65 64 20 74 68 65  d and closed the
14d10 20 56 4d 2e 20 20 52 65 63 6f 72 64 20 74 68 69   VM.  Record thi
14d20 73 20 66 61 63 74 2e 20 2a 2f 0a 20 20 69 66 28  s fact. */.  if(
14d30 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
14d40 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14d50 2d 2d 3b 0a 20 20 20 20 69 66 28 20 21 70 2d 3e  --;.    if( !p->
14d60 72 65 61 64 4f 6e 6c 79 20 29 20 64 62 2d 3e 6e  readOnly ) db->n
14d70 56 64 62 65 57 72 69 74 65 2d 2d 3b 0a 20 20 20  VdbeWrite--;.   
14d80 20 69 66 28 20 70 2d 3e 62 49 73 52 65 61 64 65   if( p->bIsReade
14d90 72 20 29 20 64 62 2d 3e 6e 56 64 62 65 52 65 61  r ) db->nVdbeRea
14da0 64 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  d--;.    assert(
14db0 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14dc0 3e 3d 64 62 2d 3e 6e 56 64 62 65 52 65 61 64 20  >=db->nVdbeRead 
14dd0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  );.    assert( d
14de0 62 2d 3e 6e 56 64 62 65 52 65 61 64 3e 3d 64 62  b->nVdbeRead>=db
14df0 2d 3e 6e 56 64 62 65 57 72 69 74 65 20 29 3b 0a  ->nVdbeWrite );.
14e00 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e      assert( db->
14e10 6e 56 64 62 65 57 72 69 74 65 3e 3d 30 20 29 3b  nVdbeWrite>=0 );
14e20 0a 20 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20  .  }.  p->magic 
14e30 3d 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c  = VDBE_MAGIC_HAL
14e40 54 3b 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65  T;.  checkActive
14e50 56 64 62 65 43 6e 74 28 64 62 29 3b 0a 20 20 69  VdbeCnt(db);.  i
14e60 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
14e70 6c 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63  led ){.    p->rc
14e80 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
14e90 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
14ea0 49 66 20 74 68 65 20 61 75 74 6f 2d 63 6f 6d 6d  If the auto-comm
14eb0 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  it flag is set t
14ec0 6f 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e 79  o true, then any
14ed0 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 65 72 65   locks that were
14ee0 20 68 65 6c 64 0a 20 20 2a 2a 20 62 79 20 63 6f   held.  ** by co
14ef0 6e 6e 65 63 74 69 6f 6e 20 64 62 20 68 61 76 65  nnection db have
14f00 20 6e 6f 77 20 62 65 65 6e 20 72 65 6c 65 61 73   now been releas
14f10 65 64 2e 20 43 61 6c 6c 20 73 71 6c 69 74 65 33  ed. Call sqlite3
14f20 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c 6f 63 6b  ConnectionUnlock
14f30 65 64 28 29 20 0a 20 20 2a 2a 20 74 6f 20 69 6e  ed() .  ** to in
14f40 76 6f 6b 65 20 61 6e 79 20 72 65 71 75 69 72 65  voke any require
14f50 64 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  d unlock-notify 
14f60 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
14f70 20 20 69 66 28 20 64 62 2d 3e 61 75 74 6f 43 6f    if( db->autoCo
14f80 6d 6d 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  mmit ){.    sqli
14f90 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 55 6e 6c  te3ConnectionUnl
14fa0 6f 63 6b 65 64 28 64 62 29 3b 0a 20 20 7d 0a 0a  ocked(db);.  }..
14fb0 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56    assert( db->nV
14fc0 64 62 65 41 63 74 69 76 65 3e 30 20 7c 7c 20 64  dbeActive>0 || d
14fd0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3d 3d 30  b->autoCommit==0
14fe0 20 7c 7c 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65   || db->nStateme
14ff0 6e 74 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  nt==0 );.  retur
15000 6e 20 28 70 2d 3e 72 63 3d 3d 53 51 4c 49 54 45  n (p->rc==SQLITE
15010 5f 42 55 53 59 20 3f 20 53 51 4c 49 54 45 5f 42  _BUSY ? SQLITE_B
15020 55 53 59 20 3a 20 53 51 4c 49 54 45 5f 4f 4b 29  USY : SQLITE_OK)
15030 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 61 63 68  ;.}.../*.** Each
15040 20 56 44 42 45 20 68 6f 6c 64 73 20 74 68 65 20   VDBE holds the 
15050 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 6d 6f  result of the mo
15060 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
15070 33 5f 73 74 65 70 28 29 20 63 61 6c 6c 0a 2a 2a  3_step() call.**
15080 20 69 6e 20 70 2d 3e 72 63 2e 20 20 54 68 69 73   in p->rc.  This
15090 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
150a0 61 74 20 72 65 73 75 6c 74 20 62 61 63 6b 20 74  at result back t
150b0 6f 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  o SQLITE_OK..*/.
150c0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
150d0 52 65 73 65 74 53 74 65 70 52 65 73 75 6c 74 28  ResetStepResult(
150e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 72  Vdbe *p){.  p->r
150f0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  c = SQLITE_OK;.}
15100 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  ../*.** Copy the
15110 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
15120 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 62 65  error message be
15130 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 56  longing to the V
15140 44 42 45 20 70 61 73 73 65 64 0a 2a 2a 20 61 73  DBE passed.** as
15150 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
15160 65 6e 74 20 74 6f 20 69 74 73 20 64 61 74 61 62  ent to its datab
15170 61 73 65 20 68 61 6e 64 6c 65 20 28 73 6f 20 74  ase handle (so t
15180 68 61 74 20 74 68 65 79 20 77 69 6c 6c 20 62 65  hat they will be
15190 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 62 79   .** returned by
151a0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
151b0 33 5f 65 72 72 63 6f 64 65 28 29 20 61 6e 64 20  3_errcode() and 
151c0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29  sqlite3_errmsg()
151d0 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  )..**.** This fu
151e0 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20  nction does not 
151f0 63 6c 65 61 72 20 74 68 65 20 56 44 42 45 20 65  clear the VDBE e
15200 72 72 6f 72 20 63 6f 64 65 20 6f 72 20 6d 65 73  rror code or mes
15210 73 61 67 65 2c 20 6a 75 73 74 0a 2a 2a 20 63 6f  sage, just.** co
15220 70 69 65 73 20 74 68 65 6d 20 74 6f 20 74 68 65  pies them to the
15230 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15240 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15250 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72 6f  VdbeTransferErro
15260 72 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 73 71  r(Vdbe *p){.  sq
15270 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e 64  lite3 *db = p->d
15280 62 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 2d  b;.  int rc = p-
15290 3e 72 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 45  >rc;.  if( p->zE
152a0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 64 62 2d  rrMsg ){.    db-
152b0 3e 62 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2b 2b  >bBenignMalloc++
152c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67  ;.    sqlite3Beg
152d0 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
152e0 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 70 45  ;.    if( db->pE
152f0 72 72 3d 3d 30 20 29 20 64 62 2d 3e 70 45 72 72  rr==0 ) db->pErr
15300 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
15310 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
15320 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
15330 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 70 2d 3e  b->pErr, -1, p->
15340 7a 45 72 72 4d 73 67 2c 20 53 51 4c 49 54 45 5f  zErrMsg, SQLITE_
15350 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 54 52 41  UTF8, SQLITE_TRA
15360 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c  NSIENT);.    sql
15370 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
15380 6c 6f 63 28 29 3b 0a 20 20 20 20 64 62 2d 3e 62  loc();.    db->b
15390 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 2d 2d 3b 0a  BenignMalloc--;.
153a0 20 20 20 20 64 62 2d 3e 65 72 72 43 6f 64 65 20      db->errCode 
153b0 3d 20 72 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = rc;.  }else{. 
153c0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
153d0 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
153e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
153f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15400 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a 20 49  E_SQLLOG./*.** I
15410 66 20 61 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46  f an SQLITE_CONF
15420 49 47 5f 53 51 4c 4c 4f 47 20 68 6f 6f 6b 20 69  IG_SQLLOG hook i
15430 73 20 72 65 67 69 73 74 65 72 65 64 20 61 6e 64  s registered and
15440 20 74 68 65 20 56 4d 20 68 61 73 20 62 65 65 6e   the VM has been
15450 20 72 75 6e 2c 20 0a 2a 2a 20 69 6e 76 6f 6b 65   run, .** invoke
15460 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76   it..*/.static v
15470 6f 69 64 20 76 64 62 65 49 6e 76 6f 6b 65 53 71  oid vdbeInvokeSq
15480 6c 6c 6f 67 28 56 64 62 65 20 2a 76 29 7b 0a 20  llog(Vdbe *v){. 
15490 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
154a0 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
154b0 20 26 26 20 76 2d 3e 72 63 3d 3d 53 51 4c 49 54   && v->rc==SQLIT
154c0 45 5f 4f 4b 20 26 26 20 76 2d 3e 7a 53 71 6c 20  E_OK && v->zSql 
154d0 26 26 20 76 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20  && v->pc>=0 ){. 
154e0 20 20 20 63 68 61 72 20 2a 7a 45 78 70 61 6e 64     char *zExpand
154f0 65 64 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ed = sqlite3Vdbe
15500 45 78 70 61 6e 64 53 71 6c 28 76 2c 20 76 2d 3e  ExpandSql(v, v->
15510 7a 53 71 6c 29 3b 0a 20 20 20 20 61 73 73 65 72  zSql);.    asser
15520 74 28 20 76 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  t( v->db->init.b
15530 75 73 79 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  usy==0 );.    if
15540 28 20 7a 45 78 70 61 6e 64 65 64 20 29 7b 0a 20  ( zExpanded ){. 
15550 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
15560 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
15570 28 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  (.          sqli
15580 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15590 70 53 71 6c 6c 6f 67 41 72 67 2c 20 76 2d 3e 64  pSqllogArg, v->d
155a0 62 2c 20 7a 45 78 70 61 6e 64 65 64 2c 20 31 0a  b, zExpanded, 1.
155b0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 73        );.      s
155c0 71 6c 69 74 65 33 44 62 46 72 65 65 28 76 2d 3e  qlite3DbFree(v->
155d0 64 62 2c 20 7a 45 78 70 61 6e 64 65 64 29 3b 0a  db, zExpanded);.
155e0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
155f0 65 0a 23 20 64 65 66 69 6e 65 20 76 64 62 65 49  e.# define vdbeI
15600 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 78 29 0a 23  nvokeSqllog(x).#
15610 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  endif../*.** Cle
15620 61 6e 20 75 70 20 61 20 56 44 42 45 20 61 66 74  an up a VDBE aft
15630 65 72 20 65 78 65 63 75 74 69 6f 6e 20 62 75 74  er execution but
15640 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74   do not delete t
15650 68 65 20 56 44 42 45 20 6a 75 73 74 20 79 65 74  he VDBE just yet
15660 2e 0a 2a 2a 20 57 72 69 74 65 20 61 6e 79 20 65  ..** Write any e
15670 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 69 6e  rror messages in
15680 74 6f 20 2a 70 7a 45 72 72 4d 73 67 2e 20 20 52  to *pzErrMsg.  R
15690 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
156a0 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 66 74   code..**.** Aft
156b0 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  er this routine 
156c0 69 73 20 72 75 6e 2c 20 74 68 65 20 56 44 42 45  is run, the VDBE
156d0 20 73 68 6f 75 6c 64 20 62 65 20 72 65 61 64 79   should be ready
156e0 20 74 6f 20 62 65 20 65 78 65 63 75 74 65 64 0a   to be executed.
156f0 2a 2a 20 61 67 61 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ** again..**.** 
15700 54 6f 20 6c 6f 6f 6b 20 61 74 20 69 74 20 61 6e  To look at it an
15710 6f 74 68 65 72 20 77 61 79 2c 20 74 68 69 73 20  other way, this 
15720 72 6f 75 74 69 6e 65 20 72 65 73 65 74 73 20 74  routine resets t
15730 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 0a  he state of the.
15740 2a 2a 20 76 69 72 74 75 61 6c 20 6d 61 63 68 69  ** virtual machi
15750 6e 65 20 66 72 6f 6d 20 56 44 42 45 5f 4d 41 47  ne from VDBE_MAG
15760 49 43 5f 52 55 4e 20 6f 72 20 56 44 42 45 5f 4d  IC_RUN or VDBE_M
15770 41 47 49 43 5f 48 41 4c 54 20 62 61 63 6b 20 74  AGIC_HALT back t
15780 6f 0a 2a 2a 20 56 44 42 45 5f 4d 41 47 49 43 5f  o.** VDBE_MAGIC_
15790 49 4e 49 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  INIT..*/.int sql
157a0 69 74 65 33 56 64 62 65 52 65 73 65 74 28 56 64  ite3VdbeReset(Vd
157b0 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
157c0 33 20 2a 64 62 3b 0a 20 20 64 62 20 3d 20 70 2d  3 *db;.  db = p-
157d0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  >db;..  /* If th
157e0 65 20 56 4d 20 64 69 64 20 6e 6f 74 20 72 75 6e  e VM did not run
157f0 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 6f   to completion o
15800 72 20 69 66 20 69 74 20 65 6e 63 6f 75 6e 74 65  r if it encounte
15810 72 65 64 20 61 6e 0a 20 20 2a 2a 20 65 72 72 6f  red an.  ** erro
15820 72 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74  r, then it might
15830 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 68   not have been h
15840 61 6c 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 20  alted properly. 
15850 20 53 6f 20 68 61 6c 74 0a 20 20 2a 2a 20 69 74   So halt.  ** it
15860 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c   now..  */.  sql
15870 69 74 65 33 56 64 62 65 48 61 6c 74 28 70 29 3b  ite3VdbeHalt(p);
15880 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 56 44  ..  /* If the VD
15890 42 45 20 68 61 73 20 62 65 20 72 75 6e 20 65 76  BE has be run ev
158a0 65 6e 20 70 61 72 74 69 61 6c 6c 79 2c 20 74 68  en partially, th
158b0 65 6e 20 74 72 61 6e 73 66 65 72 20 74 68 65 20  en transfer the 
158c0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
158d0 61 6e 64 20 65 72 72 6f 72 20 6d 65 73 73 61 67  and error messag
158e0 65 20 66 72 6f 6d 20 74 68 65 20 56 44 42 45 20  e from the VDBE 
158f0 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 64 61  into the main da
15900 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72 65  tabase structure
15910 2e 20 20 42 75 74 0a 20 20 2a 2a 20 69 66 20 74  .  But.  ** if t
15920 68 65 20 56 44 42 45 20 68 61 73 20 6a 75 73 74  he VDBE has just
15930 20 62 65 65 6e 20 73 65 74 20 74 6f 20 72 75 6e   been set to run
15940 20 62 75 74 20 68 61 73 20 6e 6f 74 20 61 63 74   but has not act
15950 75 61 6c 6c 79 20 65 78 65 63 75 74 65 64 20 61  ually executed a
15960 6e 79 0a 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  ny.  ** instruct
15970 69 6f 6e 73 20 79 65 74 2c 20 6c 65 61 76 65 20  ions yet, leave 
15980 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
15990 65 20 65 72 72 6f 72 20 69 6e 66 6f 72 6d 61 74  e error informat
159a0 69 6f 6e 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20  ion unchanged.. 
159b0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
159c0 3d 30 20 29 7b 0a 20 20 20 20 76 64 62 65 49 6e  =0 ){.    vdbeIn
159d0 76 6f 6b 65 53 71 6c 6c 6f 67 28 70 29 3b 0a 20  vokeSqllog(p);. 
159e0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 54 72     sqlite3VdbeTr
159f0 61 6e 73 66 65 72 45 72 72 6f 72 28 70 29 3b 0a  ansferError(p);.
15a00 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15a10 65 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67  e(db, p->zErrMsg
15a20 29 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73  );.    p->zErrMs
15a30 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  g = 0;.    if( p
15a40 2d 3e 72 75 6e 4f 6e 6c 79 4f 6e 63 65 20 29 20  ->runOnlyOnce ) 
15a50 70 2d 3e 65 78 70 69 72 65 64 20 3d 20 31 3b 0a  p->expired = 1;.
15a60 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 72    }else if( p->r
15a70 63 20 26 26 20 70 2d 3e 65 78 70 69 72 65 64 20  c && p->expired 
15a80 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ){.    /* The ex
15a90 70 69 72 65 64 20 66 6c 61 67 20 77 61 73 20 73  pired flag was s
15aa0 65 74 20 6f 6e 20 74 68 65 20 56 44 42 45 20 62  et on the VDBE b
15ab0 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
15ac0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
15ad0 71 6c 69 74 65 33 5f 73 74 65 70 28 29 2e 20 46  qlite3_step(). F
15ae0 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79 20 28  or consistency (
15af0 73 69 6e 63 65 20 73 71 6c 69 74 65 33 5f 73 74  since sqlite3_st
15b00 65 70 28 29 20 77 61 73 0a 20 20 20 20 2a 2a 20  ep() was.    ** 
15b10 63 61 6c 6c 65 64 29 2c 20 73 65 74 20 74 68 65  called), set the
15b20 20 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20   database error 
15b30 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 73 20  in this case as 
15b40 77 65 6c 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  well..    */.   
15b50 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
15b60 68 4d 73 67 28 64 62 2c 20 70 2d 3e 72 63 2c 20  hMsg(db, p->rc, 
15b70 70 2d 3e 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  p->zErrMsg ? "%s
15b80 22 20 3a 20 30 2c 20 70 2d 3e 7a 45 72 72 4d 73  " : 0, p->zErrMs
15b90 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  g);.    sqlite3D
15ba0 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 7a 45 72  bFree(db, p->zEr
15bb0 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d 3e 7a 45  rMsg);.    p->zE
15bc0 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 7d 0a 0a  rrMsg = 0;.  }..
15bd0 20 20 2f 2a 20 52 65 63 6c 61 69 6d 20 61 6c 6c    /* Reclaim all
15be0 20 6d 65 6d 6f 72 79 20 75 73 65 64 20 62 79 20   memory used by 
15bf0 74 68 65 20 56 44 42 45 0a 20 20 2a 2f 0a 20 20  the VDBE.  */.  
15c00 43 6c 65 61 6e 75 70 28 70 29 3b 0a 0a 20 20 2f  Cleanup(p);..  /
15c10 2a 20 53 61 76 65 20 70 72 6f 66 69 6c 69 6e 67  * Save profiling
15c20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
15c30 6d 20 74 68 69 73 20 56 44 42 45 20 72 75 6e 2e  m this VDBE run.
15c40 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 56 44 42  .  */.#ifdef VDB
15c50 45 5f 50 52 4f 46 49 4c 45 0a 20 20 7b 0a 20 20  E_PROFILE.  {.  
15c60 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 66 6f    FILE *out = fo
15c70 70 65 6e 28 22 76 64 62 65 5f 70 72 6f 66 69 6c  pen("vdbe_profil
15c80 65 2e 6f 75 74 22 2c 20 22 61 22 29 3b 0a 20 20  e.out", "a");.  
15c90 20 20 69 66 28 20 6f 75 74 20 29 7b 0a 20 20 20    if( out ){.   
15ca0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
15cb0 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  fprintf(out, "--
15cc0 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 66 6f 72  -- ");.      for
15cd0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20  (i=0; i<p->nOp; 
15ce0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66 70  i++){.        fp
15cf0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 30 32 78  rintf(out, "%02x
15d00 22 2c 20 70 2d 3e 61 4f 70 5b 69 5d 2e 6f 70 63  ", p->aOp[i].opc
15d10 6f 64 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ode);.      }.  
15d20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15d30 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 69 66   "\n");.      if
15d40 28 20 70 2d 3e 7a 53 71 6c 20 29 7b 0a 20 20 20  ( p->zSql ){.   
15d50 20 20 20 20 20 63 68 61 72 20 63 2c 20 70 63 20       char c, pc 
15d60 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 70 72  = 0;.        fpr
15d70 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22 29  intf(out, "-- ")
15d80 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
15d90 30 3b 20 28 63 20 3d 20 70 2d 3e 7a 53 71 6c 5b  0; (c = p->zSql[
15da0 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20  i])!=0; i++){.  
15db0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
15dc0 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
15dd0 75 74 2c 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20  ut, "-- ");.    
15de0 20 20 20 20 20 20 70 75 74 63 28 63 2c 20 6f 75        putc(c, ou
15df0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 63  t);.          pc
15e00 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = c;.        }.
15e10 20 20 20 20 20 20 20 20 69 66 28 20 70 63 21 3d          if( pc!=
15e20 27 5c 6e 27 20 29 20 66 70 72 69 6e 74 66 28 6f  '\n' ) fprintf(o
15e30 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20  ut, "\n");.     
15e40 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
15e50 3b 20 69 3c 70 2d 3e 6e 4f 70 3b 20 69 2b 2b 29  ; i<p->nOp; i++)
15e60 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  {.        char z
15e70 48 64 72 5b 31 30 30 5d 3b 0a 20 20 20 20 20 20  Hdr[100];.      
15e80 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
15e90 74 66 28 73 69 7a 65 6f 66 28 7a 48 64 72 29 2c  tf(sizeof(zHdr),
15ea0 20 7a 48 64 72 2c 20 22 25 36 75 20 25 31 32 6c   zHdr, "%6u %12l
15eb0 6c 75 20 25 38 6c 6c 75 20 22 2c 0a 20 20 20 20  lu %8llu ",.    
15ec0 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d         p->aOp[i]
15ed0 2e 63 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  .cnt,.          
15ee0 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65   p->aOp[i].cycle
15ef0 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  s,.           p-
15f00 3e 61 4f 70 5b 69 5d 2e 63 6e 74 3e 30 20 3f 20  >aOp[i].cnt>0 ? 
15f10 70 2d 3e 61 4f 70 5b 69 5d 2e 63 79 63 6c 65 73  p->aOp[i].cycles
15f20 2f 70 2d 3e 61 4f 70 5b 69 5d 2e 63 6e 74 20 3a  /p->aOp[i].cnt :
15f30 20 30 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20   0.        );.  
15f40 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
15f50 74 2c 20 22 25 73 22 2c 20 7a 48 64 72 29 3b 0a  t, "%s", zHdr);.
15f60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
15f70 64 62 65 50 72 69 6e 74 4f 70 28 6f 75 74 2c 20  dbePrintOp(out, 
15f80 69 2c 20 26 70 2d 3e 61 4f 70 5b 69 5d 29 3b 0a  i, &p->aOp[i]);.
15f90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 63        }.      fc
15fa0 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 7d  lose(out);.    }
15fb0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70 2d  .  }.#endif.  p-
15fc0 3e 69 43 75 72 72 65 6e 74 54 69 6d 65 20 3d 20  >iCurrentTime = 
15fd0 30 3b 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20  0;.  p->magic = 
15fe0 56 44 42 45 5f 4d 41 47 49 43 5f 49 4e 49 54 3b  VDBE_MAGIC_INIT;
15ff0 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 72 63 20  .  return p->rc 
16000 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
16010 0a 20 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 6e 20 75  . ./*.** Clean u
16020 70 20 61 6e 64 20 64 65 6c 65 74 65 20 61 20 56  p and delete a V
16030 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
16040 69 6f 6e 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  ion.  Return an 
16050 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
16060 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63  .** the result c
16070 6f 64 65 2e 20 20 57 72 69 74 65 20 61 6e 79 20  ode.  Write any 
16080 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 65  error message te
16090 78 74 20 69 6e 74 6f 20 2a 70 7a 45 72 72 4d 73  xt into *pzErrMs
160a0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
160b0 33 56 64 62 65 46 69 6e 61 6c 69 7a 65 28 56 64  3VdbeFinalize(Vd
160c0 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  be *p){.  int rc
160d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
160e0 69 66 28 20 70 2d 3e 6d 61 67 69 63 3d 3d 56 44  if( p->magic==VD
160f0 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 7c 7c 20  BE_MAGIC_RUN || 
16100 70 2d 3e 6d 61 67 69 63 3d 3d 56 44 42 45 5f 4d  p->magic==VDBE_M
16110 41 47 49 43 5f 48 41 4c 54 20 29 7b 0a 20 20 20  AGIC_HALT ){.   
16120 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62   rc = sqlite3Vdb
16130 65 52 65 73 65 74 28 70 29 3b 0a 20 20 20 20 61  eReset(p);.    a
16140 73 73 65 72 74 28 20 28 72 63 20 26 20 70 2d 3e  ssert( (rc & p->
16150 64 62 2d 3e 65 72 72 4d 61 73 6b 29 3d 3d 72 63  db->errMask)==rc
16160 20 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   );.  }.  sqlite
16170 33 56 64 62 65 44 65 6c 65 74 65 28 70 29 3b 0a  3VdbeDelete(p);.
16180 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16190 2f 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  /*.** If paramet
161a0 65 72 20 69 4f 70 20 69 73 20 6c 65 73 73 20 74  er iOp is less t
161b0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 69  han zero, then i
161c0 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75  nvoke the destru
161d0 63 74 6f 72 20 66 6f 72 0a 2a 2a 20 61 6c 6c 20  ctor for.** all 
161e0 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70  auxiliary data p
161f0 6f 69 6e 74 65 72 73 20 63 75 72 72 65 6e 74 6c  ointers currentl
16200 79 20 63 61 63 68 65 64 20 62 79 20 74 68 65 20  y cached by the 
16210 56 4d 20 70 61 73 73 65 64 20 61 73 0a 2a 2a 20  VM passed as.** 
16220 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
16230 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66  nt..**.** Or, if
16240 20 69 4f 70 20 69 73 20 67 72 65 61 74 65 72 20   iOp is greater 
16250 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
16260 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
16270 64 65 73 74 72 75 63 74 6f 72 20 69 73 0a 2a 2a  destructor is.**
16280 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 66 6f   only invoked fo
16290 72 20 74 68 6f 73 65 20 61 75 78 69 6c 69 61 72  r those auxiliar
162a0 79 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20  y data pointers 
162b0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 75  created by the u
162c0 73 65 72 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ser .** function
162d0 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20   invoked by the 
162e0 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 6f 70 63 6f  OP_Function opco
162f0 64 65 20 61 74 20 69 6e 73 74 72 75 63 74 69 6f  de at instructio
16300 6e 20 69 4f 70 20 6f 66 20 0a 2a 2a 20 56 4d 20  n iOp of .** VM 
16310 70 56 64 62 65 2c 20 61 6e 64 20 6f 6e 6c 79 20  pVdbe, and only 
16320 74 68 65 6e 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  then if:.**.**  
16330 20 20 2a 20 74 68 65 20 61 73 73 6f 63 69 61 74    * the associat
16340 65 64 20 66 75 6e 63 74 69 6f 6e 20 70 61 72 61  ed function para
16350 6d 65 74 65 72 20 69 73 20 74 68 65 20 33 32 6e  meter is the 32n
16360 64 20 6f 72 20 6c 61 74 65 72 20 28 63 6f 75 6e  d or later (coun
16370 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20 66 72 6f  ting.**      fro
16380 6d 20 6c 65 66 74 20 74 6f 20 72 69 67 68 74 29  m left to right)
16390 2c 20 6f 72 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20  , or.**.**    * 
163a0 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
163b0 67 20 62 69 74 20 69 6e 20 61 72 67 75 6d 65 6e  g bit in argumen
163c0 74 20 6d 61 73 6b 20 69 73 20 63 6c 65 61 72 20  t mask is clear 
163d0 28 77 68 65 72 65 20 74 68 65 20 66 69 72 73 74  (where the first
163e0 0a 2a 2a 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .**      functio
163f0 6e 20 70 61 72 61 6d 65 74 65 72 20 63 6f 72 72  n parameter corr
16400 65 73 70 6f 6e 64 73 20 74 6f 20 62 69 74 20 30  esponds to bit 0
16410 20 65 74 63 2e 29 2e 0a 2a 2f 0a 76 6f 69 64 20   etc.)..*/.void 
16420 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65 74  sqlite3VdbeDelet
16430 65 41 75 78 44 61 74 61 28 73 71 6c 69 74 65 33  eAuxData(sqlite3
16440 20 2a 64 62 2c 20 41 75 78 44 61 74 61 20 2a 2a   *db, AuxData **
16450 70 70 2c 20 69 6e 74 20 69 4f 70 2c 20 69 6e 74  pp, int iOp, int
16460 20 6d 61 73 6b 29 7b 0a 20 20 77 68 69 6c 65 28   mask){.  while(
16470 20 2a 70 70 20 29 7b 0a 20 20 20 20 41 75 78 44   *pp ){.    AuxD
16480 61 74 61 20 2a 70 41 75 78 20 3d 20 2a 70 70 3b  ata *pAux = *pp;
16490 0a 20 20 20 20 69 66 28 20 28 69 4f 70 3c 30 29  .    if( (iOp<0)
164a0 0a 20 20 20 20 20 7c 7c 20 28 70 41 75 78 2d 3e  .     || (pAux->
164b0 69 4f 70 3d 3d 69 4f 70 20 26 26 20 28 70 41 75  iOp==iOp && (pAu
164c0 78 2d 3e 69 41 72 67 3e 33 31 20 7c 7c 20 21 28  x->iArg>31 || !(
164d0 6d 61 73 6b 20 26 20 4d 41 53 4b 42 49 54 33 32  mask & MASKBIT32
164e0 28 70 41 75 78 2d 3e 69 41 72 67 29 29 29 29 0a  (pAux->iArg)))).
164f0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 74 65 73      ){.      tes
16500 74 63 61 73 65 28 20 70 41 75 78 2d 3e 69 41 72  tcase( pAux->iAr
16510 67 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 69  g==31 );.      i
16520 66 28 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65  f( pAux->xDelete
16530 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 75 78   ){.        pAux
16540 2d 3e 78 44 65 6c 65 74 65 28 70 41 75 78 2d 3e  ->xDelete(pAux->
16550 70 41 75 78 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pAux);.      }. 
16560 20 20 20 20 20 2a 70 70 20 3d 20 70 41 75 78 2d       *pp = pAux-
16570 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71  >pNext;.      sq
16580 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
16590 70 41 75 78 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pAux);.    }else
165a0 7b 0a 20 20 20 20 20 20 70 70 3d 20 26 70 41 75  {.      pp= &pAu
165b0 78 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  x->pNext;.    }.
165c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65    }.}../*.** Fre
165d0 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 73 73  e all memory ass
165e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
165f0 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73 20   Vdbe passed as 
16600 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
16610 65 6e 74 2c 0a 2a 2a 20 65 78 63 65 70 74 20 66  ent,.** except f
16620 6f 72 20 6f 62 6a 65 63 74 20 69 74 73 65 6c 66  or object itself
16630 2c 20 77 68 69 63 68 20 69 73 20 70 72 65 73 65  , which is prese
16640 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rved..**.** The 
16650 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
16660 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16670 20 61 6e 64 20 73 71 6c 69 74 65 33 56 64 62 65   and sqlite3Vdbe
16680 44 65 6c 65 74 65 28 29 20 69 73 20 74 68 61 74  Delete() is that
16690 0a 2a 2a 20 56 64 62 65 44 65 6c 65 74 65 28 29  .** VdbeDelete()
166a0 20 61 6c 73 6f 20 75 6e 6c 69 6e 6b 73 20 74 68   also unlinks th
166b0 65 20 56 64 62 65 20 66 72 6f 6d 20 74 68 65 20  e Vdbe from the 
166c0 6c 69 73 74 20 6f 66 20 56 4d 73 20 61 73 73 6f  list of VMs asso
166d0 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 74  ciated with.** t
166e0 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
166f0 65 63 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 73  ection and frees
16700 20 74 68 65 20 6f 62 6a 65 63 74 20 69 74 73 65   the object itse
16710 6c 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  lf..*/.void sqli
16720 74 65 33 56 64 62 65 43 6c 65 61 72 4f 62 6a 65  te3VdbeClearObje
16730 63 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  ct(sqlite3 *db, 
16740 56 64 62 65 20 2a 70 29 7b 0a 20 20 53 75 62 50  Vdbe *p){.  SubP
16750 72 6f 67 72 61 6d 20 2a 70 53 75 62 2c 20 2a 70  rogram *pSub, *p
16760 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Next;.  int i;. 
16770 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 3d 3d   assert( p->db==
16780 30 20 7c 7c 20 70 2d 3e 64 62 3d 3d 64 62 20 29  0 || p->db==db )
16790 3b 0a 20 20 72 65 6c 65 61 73 65 4d 65 6d 41 72  ;.  releaseMemAr
167a0 72 61 79 28 70 2d 3e 61 56 61 72 2c 20 70 2d 3e  ray(p->aVar, p->
167b0 6e 56 61 72 29 3b 0a 20 20 72 65 6c 65 61 73 65  nVar);.  release
167c0 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c  MemArray(p->aCol
167d0 4e 61 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c  Name, p->nResCol
167e0 75 6d 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a  umn*COLNAME_N);.
167f0 20 20 66 6f 72 28 70 53 75 62 3d 70 2d 3e 70 50    for(pSub=p->pP
16800 72 6f 67 72 61 6d 3b 20 70 53 75 62 3b 20 70 53  rogram; pSub; pS
16810 75 62 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  ub=pNext){.    p
16820 4e 65 78 74 20 3d 20 70 53 75 62 2d 3e 70 4e 65  Next = pSub->pNe
16830 78 74 3b 0a 20 20 20 20 76 64 62 65 46 72 65 65  xt;.    vdbeFree
16840 4f 70 41 72 72 61 79 28 64 62 2c 20 70 53 75 62  OpArray(db, pSub
16850 2d 3e 61 4f 70 2c 20 70 53 75 62 2d 3e 6e 4f 70  ->aOp, pSub->nOp
16860 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
16870 46 72 65 65 28 64 62 2c 20 70 53 75 62 29 3b 0a  Free(db, pSub);.
16880 20 20 7d 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e    }.  for(i=p->n
16890 7a 56 61 72 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  zVar-1; i>=0; i-
168a0 2d 29 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  -) sqlite3DbFree
168b0 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 5b 69 5d  (db, p->azVar[i]
168c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
168d0 65 65 28 64 62 2c 20 70 2d 3e 61 7a 56 61 72 29  ee(db, p->azVar)
168e0 3b 0a 20 20 76 64 62 65 46 72 65 65 4f 70 41 72  ;.  vdbeFreeOpAr
168f0 72 61 79 28 64 62 2c 20 70 2d 3e 61 4f 70 2c 20  ray(db, p->aOp, 
16900 70 2d 3e 6e 4f 70 29 3b 0a 20 20 73 71 6c 69 74  p->nOp);.  sqlit
16910 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16920 61 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 73 71 6c  aColName);.  sql
16930 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
16940 2d 3e 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  ->zSql);.  sqlit
16950 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
16960 70 46 72 65 65 29 3b 0a 23 69 66 64 65 66 20 53  pFree);.#ifdef S
16970 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
16980 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 66  T_SCANSTATUS.  f
16990 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 63  or(i=0; i<p->nSc
169a0 61 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71  an; i++){.    sq
169b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
169c0 70 2d 3e 61 53 63 61 6e 5b 69 5d 2e 7a 4e 61 6d  p->aScan[i].zNam
169d0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
169e0 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
169f0 53 63 61 6e 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Scan);.#endif.}.
16a00 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
16a10 20 65 6e 74 69 72 65 20 56 44 42 45 2e 0a 2a 2f   entire VDBE..*/
16a20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62  .void sqlite3Vdb
16a30 65 44 65 6c 65 74 65 28 56 64 62 65 20 2a 70 29  eDelete(Vdbe *p)
16a40 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
16a50 0a 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ..  if( NEVER(p=
16a60 3d 30 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  =0) ) return;.  
16a70 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73  db = p->db;.  as
16a80 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
16a90 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
16aa0 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ex) );.  sqlite3
16ab0 56 64 62 65 43 6c 65 61 72 4f 62 6a 65 63 74 28  VdbeClearObject(
16ac0 64 62 2c 20 70 29 3b 0a 20 20 69 66 28 20 70 2d  db, p);.  if( p-
16ad0 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 70 2d  >pPrev ){.    p-
16ae0 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20  >pPrev->pNext = 
16af0 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 65 6c 73  p->pNext;.  }els
16b00 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  e{.    assert( d
16b10 62 2d 3e 70 56 64 62 65 3d 3d 70 20 29 3b 0a 20  b->pVdbe==p );. 
16b20 20 20 20 64 62 2d 3e 70 56 64 62 65 20 3d 20 70     db->pVdbe = p
16b30 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69  ->pNext;.  }.  i
16b40 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  f( p->pNext ){. 
16b50 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72     p->pNext->pPr
16b60 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 20  ev = p->pPrev;. 
16b70 20 7d 0a 20 20 70 2d 3e 6d 61 67 69 63 20 3d 20   }.  p->magic = 
16b80 56 44 42 45 5f 4d 41 47 49 43 5f 44 45 41 44 3b  VDBE_MAGIC_DEAD;
16b90 0a 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20  .  p->db = 0;.  
16ba0 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
16bb0 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  , p);.}../*.** T
16bc0 68 65 20 63 75 72 73 6f 72 20 22 70 22 20 68 61  he cursor "p" ha
16bd0 73 20 61 20 70 65 6e 64 69 6e 67 20 73 65 65 6b  s a pending seek
16be0 20 6f 70 65 72 61 74 69 6f 6e 20 74 68 61 74 20   operation that 
16bf0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
16c00 0a 2a 2a 20 63 61 72 72 69 65 64 20 6f 75 74 2e  .** carried out.
16c10 20 20 53 65 65 6b 20 74 68 65 20 63 75 72 73 6f    Seek the curso
16c20 72 20 6e 6f 77 2e 20 20 49 66 20 61 6e 20 65 72  r now.  If an er
16c30 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
16c40 72 6e 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70  rn.** the approp
16c50 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
16c60 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16c70 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
16c80 68 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f  handleDeferredMo
16c90 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f 72 20  veto(VdbeCursor 
16ca0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 65 73 2c 20  *p){.  int res, 
16cb0 72 63 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  rc;.#ifdef SQLIT
16cc0 45 5f 54 45 53 54 0a 20 20 65 78 74 65 72 6e 20  E_TEST.  extern 
16cd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
16ce0 63 68 5f 63 6f 75 6e 74 3b 0a 23 65 6e 64 69 66  ch_count;.#endif
16cf0 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 65  .  assert( p->de
16d00 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 29 3b 0a  ferredMoveto );.
16d10 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 73 54    assert( p->isT
16d20 61 62 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  able );.  assert
16d30 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
16d40 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a  URTYPE_BTREE );.
16d50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
16d60 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65  reeMovetoUnpacke
16d70 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 2c  d(p->uc.pCursor,
16d80 20 30 2c 20 70 2d 3e 6d 6f 76 65 74 6f 54 61 72   0, p->movetoTar
16d90 67 65 74 2c 20 30 2c 20 26 72 65 73 29 3b 0a 20  get, 0, &res);. 
16da0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
16db0 20 72 63 3b 0a 20 20 69 66 28 20 72 65 73 21 3d   rc;.  if( res!=
16dc0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
16dd0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
16de0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
16df0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 61  ST.  sqlite3_sea
16e00 72 63 68 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e  rch_count++;.#en
16e10 64 69 66 0a 20 20 70 2d 3e 64 65 66 65 72 72 65  dif.  p->deferre
16e20 64 4d 6f 76 65 74 6f 20 3d 20 30 3b 0a 20 20 70  dMoveto = 0;.  p
16e30 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d 20  ->cacheStatus = 
16e40 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20 72  CACHE_STALE;.  r
16e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16e60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 68  .}../*.** Someth
16e70 69 6e 67 20 68 61 73 20 6d 6f 76 65 64 20 63 75  ing has moved cu
16e80 72 73 6f 72 20 22 70 22 20 6f 75 74 20 6f 66 20  rsor "p" out of 
16e90 70 6c 61 63 65 2e 20 20 4d 61 79 62 65 20 74 68  place.  Maybe th
16ea0 65 20 72 6f 77 20 69 74 20 77 61 73 0a 2a 2a 20  e row it was.** 
16eb0 70 6f 69 6e 74 65 64 20 74 6f 20 77 61 73 20 64  pointed to was d
16ec0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
16ed0 75 6e 64 65 72 20 69 74 2e 20 20 4f 72 20 6d 61  under it.  Or ma
16ee0 79 62 65 20 74 68 65 20 62 74 72 65 65 20 77 61  ybe the btree wa
16ef0 73 0a 2a 2a 20 72 65 62 61 6c 61 6e 63 65 64 2e  s.** rebalanced.
16f00 20 20 57 68 61 74 65 76 65 72 20 74 68 65 20 63    Whatever the c
16f10 61 75 73 65 2c 20 74 72 79 20 74 6f 20 72 65 73  ause, try to res
16f20 74 6f 72 65 20 22 70 22 20 74 6f 20 74 68 65 20  tore "p" to the 
16f30 70 6c 61 63 65 20 69 74 0a 2a 2a 20 69 73 20 73  place it.** is s
16f40 75 70 70 6f 73 65 64 20 74 6f 20 62 65 20 70 6f  upposed to be po
16f50 69 6e 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20  inting.  If the 
16f60 72 6f 77 20 77 61 73 20 64 65 6c 65 74 65 64 20  row was deleted 
16f70 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
16f80 68 65 0a 2a 2a 20 63 75 72 73 6f 72 2c 20 73 65  he.** cursor, se
16f90 74 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  t the cursor to 
16fa0 70 6f 69 6e 74 20 74 6f 20 61 20 4e 55 4c 4c 20  point to a NULL 
16fb0 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
16fc0 6e 74 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  nt SQLITE_NOINLI
16fd0 4e 45 20 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75  NE handleMovedCu
16fe0 72 73 6f 72 28 56 64 62 65 43 75 72 73 6f 72 20  rsor(VdbeCursor 
16ff0 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 44 69 66  *p){.  int isDif
17000 66 65 72 65 6e 74 52 6f 77 2c 20 72 63 3b 0a 20  ferentRow, rc;. 
17010 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
17020 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
17030 52 45 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28  REE );.  assert(
17040 20 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 21 3d   p->uc.pCursor!=
17050 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
17060 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
17070 72 48 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e  rHasMoved(p->uc.
17080 70 43 75 72 73 6f 72 29 20 29 3b 0a 20 20 72 63  pCursor) );.  rc
17090 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
170a0 75 72 73 6f 72 52 65 73 74 6f 72 65 28 70 2d 3e  ursorRestore(p->
170b0 75 63 2e 70 43 75 72 73 6f 72 2c 20 26 69 73 44  uc.pCursor, &isD
170c0 69 66 66 65 72 65 6e 74 52 6f 77 29 3b 0a 20 20  ifferentRow);.  
170d0 70 2d 3e 63 61 63 68 65 53 74 61 74 75 73 20 3d  p->cacheStatus =
170e0 20 43 41 43 48 45 5f 53 54 41 4c 45 3b 0a 20 20   CACHE_STALE;.  
170f0 69 66 28 20 69 73 44 69 66 66 65 72 65 6e 74 52  if( isDifferentR
17100 6f 77 20 29 20 70 2d 3e 6e 75 6c 6c 52 6f 77 20  ow ) p->nullRow 
17110 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
17120 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  ;.}../*.** Check
17130 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
17140 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 76 61  the cursor is va
17150 6c 69 64 2e 20 20 52 65 73 74 6f 72 65 20 74 68  lid.  Restore th
17160 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 66 20 6e  e cursor.** if n
17170 65 65 64 20 62 65 2e 20 20 52 65 74 75 72 6e 20  eed be.  Return 
17180 61 6e 79 20 49 2f 4f 20 65 72 72 6f 72 20 66 72  any I/O error fr
17190 6f 6d 20 74 68 65 20 72 65 73 74 6f 72 65 20 6f  om the restore o
171a0 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  peration..*/.int
171b0 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 73   sqlite3VdbeCurs
171c0 6f 72 52 65 73 74 6f 72 65 28 56 64 62 65 43 75  orRestore(VdbeCu
171d0 72 73 6f 72 20 2a 70 29 7b 0a 20 20 61 73 73 65  rsor *p){.  asse
171e0 72 74 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d  rt( p->eCurType=
171f0 3d 43 55 52 54 59 50 45 5f 42 54 52 45 45 20 29  =CURTYPE_BTREE )
17200 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 42  ;.  if( sqlite3B
17210 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76  treeCursorHasMov
17220 65 64 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72  ed(p->uc.pCursor
17230 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
17240 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
17250 72 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  r(p);.  }.  retu
17260 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17270 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
17280 20 74 68 65 20 63 75 72 73 6f 72 20 70 20 69 73   the cursor p is
17290 20 72 65 61 64 79 20 74 6f 20 72 65 61 64 20 6f   ready to read o
172a0 72 20 77 72 69 74 65 20 74 68 65 20 72 6f 77 20  r write the row 
172b0 74 6f 20 77 68 69 63 68 20 69 74 0a 2a 2a 20 77  to which it.** w
172c0 61 73 20 6c 61 73 74 20 70 6f 73 69 74 69 6f 6e  as last position
172d0 65 64 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ed.  Return an e
172e0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 20  rror code if an 
172f0 4f 4f 4d 20 66 61 75 6c 74 20 6f 72 20 49 2f 4f  OOM fault or I/O
17300 20 65 72 72 6f 72 0a 2a 2a 20 70 72 65 76 65 6e   error.** preven
17310 74 73 20 75 73 20 66 72 6f 6d 20 70 6f 73 69 74  ts us from posit
17320 69 6f 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f  ioning the curso
17330 72 20 74 6f 20 69 74 73 20 63 6f 72 72 65 63 74  r to its correct
17340 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   position..**.**
17350 20 49 66 20 61 20 4d 6f 76 65 54 6f 20 6f 70 65   If a MoveTo ope
17360 72 61 74 69 6f 6e 20 69 73 20 70 65 6e 64 69 6e  ration is pendin
17370 67 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 63  g on the given c
17380 75 72 73 6f 72 2c 20 74 68 65 6e 20 64 6f 20 74  ursor, then do t
17390 68 61 74 0a 2a 2a 20 4d 6f 76 65 54 6f 20 6e 6f  hat.** MoveTo no
173a0 77 2e 20 20 49 66 20 6e 6f 20 6d 6f 76 65 20 69  w.  If no move i
173b0 73 20 70 65 6e 64 69 6e 67 2c 20 63 68 65 63 6b  s pending, check
173c0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 72   to see if the r
173d0 6f 77 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 64  ow has been.** d
173e0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
173f0 75 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72  under the cursor
17400 20 61 6e 64 20 69 66 20 69 74 20 68 61 73 2c 20   and if it has, 
17410 6d 61 72 6b 20 74 68 65 20 72 6f 77 20 61 73 0a  mark the row as.
17420 2a 2a 20 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a  ** a NULL row..*
17430 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 75 72 73  *.** If the curs
17440 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
17450 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20 63 6f  inting to the co
17460 72 72 65 63 74 20 72 6f 77 20 61 6e 64 20 74 68  rrect row and th
17470 61 74 20 72 6f 77 20 68 61 73 0a 2a 2a 20 6e 6f  at row has.** no
17480 74 20 62 65 65 6e 20 64 65 6c 65 74 65 64 20 6f  t been deleted o
17490 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68  ut from under th
174a0 65 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20 74  e cursor, then t
174b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
174c0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
174d0 71 6c 69 74 65 33 56 64 62 65 43 75 72 73 6f 72  qlite3VdbeCursor
174e0 4d 6f 76 65 74 6f 28 56 64 62 65 43 75 72 73 6f  Moveto(VdbeCurso
174f0 72 20 2a 2a 70 70 2c 20 69 6e 74 20 2a 70 69 43  r **pp, int *piC
17500 6f 6c 29 7b 0a 20 20 56 64 62 65 43 75 72 73 6f  ol){.  VdbeCurso
17510 72 20 2a 70 20 3d 20 2a 70 70 3b 0a 20 20 69 66  r *p = *pp;.  if
17520 28 20 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43  ( p->eCurType==C
17530 55 52 54 59 50 45 5f 42 54 52 45 45 20 29 7b 0a  URTYPE_BTREE ){.
17540 20 20 20 20 69 66 28 20 70 2d 3e 64 65 66 65 72      if( p->defer
17550 72 65 64 4d 6f 76 65 74 6f 20 29 7b 0a 20 20 20  redMoveto ){.   
17560 20 20 20 69 6e 74 20 69 4d 61 70 3b 0a 20 20 20     int iMap;.   
17570 20 20 20 69 66 28 20 70 2d 3e 61 41 6c 74 4d 61     if( p->aAltMa
17580 70 20 26 26 20 28 69 4d 61 70 20 3d 20 70 2d 3e  p && (iMap = p->
17590 61 41 6c 74 4d 61 70 5b 31 2b 2a 70 69 43 6f 6c  aAltMap[1+*piCol
175a0 5d 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ])>0 ){.        
175b0 2a 70 70 20 3d 20 70 2d 3e 70 41 6c 74 43 75 72  *pp = p->pAltCur
175c0 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 2a 70 69  sor;.        *pi
175d0 43 6f 6c 20 3d 20 69 4d 61 70 20 2d 20 31 3b 0a  Col = iMap - 1;.
175e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
175f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
17600 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 68  }.      return h
17610 61 6e 64 6c 65 44 65 66 65 72 72 65 64 4d 6f 76  andleDeferredMov
17620 65 74 6f 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20  eto(p);.    }.  
17630 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
17640 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
17650 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
17660 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
17670 68 61 6e 64 6c 65 4d 6f 76 65 64 43 75 72 73 6f  handleMovedCurso
17680 72 28 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r(p);.    }.  }.
17690 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
176a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
176b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75 6e 63 74   following funct
176c0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 73 71 6c 69  ions:.**.** sqli
176d0 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
176e0 65 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64  e().** sqlite3Vd
176f0 62 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28  beSerialTypeLen(
17700 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65  ).** sqlite3Vdbe
17710 53 65 72 69 61 6c 4c 65 6e 28 29 0a 2a 2a 20 73  SerialLen().** s
17720 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
17730 50 75 74 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33  Put().** sqlite3
17740 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 0a  VdbeSerialGet().
17750 2a 2a 0a 2a 2a 20 65 6e 63 61 70 73 75 6c 61 74  **.** encapsulat
17760 65 20 74 68 65 20 63 6f 64 65 20 74 68 61 74 20  e the code that 
17770 73 65 72 69 61 6c 69 7a 65 73 20 76 61 6c 75 65  serializes value
17780 73 20 66 6f 72 20 73 74 6f 72 61 67 65 20 69 6e  s for storage in
17790 20 53 51 4c 69 74 65 0a 2a 2a 20 64 61 74 61 20   SQLite.** data 
177a0 61 6e 64 20 69 6e 64 65 78 20 72 65 63 6f 72 64  and index record
177b0 73 2e 20 45 61 63 68 20 73 65 72 69 61 6c 69 7a  s. Each serializ
177c0 65 64 20 76 61 6c 75 65 20 63 6f 6e 73 69 73 74  ed value consist
177d0 73 20 6f 66 20 61 0a 2a 2a 20 27 73 65 72 69 61  s of a.** 'seria
177e0 6c 2d 74 79 70 65 27 20 61 6e 64 20 61 20 62 6c  l-type' and a bl
177f0 6f 62 20 6f 66 20 64 61 74 61 2e 20 54 68 65 20  ob of data. The 
17800 73 65 72 69 61 6c 20 74 79 70 65 20 69 73 20 61  serial type is a
17810 6e 20 38 2d 62 79 74 65 20 75 6e 73 69 67 6e 65  n 8-byte unsigne
17820 64 0a 2a 2a 20 69 6e 74 65 67 65 72 2c 20 73 74  d.** integer, st
17830 6f 72 65 64 20 61 73 20 61 20 76 61 72 69 6e 74  ored as a varint
17840 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6e 20 53 51  ..**.** In an SQ
17850 4c 69 74 65 20 69 6e 64 65 78 20 72 65 63 6f 72  Lite index recor
17860 64 2c 20 74 68 65 20 73 65 72 69 61 6c 20 74 79  d, the serial ty
17870 70 65 20 69 73 20 73 74 6f 72 65 64 20 64 69 72  pe is stored dir
17880 65 63 74 6c 79 20 62 65 66 6f 72 65 0a 2a 2a 20  ectly before.** 
17890 74 68 65 20 62 6c 6f 62 20 6f 66 20 64 61 74 61  the blob of data
178a0 20 74 68 61 74 20 69 74 20 63 6f 72 72 65 73 70   that it corresp
178b0 6f 6e 64 73 20 74 6f 2e 20 49 6e 20 61 20 74 61  onds to. In a ta
178c0 62 6c 65 20 72 65 63 6f 72 64 2c 20 61 6c 6c 20  ble record, all 
178d0 73 65 72 69 61 6c 0a 2a 2a 20 74 79 70 65 73 20  serial.** types 
178e0 61 72 65 20 73 74 6f 72 65 64 20 61 74 20 74 68  are stored at th
178f0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 72  e start of the r
17900 65 63 6f 72 64 2c 20 61 6e 64 20 74 68 65 20 62  ecord, and the b
17910 6c 6f 62 73 20 6f 66 20 64 61 74 61 20 61 74 0a  lobs of data at.
17920 2a 2a 20 74 68 65 20 65 6e 64 2e 20 48 65 6e 63  ** the end. Henc
17930 65 20 74 68 65 73 65 20 66 75 6e 63 74 69 6f 6e  e these function
17940 73 20 61 6c 6c 6f 77 20 74 68 65 20 63 61 6c 6c  s allow the call
17950 65 72 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  er to handle the
17960 0a 2a 2a 20 73 65 72 69 61 6c 2d 74 79 70 65 20  .** serial-type 
17970 61 6e 64 20 64 61 74 61 20 62 6c 6f 62 20 73 65  and data blob se
17980 70 61 72 61 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  parately..**.** 
17990 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  The following ta
179a0 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
179b0 65 20 76 61 72 69 6f 75 73 20 73 74 6f 72 61 67  e various storag
179c0 65 20 63 6c 61 73 73 65 73 20 66 6f 72 20 64 61  e classes for da
179d0 74 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 73 65 72 69  ta:.**.**   seri
179e0 61 6c 20 74 79 70 65 20 20 20 20 20 20 20 20 62  al type        b
179f0 79 74 65 73 20 6f 66 20 64 61 74 61 20 20 20 20  ytes of data    
17a00 20 20 74 79 70 65 0a 2a 2a 20 20 20 2d 2d 2d 2d    type.**   ----
17a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
17a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20  --------------  
17a30 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
17a40 2d 0a 2a 2a 20 20 20 20 20 20 30 20 20 20 20 20  -.**      0     
17a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a60 30 20 20 20 20 20 20 20 20 20 20 20 20 4e 55 4c  0            NUL
17a70 4c 0a 2a 2a 20 20 20 20 20 20 31 20 20 20 20 20  L.**      1     
17a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a90 31 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67  1            sig
17aa0 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
17ab0 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
17ac0 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
17ad0 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e         signed in
17ae0 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 33 20  teger.**      3 
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20      3           
17b10 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a   signed integer.
17b20 2a 2a 20 20 20 20 20 20 34 20 20 20 20 20 20 20  **      4       
17b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 34 20                4 
17b40 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e 65             signe
17b50 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
17b60 20 20 35 20 20 20 20 20 20 20 20 20 20 20 20 20    5             
17b70 20 20 20 20 20 20 20 20 36 20 20 20 20 20 20 20          6       
17b80 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65       signed inte
17b90 67 65 72 0a 2a 2a 20 20 20 20 20 20 36 20 20 20  ger.**      6   
17ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17bb0 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20 73    8            s
17bc0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a  igned integer.**
17bd0 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 20        7         
17be0 20 20 20 20 20 20 20 20 20 20 20 20 38 20 20 20              8   
17bf0 20 20 20 20 20 20 20 20 20 49 45 45 45 20 66 6c           IEEE fl
17c00 6f 61 74 0a 2a 2a 20 20 20 20 20 20 38 20 20 20  oat.**      8   
17c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 49    0            I
17c30 6e 74 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20  nteger constant 
17c40 30 0a 2a 2a 20 20 20 20 20 20 39 20 20 20 20 20  0.**      9     
17c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c60 30 20 20 20 20 20 20 20 20 20 20 20 20 49 6e 74  0            Int
17c70 65 67 65 72 20 63 6f 6e 73 74 61 6e 74 20 31 0a  eger constant 1.
17c80 2a 2a 20 20 20 20 20 31 30 2c 31 31 20 20 20 20  **     10,11    
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 20 20 20 20 20 20 20 72 65 73 65 72             reser
17cb0 76 65 64 20 66 6f 72 20 65 78 70 61 6e 73 69 6f  ved for expansio
17cc0 6e 0a 2a 2a 20 20 20 20 4e 3e 3d 31 32 20 61 6e  n.**    N>=12 an
17cd0 64 20 65 76 65 6e 20 20 20 20 20 20 20 28 4e 2d  d even       (N-
17ce0 31 32 29 2f 32 20 20 20 20 20 20 20 20 42 4c 4f  12)/2        BLO
17cf0 42 0a 2a 2a 20 20 20 20 4e 3e 3d 31 33 20 61 6e  B.**    N>=13 an
17d00 64 20 6f 64 64 20 20 20 20 20 20 20 20 28 4e 2d  d odd        (N-
17d10 31 33 29 2f 32 20 20 20 20 20 20 20 20 74 65 78  13)/2        tex
17d20 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20 38 20 61 6e  t.**.** The 8 an
17d30 64 20 39 20 74 79 70 65 73 20 77 65 72 65 20 61  d 9 types were a
17d40 64 64 65 64 20 69 6e 20 33 2e 33 2e 30 2c 20 66  dded in 3.3.0, f
17d50 69 6c 65 20 66 6f 72 6d 61 74 20 34 2e 20 20 50  ile format 4.  P
17d60 72 69 6f 72 20 76 65 72 73 69 6f 6e 73 0a 2a 2a  rior versions.**
17d70 20 6f 66 20 53 51 4c 69 74 65 20 77 69 6c 6c 20   of SQLite will 
17d80 6e 6f 74 20 75 6e 64 65 72 73 74 61 6e 64 20 74  not understand t
17d90 68 6f 73 65 20 73 65 72 69 61 6c 20 74 79 70 65  hose serial type
17da0 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s..*/../*.** Ret
17db0 75 72 6e 20 74 68 65 20 73 65 72 69 61 6c 2d 74  urn the serial-t
17dc0 79 70 65 20 66 6f 72 20 74 68 65 20 76 61 6c 75  ype for the valu
17dd0 65 20 73 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d  e stored in pMem
17de0 2e 0a 2a 2f 0a 75 33 32 20 73 71 6c 69 74 65 33  ..*/.u32 sqlite3
17df0 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 28 4d  VdbeSerialType(M
17e00 65 6d 20 2a 70 4d 65 6d 2c 20 69 6e 74 20 66 69  em *pMem, int fi
17e10 6c 65 5f 66 6f 72 6d 61 74 2c 20 75 33 32 20 2a  le_format, u32 *
17e20 70 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 66 6c 61  pLen){.  int fla
17e30 67 73 20 3d 20 70 4d 65 6d 2d 3e 66 6c 61 67 73  gs = pMem->flags
17e40 3b 0a 20 20 75 33 32 20 6e 3b 0a 0a 20 20 61 73  ;.  u32 n;..  as
17e50 73 65 72 74 28 20 70 4c 65 6e 21 3d 30 20 29 3b  sert( pLen!=0 );
17e60 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
17e70 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 2a 70 4c  _Null ){.    *pL
17e80 65 6e 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  en = 0;.    retu
17e90 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
17ea0 66 6c 61 67 73 26 4d 45 4d 5f 49 6e 74 20 29 7b  flags&MEM_Int ){
17eb0 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  .    /* Figure o
17ec0 75 74 20 77 68 65 74 68 65 72 20 74 6f 20 75 73  ut whether to us
17ed0 65 20 31 2c 20 32 2c 20 34 2c 20 36 20 6f 72 20  e 1, 2, 4, 6 or 
17ee0 38 20 62 79 74 65 73 2e 20 2a 2f 0a 23 20 20 20  8 bytes. */.#   
17ef0 64 65 66 69 6e 65 20 4d 41 58 5f 36 42 59 54 45  define MAX_6BYTE
17f00 20 28 28 28 28 69 36 34 29 30 78 30 30 30 30 38   ((((i64)0x00008
17f10 30 30 30 29 3c 3c 33 32 29 2d 31 29 0a 20 20 20  000)<<32)-1).   
17f20 20 69 36 34 20 69 20 3d 20 70 4d 65 6d 2d 3e 75   i64 i = pMem->u
17f30 2e 69 3b 0a 20 20 20 20 75 36 34 20 75 3b 0a 20  .i;.    u64 u;. 
17f40 20 20 20 69 66 28 20 69 3c 30 20 29 7b 0a 20 20     if( i<0 ){.  
17f50 20 20 20 20 75 20 3d 20 7e 69 3b 0a 20 20 20 20      u = ~i;.    
17f60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 20 3d  }else{.      u =
17f70 20 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   i;.    }.    if
17f80 28 20 75 3c 3d 31 32 37 20 29 7b 0a 20 20 20 20  ( u<=127 ){.    
17f90 20 20 69 66 28 20 28 69 26 31 29 3d 3d 69 20 26    if( (i&1)==i &
17fa0 26 20 66 69 6c 65 5f 66 6f 72 6d 61 74 3e 3d 34  & file_format>=4
17fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65   ){.        *pLe
17fc0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  n = 0;.        r
17fd0 65 74 75 72 6e 20 38 2b 28 75 33 32 29 75 3b 0a  eturn 8+(u32)u;.
17fe0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
17ff0 20 20 20 20 20 2a 70 4c 65 6e 20 3d 20 31 3b 0a       *pLen = 1;.
18000 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
18010 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18020 20 20 20 20 69 66 28 20 75 3c 3d 33 32 37 36 37      if( u<=32767
18030 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 32 3b 20 72   ){ *pLen = 2; r
18040 65 74 75 72 6e 20 32 3b 20 7d 0a 20 20 20 20 69  eturn 2; }.    i
18050 66 28 20 75 3c 3d 38 33 38 38 36 30 37 20 29 7b  f( u<=8388607 ){
18060 20 2a 70 4c 65 6e 20 3d 20 33 3b 20 72 65 74 75   *pLen = 3; retu
18070 72 6e 20 33 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 3; }.    if( 
18080 75 3c 3d 32 31 34 37 34 38 33 36 34 37 20 29 7b  u<=2147483647 ){
18090 20 2a 70 4c 65 6e 20 3d 20 34 3b 20 72 65 74 75   *pLen = 4; retu
180a0 72 6e 20 34 3b 20 7d 0a 20 20 20 20 69 66 28 20  rn 4; }.    if( 
180b0 75 3c 3d 4d 41 58 5f 36 42 59 54 45 20 29 7b 20  u<=MAX_6BYTE ){ 
180c0 2a 70 4c 65 6e 20 3d 20 36 3b 20 72 65 74 75 72  *pLen = 6; retur
180d0 6e 20 35 3b 20 7d 0a 20 20 20 20 2a 70 4c 65 6e  n 5; }.    *pLen
180e0 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
180f0 20 36 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c   6;.  }.  if( fl
18100 61 67 73 26 4d 45 4d 5f 52 65 61 6c 20 29 7b 0a  ags&MEM_Real ){.
18110 20 20 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20      *pLen = 8;. 
18120 20 20 20 72 65 74 75 72 6e 20 37 3b 0a 20 20 7d     return 7;.  }
18130 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
18140 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
18150 64 20 7c 7c 20 66 6c 61 67 73 26 28 4d 45 4d 5f  d || flags&(MEM_
18160 53 74 72 7c 4d 45 4d 5f 42 6c 6f 62 29 20 29 3b  Str|MEM_Blob) );
18170 0a 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d  .  assert( pMem-
18180 3e 6e 3e 3d 30 20 29 3b 0a 20 20 6e 20 3d 20 28  >n>=0 );.  n = (
18190 75 33 32 29 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 69  u32)pMem->n;.  i
181a0 66 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a  f( flags & MEM_Z
181b0 65 72 6f 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ero ){.    n += 
181c0 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20  pMem->u.nZero;. 
181d0 20 7d 0a 20 20 2a 70 4c 65 6e 20 3d 20 6e 3b 0a   }.  *pLen = n;.
181e0 20 20 72 65 74 75 72 6e 20 28 28 6e 2a 32 29 20    return ((n*2) 
181f0 2b 20 31 32 20 2b 20 28 28 66 6c 61 67 73 26 4d  + 12 + ((flags&M
18200 45 4d 5f 53 74 72 29 21 3d 30 29 29 3b 0a 7d 0a  EM_Str)!=0));.}.
18210 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 73  ./*.** The sizes
18220 20 66 6f 72 20 73 65 72 69 61 6c 20 74 79 70 65   for serial type
18230 73 20 6c 65 73 73 20 74 68 61 6e 20 31 32 38 0a  s less than 128.
18240 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
18250 75 38 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54  u8 sqlite3SmallT
18260 79 70 65 53 69 7a 65 73 5b 5d 20 3d 20 7b 0a 20  ypeSizes[] = {. 
18270 20 20 20 20 20 20 20 2f 2a 20 20 30 20 20 20 31         /*  0   1
18280 20 20 20 32 20 20 20 33 20 20 20 34 20 20 20 35     2   3   4   5
18290 20 20 20 36 20 20 20 37 20 20 20 38 20 20 20 39     6   7   8   9
182a0 20 2a 2f 20 20 20 0a 2f 2a 20 20 20 30 20 2a 2f   */   ./*   0 */
182b0 20 20 20 30 2c 20 20 31 2c 20 20 32 2c 20 20 33     0,  1,  2,  3
182c0 2c 20 20 34 2c 20 20 36 2c 20 20 38 2c 20 20 38  ,  4,  6,  8,  8
182d0 2c 20 20 30 2c 20 20 30 2c 0a 2f 2a 20 20 31 30  ,  0,  0,./*  10
182e0 20 2a 2f 20 20 20 30 2c 20 20 30 2c 20 20 30 2c   */   0,  0,  0,
182f0 20 20 30 2c 20 20 31 2c 20 20 31 2c 20 20 32 2c    0,  1,  1,  2,
18300 20 20 32 2c 20 20 33 2c 20 20 33 2c 0a 2f 2a 20    2,  3,  3,./* 
18310 20 32 30 20 2a 2f 20 20 20 34 2c 20 20 34 2c 20   20 */   4,  4, 
18320 20 35 2c 20 20 35 2c 20 20 36 2c 20 20 36 2c 20   5,  5,  6,  6, 
18330 20 37 2c 20 20 37 2c 20 20 38 2c 20 20 38 2c 0a   7,  7,  8,  8,.
18340 2f 2a 20 20 33 30 20 2a 2f 20 20 20 39 2c 20 20  /*  30 */   9,  
18350 39 2c 20 31 30 2c 20 31 30 2c 20 31 31 2c 20 31  9, 10, 10, 11, 1
18360 31 2c 20 31 32 2c 20 31 32 2c 20 31 33 2c 20 31  1, 12, 12, 13, 1
18370 33 2c 0a 2f 2a 20 20 34 30 20 2a 2f 20 20 31 34  3,./*  40 */  14
18380 2c 20 31 34 2c 20 31 35 2c 20 31 35 2c 20 31 36  , 14, 15, 15, 16
18390 2c 20 31 36 2c 20 31 37 2c 20 31 37 2c 20 31 38  , 16, 17, 17, 18
183a0 2c 20 31 38 2c 0a 2f 2a 20 20 35 30 20 2a 2f 20  , 18,./*  50 */ 
183b0 20 31 39 2c 20 31 39 2c 20 32 30 2c 20 32 30 2c   19, 19, 20, 20,
183c0 20 32 31 2c 20 32 31 2c 20 32 32 2c 20 32 32 2c   21, 21, 22, 22,
183d0 20 32 33 2c 20 32 33 2c 0a 2f 2a 20 20 36 30 20   23, 23,./*  60 
183e0 2a 2f 20 20 32 34 2c 20 32 34 2c 20 32 35 2c 20  */  24, 24, 25, 
183f0 32 35 2c 20 32 36 2c 20 32 36 2c 20 32 37 2c 20  25, 26, 26, 27, 
18400 32 37 2c 20 32 38 2c 20 32 38 2c 0a 2f 2a 20 20  27, 28, 28,./*  
18410 37 30 20 2a 2f 20 20 32 39 2c 20 32 39 2c 20 33  70 */  29, 29, 3
18420 30 2c 20 33 30 2c 20 33 31 2c 20 33 31 2c 20 33  0, 30, 31, 31, 3
18430 32 2c 20 33 32 2c 20 33 33 2c 20 33 33 2c 0a 2f  2, 32, 33, 33,./
18440 2a 20 20 38 30 20 2a 2f 20 20 33 34 2c 20 33 34  *  80 */  34, 34
18450 2c 20 33 35 2c 20 33 35 2c 20 33 36 2c 20 33 36  , 35, 35, 36, 36
18460 2c 20 33 37 2c 20 33 37 2c 20 33 38 2c 20 33 38  , 37, 37, 38, 38
18470 2c 0a 2f 2a 20 20 39 30 20 2a 2f 20 20 33 39 2c  ,./*  90 */  39,
18480 20 33 39 2c 20 34 30 2c 20 34 30 2c 20 34 31 2c   39, 40, 40, 41,
18490 20 34 31 2c 20 34 32 2c 20 34 32 2c 20 34 33 2c   41, 42, 42, 43,
184a0 20 34 33 2c 0a 2f 2a 20 31 30 30 20 2a 2f 20 20   43,./* 100 */  
184b0 34 34 2c 20 34 34 2c 20 34 35 2c 20 34 35 2c 20  44, 44, 45, 45, 
184c0 34 36 2c 20 34 36 2c 20 34 37 2c 20 34 37 2c 20  46, 46, 47, 47, 
184d0 34 38 2c 20 34 38 2c 0a 2f 2a 20 31 31 30 20 2a  48, 48,./* 110 *
184e0 2f 20 20 34 39 2c 20 34 39 2c 20 35 30 2c 20 35  /  49, 49, 50, 5
184f0 30 2c 20 35 31 2c 20 35 31 2c 20 35 32 2c 20 35  0, 51, 51, 52, 5
18500 32 2c 20 35 33 2c 20 35 33 2c 0a 2f 2a 20 31 32  2, 53, 53,./* 12
18510 30 20 2a 2f 20 20 35 34 2c 20 35 34 2c 20 35 35  0 */  54, 54, 55
18520 2c 20 35 35 2c 20 35 36 2c 20 35 36 2c 20 35 37  , 55, 56, 56, 57
18530 2c 20 35 37 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 52  , 57.};../*.** R
18540 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68  eturn the length
18550 20 6f 66 20 74 68 65 20 64 61 74 61 20 63 6f 72   of the data cor
18560 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68  responding to th
18570 65 20 73 75 70 70 6c 69 65 64 20 73 65 72 69 61  e supplied seria
18580 6c 2d 74 79 70 65 2e 0a 2a 2f 0a 75 33 32 20 73  l-type..*/.u32 s
18590 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c  qlite3VdbeSerial
185a0 54 79 70 65 4c 65 6e 28 75 33 32 20 73 65 72 69  TypeLen(u32 seri
185b0 61 6c 5f 74 79 70 65 29 7b 0a 20 20 69 66 28 20  al_type){.  if( 
185c0 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d 31 32 38  serial_type>=128
185d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
185e0 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29 2f  serial_type-12)/
185f0 32 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  2;.  }else{.    
18600 61 73 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74  assert( serial_t
18610 79 70 65 3c 31 32 20 0a 20 20 20 20 20 20 20 20  ype<12 .        
18620 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 53 6d      || sqlite3Sm
18630 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72  allTypeSizes[ser
18640 69 61 6c 5f 74 79 70 65 5d 3d 3d 28 73 65 72 69  ial_type]==(seri
18650 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 2f 32 20  al_type - 12)/2 
18660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  );.    return sq
18670 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18680 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
18690 3b 0a 20 20 7d 0a 7d 0a 75 38 20 73 71 6c 69 74  ;.  }.}.u8 sqlit
186a0 65 33 56 64 62 65 4f 6e 65 42 79 74 65 53 65 72  e3VdbeOneByteSer
186b0 69 61 6c 54 79 70 65 4c 65 6e 28 75 38 20 73 65  ialTypeLen(u8 se
186c0 72 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 61 73  rial_type){.  as
186d0 73 65 72 74 28 20 73 65 72 69 61 6c 5f 74 79 70  sert( serial_typ
186e0 65 3c 31 32 38 20 29 3b 0a 20 20 72 65 74 75 72  e<128 );.  retur
186f0 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79  n sqlite3SmallTy
18700 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f 74  peSizes[serial_t
18710 79 70 65 5d 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  ype];  .}../*.**
18720 20 49 66 20 77 65 20 61 72 65 20 6f 6e 20 61 6e   If we are on an
18730 20 61 72 63 68 69 74 65 63 74 75 72 65 20 77 69   architecture wi
18740 74 68 20 6d 69 78 65 64 2d 65 6e 64 69 61 6e 20  th mixed-endian 
18750 66 6c 6f 61 74 69 6e 67 20 0a 2a 2a 20 70 6f 69  floating .** poi
18760 6e 74 73 20 28 65 78 3a 20 41 52 4d 37 29 20 74  nts (ex: ARM7) t
18770 68 65 6e 20 73 77 61 70 20 74 68 65 20 6c 6f 77  hen swap the low
18780 65 72 20 34 20 62 79 74 65 73 20 77 69 74 68 20  er 4 bytes with 
18790 74 68 65 20 0a 2a 2a 20 75 70 70 65 72 20 34 20  the .** upper 4 
187a0 62 79 74 65 73 2e 20 20 52 65 74 75 72 6e 20 74  bytes.  Return t
187b0 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
187c0 20 46 6f 72 20 6d 6f 73 74 20 61 72 63 68 69 74   For most archit
187d0 65 63 74 75 72 65 73 2c 20 74 68 69 73 20 69 73  ectures, this is
187e0 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
187f0 28 6c 61 74 65 72 29 3a 20 20 49 74 20 69 73 20  (later):  It is 
18800 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65 20 74  reported to me t
18810 68 61 74 20 74 68 65 20 6d 69 78 65 64 2d 65 6e  hat the mixed-en
18820 64 69 61 6e 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  dian problem.** 
18830 6f 6e 20 41 52 4d 37 20 69 73 20 61 6e 20 69 73  on ARM7 is an is
18840 73 75 65 20 77 69 74 68 20 47 43 43 2c 20 6e 6f  sue with GCC, no
18850 74 20 77 69 74 68 20 74 68 65 20 41 52 4d 37 20  t with the ARM7 
18860 63 68 69 70 2e 20 20 49 74 20 73 65 65 6d 73 0a  chip.  It seems.
18870 2a 2a 20 74 68 61 74 20 65 61 72 6c 79 20 76 65  ** that early ve
18880 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 73 74  rsions of GCC st
18890 6f 72 65 64 20 74 68 65 20 74 77 6f 20 77 6f 72  ored the two wor
188a0 64 73 20 6f 66 20 61 20 36 34 2d 62 69 74 0a 2a  ds of a 64-bit.*
188b0 2a 20 66 6c 6f 61 74 20 69 6e 20 74 68 65 20 77  * float in the w
188c0 72 6f 6e 67 20 6f 72 64 65 72 2e 20 20 41 6e 64  rong order.  And
188d0 20 74 68 61 74 20 65 72 72 6f 72 20 68 61 73 20   that error has 
188e0 62 65 65 6e 20 70 72 6f 70 61 67 61 74 65 64 0a  been propagated.
188f0 2a 2a 20 65 76 65 72 20 73 69 6e 63 65 2e 20 20  ** ever since.  
18900 54 68 65 20 62 6c 61 6d 65 20 69 73 20 6e 6f 74  The blame is not
18910 20 6e 65 63 65 73 73 61 72 69 6c 79 20 77 69 74   necessarily wit
18920 68 20 47 43 43 2c 20 74 68 6f 75 67 68 2e 0a 2a  h GCC, though..*
18930 2a 20 47 43 43 20 6d 69 67 68 74 20 68 61 76 65  * GCC might have
18940 20 6a 75 73 74 20 63 6f 70 79 69 6e 67 20 74 68   just copying th
18950 65 20 70 72 6f 62 6c 65 6d 20 66 72 6f 6d 20 61  e problem from a
18960 20 70 72 69 6f 72 20 63 6f 6d 70 69 6c 65 72 2e   prior compiler.
18970 0a 2a 2a 20 49 20 61 6d 20 61 6c 73 6f 20 74 6f  .** I am also to
18980 6c 64 20 74 68 61 74 20 6e 65 77 65 72 20 76 65  ld that newer ve
18990 72 73 69 6f 6e 73 20 6f 66 20 47 43 43 20 74 68  rsions of GCC th
189a0 61 74 20 66 6f 6c 6c 6f 77 20 61 20 64 69 66 66  at follow a diff
189b0 65 72 65 6e 74 0a 2a 2a 20 41 42 49 20 67 65 74  erent.** ABI get
189c0 20 74 68 65 20 62 79 74 65 20 6f 72 64 65 72 20   the byte order 
189d0 72 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 44 65 76  right..**.** Dev
189e0 65 6c 6f 70 65 72 73 20 75 73 69 6e 67 20 53 51  elopers using SQ
189f0 4c 69 74 65 20 6f 6e 20 61 6e 20 41 52 4d 37 20  Lite on an ARM7 
18a00 73 68 6f 75 6c 64 20 63 6f 6d 70 69 6c 65 20 61  should compile a
18a10 6e 64 20 72 75 6e 20 74 68 65 69 72 0a 2a 2a 20  nd run their.** 
18a20 61 70 70 6c 69 63 61 74 69 6f 6e 20 75 73 69 6e  application usin
18a30 67 20 2d 44 53 51 4c 49 54 45 5f 44 45 42 55 47  g -DSQLITE_DEBUG
18a40 3d 31 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65  =1 at least once
18a50 2e 20 20 57 69 74 68 20 44 45 42 55 47 0a 2a 2a  .  With DEBUG.**
18a60 20 65 6e 61 62 6c 65 64 2c 20 73 6f 6d 65 20 61   enabled, some a
18a70 73 73 65 72 74 73 20 62 65 6c 6f 77 20 77 69 6c  sserts below wil
18a80 6c 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  l ensure that th
18a90 65 20 62 79 74 65 20 6f 72 64 65 72 20 6f 66 0a  e byte order of.
18aa0 2a 2a 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  ** floating poin
18ab0 74 20 76 61 6c 75 65 73 20 69 73 20 63 6f 72 72  t values is corr
18ac0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 28 32 30 30 37  ect..**.** (2007
18ad0 2d 30 38 2d 33 30 29 20 20 46 72 61 6e 6b 20 76  -08-30)  Frank v
18ae0 61 6e 20 56 75 67 74 20 68 61 73 20 73 74 75 64  an Vugt has stud
18af0 69 65 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  ied this problem
18b00 20 63 6c 6f 73 65 6c 79 0a 2a 2a 20 61 6e 64 20   closely.** and 
18b10 68 61 73 20 73 65 6e 64 20 68 69 73 20 66 69 6e  has send his fin
18b20 64 69 6e 67 73 20 74 6f 20 74 68 65 20 53 51 4c  dings to the SQL
18b30 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73 2e 20  ite developers. 
18b40 20 46 72 61 6e 6b 0a 2a 2a 20 77 72 69 74 65 73   Frank.** writes
18b50 20 74 68 61 74 20 73 6f 6d 65 20 4c 69 6e 75 78   that some Linux
18b60 20 6b 65 72 6e 65 6c 73 20 6f 66 66 65 72 20 66   kernels offer f
18b70 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 68 61  loating point ha
18b80 72 64 77 61 72 65 0a 2a 2a 20 65 6d 75 6c 61 74  rdware.** emulat
18b90 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 6f 6e  ion that uses on
18ba0 6c 79 20 33 32 2d 62 69 74 20 6d 61 6e 74 69 73  ly 32-bit mantis
18bb0 73 61 73 20 69 6e 73 74 65 61 64 20 6f 66 20 61  sas instead of a
18bc0 20 66 75 6c 6c 20 0a 2a 2a 20 34 38 2d 62 69 74   full .** 48-bit
18bd0 73 20 61 73 20 72 65 71 75 69 72 65 64 20 62 79  s as required by
18be0 20 74 68 65 20 49 45 45 45 20 73 74 61 6e 64 61   the IEEE standa
18bf0 72 64 2e 20 20 28 54 68 69 73 20 69 73 20 74 68  rd.  (This is th
18c00 65 0a 2a 2a 20 43 4f 4e 46 49 47 5f 46 50 45 5f  e.** CONFIG_FPE_
18c10 46 41 53 54 46 50 45 20 6f 70 74 69 6f 6e 2e 29  FASTFPE option.)
18c20 20 20 4f 6e 20 73 75 63 68 20 73 79 73 74 65 6d    On such system
18c30 73 2c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e  s, floating poin
18c40 74 0a 2a 2a 20 62 79 74 65 20 73 77 61 70 70 69  t.** byte swappi
18c50 6e 67 20 62 65 63 6f 6d 65 73 20 76 65 72 79 20  ng becomes very 
18c60 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 20 54 6f  complicated.  To
18c70 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 2c   avoid problems,
18c80 0a 2a 2a 20 74 68 65 20 6e 65 63 65 73 73 61 72  .** the necessar
18c90 79 20 62 79 74 65 20 73 77 61 70 70 69 6e 67 20  y byte swapping 
18ca0 69 73 20 63 61 72 72 69 65 64 20 6f 75 74 20 75  is carried out u
18cb0 73 69 6e 67 20 61 20 36 34 2d 62 69 74 20 69 6e  sing a 64-bit in
18cc0 74 65 67 65 72 0a 2a 2a 20 72 61 74 68 65 72 20  teger.** rather 
18cd0 74 68 61 6e 20 61 20 36 34 2d 62 69 74 20 66 6c  than a 64-bit fl
18ce0 6f 61 74 2e 20 20 46 72 61 6e 6b 20 61 73 73 75  oat.  Frank assu
18cf0 72 65 73 20 75 73 20 74 68 61 74 20 74 68 65 20  res us that the 
18d00 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 77 6f 72  code here.** wor
18d10 6b 73 20 66 6f 72 20 68 69 6d 2e 20 20 57 65 2c  ks for him.  We,
18d20 20 74 68 65 20 64 65 76 65 6c 6f 70 65 72 73 2c   the developers,
18d30 20 68 61 76 65 20 6e 6f 20 77 61 79 20 74 6f 20   have no way to 
18d40 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 0a 2a 2a  independently.**
18d50 20 76 65 72 69 66 79 20 74 68 69 73 2c 20 62 75   verify this, bu
18d60 74 20 46 72 61 6e 6b 20 73 65 65 6d 73 20 74 6f  t Frank seems to
18d70 20 6b 6e 6f 77 20 77 68 61 74 20 68 65 20 69 73   know what he is
18d80 20 74 61 6c 6b 69 6e 67 20 61 62 6f 75 74 0a 2a   talking about.*
18d90 2a 20 73 6f 20 77 65 20 74 72 75 73 74 20 68 69  * so we trust hi
18da0 6d 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  m..*/.#ifdef SQL
18db0 49 54 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e  ITE_MIXED_ENDIAN
18dc0 5f 36 34 42 49 54 5f 46 4c 4f 41 54 0a 73 74 61  _64BIT_FLOAT.sta
18dd0 74 69 63 20 75 36 34 20 66 6c 6f 61 74 53 77 61  tic u64 floatSwa
18de0 70 28 75 36 34 20 69 6e 29 7b 0a 20 20 75 6e 69  p(u64 in){.  uni
18df0 6f 6e 20 7b 0a 20 20 20 20 75 36 34 20 72 3b 0a  on {.    u64 r;.
18e00 20 20 20 20 75 33 32 20 69 5b 32 5d 3b 0a 20 20      u32 i[2];.  
18e10 7d 20 75 3b 0a 20 20 75 33 32 20 74 3b 0a 0a 20  } u;.  u32 t;.. 
18e20 20 75 2e 72 20 3d 20 69 6e 3b 0a 20 20 74 20 3d   u.r = in;.  t =
18e30 20 75 2e 69 5b 30 5d 3b 0a 20 20 75 2e 69 5b 30   u.i[0];.  u.i[0
18e40 5d 20 3d 20 75 2e 69 5b 31 5d 3b 0a 20 20 75 2e  ] = u.i[1];.  u.
18e50 69 5b 31 5d 20 3d 20 74 3b 0a 20 20 72 65 74 75  i[1] = t;.  retu
18e60 72 6e 20 75 2e 72 3b 0a 7d 0a 23 20 64 65 66 69  rn u.r;.}.# defi
18e70 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
18e80 61 6e 46 6c 6f 61 74 28 58 29 20 20 58 20 3d 20  anFloat(X)  X = 
18e90 66 6c 6f 61 74 53 77 61 70 28 58 29 0a 23 65 6c  floatSwap(X).#el
18ea0 73 65 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70  se.# define swap
18eb0 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74  MixedEndianFloat
18ec0 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
18ed0 2a 20 57 72 69 74 65 20 74 68 65 20 73 65 72 69  * Write the seri
18ee0 61 6c 69 7a 65 64 20 64 61 74 61 20 62 6c 6f 62  alized data blob
18ef0 20 66 6f 72 20 74 68 65 20 76 61 6c 75 65 20 73   for the value s
18f00 74 6f 72 65 64 20 69 6e 20 70 4d 65 6d 20 69 6e  tored in pMem in
18f10 74 6f 20 0a 2a 2a 20 62 75 66 2e 20 49 74 20 69  to .** buf. It i
18f20 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
18f30 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c  he caller has al
18f40 6c 6f 63 61 74 65 64 20 73 75 66 66 69 63 69 65  located sufficie
18f50 6e 74 20 73 70 61 63 65 2e 0a 2a 2a 20 52 65 74  nt space..** Ret
18f60 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
18f70 66 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 2e  f bytes written.
18f80 0a 2a 2a 0a 2a 2a 20 6e 42 75 66 20 69 73 20 74  .**.** nBuf is t
18f90 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 73 70 61  he amount of spa
18fa0 63 65 20 6c 65 66 74 20 69 6e 20 62 75 66 5b 5d  ce left in buf[]
18fb0 2e 20 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73  .  The caller is
18fc0 20 72 65 73 70 6f 6e 73 69 62 6c 65 0a 2a 2a 20   responsible.** 
18fd0 66 6f 72 20 61 6c 6c 6f 63 61 74 69 6e 67 20 65  for allocating e
18fe0 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 62  nough space to b
18ff0 75 66 5b 5d 20 74 6f 20 68 6f 6c 64 20 74 68 65  uf[] to hold the
19000 20 65 6e 74 69 72 65 20 66 69 65 6c 64 2c 20 65   entire field, e
19010 78 63 6c 75 73 69 76 65 0a 2a 2a 20 6f 66 20 74  xclusive.** of t
19020 68 65 20 70 4d 65 6d 2d 3e 75 2e 6e 5a 65 72 6f  he pMem->u.nZero
19030 20 62 79 74 65 73 20 66 6f 72 20 61 20 4d 45 4d   bytes for a MEM
19040 5f 5a 65 72 6f 20 76 61 6c 75 65 2e 0a 2a 2a 0a  _Zero value..**.
19050 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
19060 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
19070 74 75 61 6c 6c 79 20 77 72 69 74 74 65 6e 20 69  tually written i
19080 6e 74 6f 20 62 75 66 5b 5d 2e 20 20 54 68 65 20  nto buf[].  The 
19090 6e 75 6d 62 65 72 0a 2a 2a 20 6f 66 20 62 79 74  number.** of byt
190a0 65 73 20 69 6e 20 74 68 65 20 7a 65 72 6f 2d 66  es in the zero-f
190b0 69 6c 6c 65 64 20 74 61 69 6c 20 69 73 20 69 6e  illed tail is in
190c0 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 72 65  cluded in the re
190d0 74 75 72 6e 20 76 61 6c 75 65 20 6f 6e 6c 79 0a  turn value only.
190e0 2a 2a 20 69 66 20 74 68 6f 73 65 20 62 79 74 65  ** if those byte
190f0 73 20 77 65 72 65 20 7a 65 72 6f 65 64 20 69 6e  s were zeroed in
19100 20 62 75 66 5b 5d 2e 0a 2a 2f 20 0a 75 33 32 20   buf[]..*/ .u32 
19110 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
19120 6c 50 75 74 28 75 38 20 2a 62 75 66 2c 20 4d 65  lPut(u8 *buf, Me
19130 6d 20 2a 70 4d 65 6d 2c 20 75 33 32 20 73 65 72  m *pMem, u32 ser
19140 69 61 6c 5f 74 79 70 65 29 7b 0a 20 20 75 33 32  ial_type){.  u32
19150 20 6c 65 6e 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65   len;..  /* Inte
19160 67 65 72 20 61 6e 64 20 52 65 61 6c 20 2a 2f 0a  ger and Real */.
19170 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70    if( serial_typ
19180 65 3c 3d 37 20 26 26 20 73 65 72 69 61 6c 5f 74  e<=7 && serial_t
19190 79 70 65 3e 30 20 29 7b 0a 20 20 20 20 75 36 34  ype>0 ){.    u64
191a0 20 76 3b 0a 20 20 20 20 75 33 32 20 69 3b 0a 20   v;.    u32 i;. 
191b0 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79     if( serial_ty
191c0 70 65 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 61  pe==7 ){.      a
191d0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 29  ssert( sizeof(v)
191e0 3d 3d 73 69 7a 65 6f 66 28 70 4d 65 6d 2d 3e 75  ==sizeof(pMem->u
191f0 2e 72 29 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  .r) );.      mem
19200 63 70 79 28 26 76 2c 20 26 70 4d 65 6d 2d 3e 75  cpy(&v, &pMem->u
19210 2e 72 2c 20 73 69 7a 65 6f 66 28 76 29 29 3b 0a  .r, sizeof(v));.
19220 20 20 20 20 20 20 73 77 61 70 4d 69 78 65 64 45        swapMixedE
19230 6e 64 69 61 6e 46 6c 6f 61 74 28 76 29 3b 0a 20  ndianFloat(v);. 
19240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19250 76 20 3d 20 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20  v = pMem->u.i;. 
19260 20 20 20 7d 0a 20 20 20 20 6c 65 6e 20 3d 20 69     }.    len = i
19270 20 3d 20 73 71 6c 69 74 65 33 53 6d 61 6c 6c 54   = sqlite3SmallT
19280 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61 6c 5f  ypeSizes[serial_
19290 74 79 70 65 5d 3b 0a 20 20 20 20 61 73 73 65 72  type];.    asser
192a0 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 64 6f  t( i>0 );.    do
192b0 7b 0a 20 20 20 20 20 20 62 75 66 5b 2d 2d 69 5d  {.      buf[--i]
192c0 20 3d 20 28 75 38 29 28 76 26 30 78 46 46 29 3b   = (u8)(v&0xFF);
192d0 0a 20 20 20 20 20 20 76 20 3e 3e 3d 20 38 3b 0a  .      v >>= 8;.
192e0 20 20 20 20 7d 77 68 69 6c 65 28 20 69 20 29 3b      }while( i );
192f0 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65 6e 3b  .    return len;
19300 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 72 69 6e  .  }..  /* Strin
19310 67 20 6f 72 20 62 6c 6f 62 20 2a 2f 0a 20 20 69  g or blob */.  i
19320 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
19330 31 32 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  12 ){.    assert
19340 28 20 70 4d 65 6d 2d 3e 6e 20 2b 20 28 28 70 4d  ( pMem->n + ((pM
19350 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  em->flags & MEM_
19360 5a 65 72 6f 29 3f 70 4d 65 6d 2d 3e 75 2e 6e 5a  Zero)?pMem->u.nZ
19370 65 72 6f 3a 30 29 0a 20 20 20 20 20 20 20 20 20  ero:0).         
19380 20 20 20 20 3d 3d 20 28 69 6e 74 29 73 71 6c 69      == (int)sqli
19390 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
193a0 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
193b0 29 20 29 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 70  ) );.    len = p
193c0 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 69 66 28 20  Mem->n;.    if( 
193d0 6c 65 6e 3e 30 20 29 20 6d 65 6d 63 70 79 28 62  len>0 ) memcpy(b
193e0 75 66 2c 20 70 4d 65 6d 2d 3e 7a 2c 20 6c 65 6e  uf, pMem->z, len
193f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 65  );.    return le
19400 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 55 4c  n;.  }..  /* NUL
19410 4c 20 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 30  L or constants 0
19420 20 6f 72 20 31 20 2a 2f 0a 20 20 72 65 74 75 72   or 1 */.  retur
19430 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 49 6e 70 75 74  n 0;.}../* Input
19440 20 22 78 22 20 69 73 20 61 20 73 65 71 75 65 6e   "x" is a sequen
19450 63 65 20 6f 66 20 75 6e 73 69 67 6e 65 64 20 63  ce of unsigned c
19460 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 72  haracters that r
19470 65 70 72 65 73 65 6e 74 20 61 0a 2a 2a 20 62 69  epresent a.** bi
19480 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
19490 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 65 71  .  Return the eq
194a0 75 69 76 61 6c 65 6e 74 20 6e 61 74 69 76 65 20  uivalent native 
194b0 69 6e 74 65 67 65 72 0a 2a 2f 0a 23 64 65 66 69  integer.*/.#defi
194c0 6e 65 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  ne ONE_BYTE_INT(
194d0 78 29 20 20 20 20 28 28 69 38 29 28 78 29 5b 30  x)    ((i8)(x)[0
194e0 5d 29 0a 23 64 65 66 69 6e 65 20 54 57 4f 5f 42  ]).#define TWO_B
194f0 59 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 32  YTE_INT(x)    (2
19500 35 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c  56*(i8)((x)[0])|
19510 28 78 29 5b 31 5d 29 0a 23 64 65 66 69 6e 65 20  (x)[1]).#define 
19520 54 48 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 78  THREE_BYTE_INT(x
19530 29 20 20 28 36 35 35 33 36 2a 28 69 38 29 28 28  )  (65536*(i8)((
19540 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31 5d 3c 3c  x)[0])|((x)[1]<<
19550 38 29 7c 28 78 29 5b 32 5d 29 0a 23 64 65 66 69  8)|(x)[2]).#defi
19560 6e 65 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e  ne FOUR_BYTE_UIN
19570 54 28 78 29 20 20 28 28 28 75 33 32 29 28 78 29  T(x)  (((u32)(x)
19580 5b 30 5d 3c 3c 32 34 29 7c 28 28 78 29 5b 31 5d  [0]<<24)|((x)[1]
19590 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c 38  <<16)|((x)[2]<<8
195a0 29 7c 28 78 29 5b 33 5d 29 0a 23 64 65 66 69 6e  )|(x)[3]).#defin
195b0 65 20 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28  e FOUR_BYTE_INT(
195c0 78 29 20 28 31 36 37 37 37 32 31 36 2a 28 69 38  x) (16777216*(i8
195d0 29 28 28 78 29 5b 30 5d 29 7c 28 28 78 29 5b 31  )((x)[0])|((x)[1
195e0 5d 3c 3c 31 36 29 7c 28 28 78 29 5b 32 5d 3c 3c  ]<<16)|((x)[2]<<
195f0 38 29 7c 28 78 29 5b 33 5d 29 0a 0a 2f 2a 0a 2a  8)|(x)[3])../*.*
19600 2a 20 44 65 73 65 72 69 61 6c 69 7a 65 20 74 68  * Deserialize th
19610 65 20 64 61 74 61 20 62 6c 6f 62 20 70 6f 69 6e  e data blob poin
19620 74 65 64 20 74 6f 20 62 79 20 62 75 66 20 61 73  ted to by buf as
19630 20 73 65 72 69 61 6c 20 74 79 70 65 20 73 65 72   serial type ser
19640 69 61 6c 5f 74 79 70 65 0a 2a 2a 20 61 6e 64 20  ial_type.** and 
19650 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
19660 20 69 6e 20 70 4d 65 6d 2e 20 20 52 65 74 75 72   in pMem.  Retur
19670 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
19680 62 79 74 65 73 20 72 65 61 64 2e 0a 2a 2a 0a 2a  bytes read..**.*
19690 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
196a0 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61  is implemented a
196b0 73 20 74 77 6f 20 73 65 70 61 72 61 74 65 20 72  s two separate r
196c0 6f 75 74 69 6e 65 73 20 66 6f 72 20 70 65 72 66  outines for perf
196d0 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20  ormance..** The 
196e0 66 65 77 20 63 61 73 65 73 20 74 68 61 74 20 72  few cases that r
196f0 65 71 75 69 72 65 20 6c 6f 63 61 6c 20 76 61 72  equire local var
19700 69 61 62 6c 65 73 20 61 72 65 20 62 72 6f 6b 65  iables are broke
19710 6e 20 6f 75 74 20 69 6e 74 6f 20 61 20 73 65 70  n out into a sep
19720 61 72 61 74 65 0a 2a 2a 20 72 6f 75 74 69 6e 65  arate.** routine
19730 20 73 6f 20 74 68 61 74 20 69 6e 20 6d 6f 73 74   so that in most
19740 20 63 61 73 65 73 20 74 68 65 20 6f 76 65 72 68   cases the overh
19750 65 61 64 20 6f 66 20 6d 6f 76 69 6e 67 20 74 68  ead of moving th
19760 65 20 73 74 61 63 6b 20 70 6f 69 6e 74 65 72 0a  e stack pointer.
19770 2a 2a 20 69 73 20 61 76 6f 69 64 65 64 2e 0a 2a  ** is avoided..*
19780 2f 20 0a 73 74 61 74 69 63 20 75 33 32 20 53 51  / .static u32 SQ
19790 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20 73 65  LITE_NOINLINE se
197a0 72 69 61 6c 47 65 74 28 0a 20 20 63 6f 6e 73 74  rialGet(.  const
197b0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
197c0 62 75 66 2c 20 20 20 20 20 2f 2a 20 42 75 66 66  buf,     /* Buff
197d0 65 72 20 74 6f 20 64 65 73 65 72 69 61 6c 69 7a  er to deserializ
197e0 65 20 66 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20  e from */.  u32 
197f0 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 20 20 20  serial_type,    
19800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 72            /* Ser
19810 69 61 6c 20 74 79 70 65 20 74 6f 20 64 65 73 65  ial type to dese
19820 72 69 61 6c 69 7a 65 20 2a 2f 0a 20 20 4d 65 6d  rialize */.  Mem
19830 20 2a 70 4d 65 6d 20 20 20 20 20 20 20 20 20 20   *pMem          
19840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
19850 6d 6f 72 79 20 63 65 6c 6c 20 74 6f 20 77 72 69  mory cell to wri
19860 74 65 20 76 61 6c 75 65 20 69 6e 74 6f 20 2a 2f  te value into */
19870 0a 29 7b 0a 20 20 75 36 34 20 78 20 3d 20 46 4f  .){.  u64 x = FO
19880 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66  UR_BYTE_UINT(buf
19890 29 3b 0a 20 20 75 33 32 20 79 20 3d 20 46 4f 55  );.  u32 y = FOU
198a0 52 5f 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b  R_BYTE_UINT(buf+
198b0 34 29 3b 0a 20 20 78 20 3d 20 28 78 3c 3c 33 32  4);.  x = (x<<32
198c0 29 20 2b 20 79 3b 0a 20 20 69 66 28 20 73 65 72  ) + y;.  if( ser
198d0 69 61 6c 5f 74 79 70 65 3d 3d 36 20 29 7b 0a 20  ial_type==6 ){. 
198e0 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f     /* EVIDENCE-O
198f0 46 3a 20 52 2d 32 39 38 35 31 2d 35 32 32 37 32  F: R-29851-52272
19900 20 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d   Value is a big-
19910 65 6e 64 69 61 6e 20 36 34 2d 62 69 74 0a 20 20  endian 64-bit.  
19920 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65    ** twos-comple
19930 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f  ment integer. */
19940 0a 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d  .    pMem->u.i =
19950 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20   *(i64*)&x;.    
19960 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19970 4d 5f 49 6e 74 3b 0a 20 20 20 20 74 65 73 74 63  M_Int;.    testc
19980 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30  ase( pMem->u.i<0
19990 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
199a0 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a   /* EVIDENCE-OF:
199b0 20 52 2d 35 37 33 34 33 2d 34 39 31 31 34 20 56   R-57343-49114 V
199c0 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65 6e  alue is a big-en
199d0 64 69 61 6e 20 49 45 45 45 20 37 35 34 2d 32 30  dian IEEE 754-20
199e0 30 38 20 36 34 2d 62 69 74 0a 20 20 20 20 2a 2a  08 64-bit.    **
199f0 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20   floating point 
19a00 6e 75 6d 62 65 72 2e 20 2a 2f 0a 23 69 66 20 21  number. */.#if !
19a10 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
19a20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
19a30 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
19a40 5f 50 4f 49 4e 54 29 0a 20 20 20 20 2f 2a 20 56  _POINT).    /* V
19a50 65 72 69 66 79 20 74 68 61 74 20 69 6e 74 65 67  erify that integ
19a60 65 72 73 20 61 6e 64 20 66 6c 6f 61 74 69 6e 67  ers and floating
19a70 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 75 73   point values us
19a80 65 20 74 68 65 20 73 61 6d 65 0a 20 20 20 20 2a  e the same.    *
19a90 2a 20 62 79 74 65 20 6f 72 64 65 72 2e 20 20 4f  * byte order.  O
19aa0 72 2c 20 74 68 61 74 20 69 66 20 53 51 4c 49 54  r, that if SQLIT
19ab0 45 5f 4d 49 58 45 44 5f 45 4e 44 49 41 4e 5f 36  E_MIXED_ENDIAN_6
19ac0 34 42 49 54 5f 46 4c 4f 41 54 20 69 73 0a 20 20  4BIT_FLOAT is.  
19ad0 20 20 2a 2a 20 64 65 66 69 6e 65 64 20 74 68 61    ** defined tha
19ae0 74 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69 6e  t 64-bit floatin
19af0 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20 72  g point values r
19b00 65 61 6c 6c 79 20 61 72 65 20 6d 69 78 65 64 0a  eally are mixed.
19b10 20 20 20 20 2a 2a 20 65 6e 64 69 61 6e 2e 0a 20      ** endian.. 
19b20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61 74 69 63     */.    static
19b30 20 63 6f 6e 73 74 20 75 36 34 20 74 31 20 3d 20   const u64 t1 = 
19b40 28 28 75 36 34 29 30 78 33 66 66 30 30 30 30 30  ((u64)0x3ff00000
19b50 29 3c 3c 33 32 3b 0a 20 20 20 20 73 74 61 74 69  )<<32;.    stati
19b60 63 20 63 6f 6e 73 74 20 64 6f 75 62 6c 65 20 72  c const double r
19b70 31 20 3d 20 31 2e 30 3b 0a 20 20 20 20 75 36 34  1 = 1.0;.    u64
19b80 20 74 32 20 3d 20 74 31 3b 0a 20 20 20 20 73 77   t2 = t1;.    sw
19b90 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f  apMixedEndianFlo
19ba0 61 74 28 74 32 29 3b 0a 20 20 20 20 61 73 73 65  at(t2);.    asse
19bb0 72 74 28 20 73 69 7a 65 6f 66 28 72 31 29 3d 3d  rt( sizeof(r1)==
19bc0 73 69 7a 65 6f 66 28 74 32 29 20 26 26 20 6d 65  sizeof(t2) && me
19bd0 6d 63 6d 70 28 26 72 31 2c 20 26 74 32 2c 20 73  mcmp(&r1, &t2, s
19be0 69 7a 65 6f 66 28 72 31 29 29 3d 3d 30 20 29 3b  izeof(r1))==0 );
19bf0 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65  .#endif.    asse
19c00 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38  rt( sizeof(x)==8
19c10 20 26 26 20 73 69 7a 65 6f 66 28 70 4d 65 6d 2d   && sizeof(pMem-
19c20 3e 75 2e 72 29 3d 3d 38 20 29 3b 0a 20 20 20 20  >u.r)==8 );.    
19c30 73 77 61 70 4d 69 78 65 64 45 6e 64 69 61 6e 46  swapMixedEndianF
19c40 6c 6f 61 74 28 78 29 3b 0a 20 20 20 20 6d 65 6d  loat(x);.    mem
19c50 63 70 79 28 26 70 4d 65 6d 2d 3e 75 2e 72 2c 20  cpy(&pMem->u.r, 
19c60 26 78 2c 20 73 69 7a 65 6f 66 28 78 29 29 3b 0a  &x, sizeof(x));.
19c70 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
19c80 3d 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 70  = sqlite3IsNaN(p
19c90 4d 65 6d 2d 3e 75 2e 72 29 20 3f 20 4d 45 4d 5f  Mem->u.r) ? MEM_
19ca0 4e 75 6c 6c 20 3a 20 4d 45 4d 5f 52 65 61 6c 3b  Null : MEM_Real;
19cb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 38 3b  .  }.  return 8;
19cc0 0a 7d 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  .}.u32 sqlite3Vd
19cd0 62 65 53 65 72 69 61 6c 47 65 74 28 0a 20 20 63  beSerialGet(.  c
19ce0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19cf0 61 72 20 2a 62 75 66 2c 20 20 20 20 20 2f 2a 20  ar *buf,     /* 
19d00 42 75 66 66 65 72 20 74 6f 20 64 65 73 65 72 69  Buffer to deseri
19d10 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f 0a 20 20  alize from */.  
19d20 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  u32 serial_type,
19d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19d40 20 53 65 72 69 61 6c 20 74 79 70 65 20 74 6f 20   Serial type to 
19d50 64 65 73 65 72 69 61 6c 69 7a 65 20 2a 2f 0a 20  deserialize */. 
19d60 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20 20 20 20   Mem *pMem      
19d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19d80 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c 20 74 6f  * Memory cell to
19d90 20 77 72 69 74 65 20 76 61 6c 75 65 20 69 6e 74   write value int
19da0 6f 20 2a 2f 0a 29 7b 0a 20 20 73 77 69 74 63 68  o */.){.  switch
19db0 28 20 73 65 72 69 61 6c 5f 74 79 70 65 20 29 7b  ( serial_type ){
19dc0 0a 20 20 20 20 63 61 73 65 20 31 30 3a 20 20 20  .    case 10:   
19dd0 2f 2a 20 52 65 73 65 72 76 65 64 20 66 6f 72 20  /* Reserved for 
19de0 66 75 74 75 72 65 20 75 73 65 20 2a 2f 0a 20 20  future use */.  
19df0 20 20 63 61 73 65 20 31 31 3a 20 20 20 2f 2a 20    case 11:   /* 
19e00 52 65 73 65 72 76 65 64 20 66 6f 72 20 66 75 74  Reserved for fut
19e10 75 72 65 20 75 73 65 20 2a 2f 0a 20 20 20 20 63  ure use */.    c
19e20 61 73 65 20 30 3a 20 7b 20 20 2f 2a 20 4e 75 6c  ase 0: {  /* Nul
19e30 6c 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56  l */.      /* EV
19e40 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 34 30  IDENCE-OF: R-240
19e50 37 38 2d 30 39 33 37 35 20 56 61 6c 75 65 20 69  78-09375 Value i
19e60 73 20 61 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20  s a NULL. */.   
19e70 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d     pMem->flags =
19e80 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20 20   MEM_Null;.     
19e90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
19ea0 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
19eb0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19ec0 3a 20 52 2d 34 34 38 38 35 2d 32 35 31 39 36 20  : R-44885-25196 
19ed0 56 61 6c 75 65 20 69 73 20 61 6e 20 38 2d 62 69  Value is an 8-bi
19ee0 74 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  t twos-complemen
19ef0 74 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 67  t.      ** integ
19f00 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65  er. */.      pMe
19f10 6d 2d 3e 75 2e 69 20 3d 20 4f 4e 45 5f 42 59 54  m->u.i = ONE_BYT
19f20 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
19f30 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
19f40 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
19f50 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
19f60 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
19f70 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
19f80 20 20 63 61 73 65 20 32 3a 20 7b 20 2f 2a 20 32    case 2: { /* 2
19f90 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
19fa0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
19fb0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
19fc0 34 39 37 39 34 2d 33 35 30 32 36 20 56 61 6c 75  49794-35026 Valu
19fd0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
19fe0 6e 20 31 36 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 16-bit.      *
19ff0 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a000 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a010 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a020 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  TWO_BYTE_INT(buf
1a030 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
1a040 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
1a050 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1a060 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
1a070 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
1a080 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
1a090 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20 73 69 67   { /* 3-byte sig
1a0a0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a0b0 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a0c0 2d 4f 46 3a 20 52 2d 33 37 38 33 39 2d 35 34 33  -OF: R-37839-543
1a0d0 30 31 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  01 Value is a bi
1a0e0 67 2d 65 6e 64 69 61 6e 20 32 34 2d 62 69 74 0a  g-endian 24-bit.
1a0f0 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1a100 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a110 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a120 3e 75 2e 69 20 3d 20 54 48 52 45 45 5f 42 59 54  >u.i = THREE_BYT
1a130 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20  E_INT(buf);.    
1a140 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20    pMem->flags = 
1a150 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74  MEM_Int;.      t
1a160 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75  estcase( pMem->u
1a170 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65  .i<0 );.      re
1a180 74 75 72 6e 20 33 3b 0a 20 20 20 20 7d 0a 20 20  turn 3;.    }.  
1a190 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a 20 34    case 4: { /* 4
1a1a0 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74  -byte signed int
1a1b0 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  eger */.      /*
1a1c0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a1d0 30 31 38 34 39 2d 32 36 30 37 39 20 56 61 6c 75  01849-26079 Valu
1a1e0 65 20 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61  e is a big-endia
1a1f0 6e 20 33 32 2d 62 69 74 0a 20 20 20 20 20 20 2a  n 32-bit.      *
1a200 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e  * twos-complemen
1a210 74 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  t integer. */.  
1a220 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
1a230 46 4f 55 52 5f 42 59 54 45 5f 49 4e 54 28 62 75  FOUR_BYTE_INT(bu
1a240 66 29 3b 0a 23 69 66 64 65 66 20 5f 5f 48 50 5f  f);.#ifdef __HP_
1a250 63 63 20 0a 20 20 20 20 20 20 2f 2a 20 57 6f 72  cc .      /* Wor
1a260 6b 20 61 72 6f 75 6e 64 20 61 20 73 69 67 6e 2d  k around a sign-
1a270 65 78 74 65 6e 73 69 6f 6e 20 62 75 67 20 69 6e  extension bug in
1a280 20 74 68 65 20 48 50 20 63 6f 6d 70 69 6c 65 72   the HP compiler
1a290 20 66 6f 72 20 48 50 2f 55 58 20 2a 2f 0a 20 20   for HP/UX */.  
1a2a0 20 20 20 20 69 66 28 20 62 75 66 5b 30 5d 26 30      if( buf[0]&0
1a2b0 78 38 30 20 29 20 70 4d 65 6d 2d 3e 75 2e 69 20  x80 ) pMem->u.i 
1a2c0 7c 3d 20 30 78 66 66 66 66 66 66 66 66 38 30 30  |= 0xffffffff800
1a2d0 30 30 30 30 30 4c 4c 3b 0a 23 65 6e 64 69 66 0a  00000LL;.#endif.
1a2e0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67        pMem->flag
1a2f0 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20  s = MEM_Int;.   
1a300 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65     testcase( pMe
1a310 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20  m->u.i<0 );.    
1a320 20 20 72 65 74 75 72 6e 20 34 3b 0a 20 20 20 20    return 4;.    
1a330 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
1a340 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
1a350 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
1a360 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
1a370 3a 20 52 2d 35 30 33 38 35 2d 30 39 36 37 34 20  : R-50385-09674 
1a380 56 61 6c 75 65 20 69 73 20 61 20 62 69 67 2d 65  Value is a big-e
1a390 6e 64 69 61 6e 20 34 38 2d 62 69 74 0a 20 20 20  ndian 48-bit.   
1a3a0 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f 6d 70 6c     ** twos-compl
1a3b0 65 6d 65 6e 74 20 69 6e 74 65 67 65 72 2e 20 2a  ement integer. *
1a3c0 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e  /.      pMem->u.
1a3d0 69 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  i = FOUR_BYTE_UI
1a3e0 4e 54 28 62 75 66 2b 32 29 20 2b 20 28 28 28 69  NT(buf+2) + (((i
1a3f0 36 34 29 31 29 3c 3c 33 32 29 2a 54 57 4f 5f 42  64)1)<<32)*TWO_B
1a400 59 54 45 5f 49 4e 54 28 62 75 66 29 3b 0a 20 20  YTE_INT(buf);.  
1a410 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20      pMem->flags 
1a420 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20 20 20 20  = MEM_Int;.     
1a430 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d 2d   testcase( pMem-
1a440 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 20 20 20 20  >u.i<0 );.      
1a450 72 65 74 75 72 6e 20 36 3b 0a 20 20 20 20 7d 0a  return 6;.    }.
1a460 20 20 20 20 63 61 73 65 20 36 3a 20 20 20 2f 2a      case 6:   /*
1a470 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
1a480 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 63 61  nteger */.    ca
1a490 73 65 20 37 3a 20 7b 20 2f 2a 20 49 45 45 45 20  se 7: { /* IEEE 
1a4a0 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 2a  floating point *
1a4b0 2f 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 73 65  /.      /* These
1a4c0 20 75 73 65 20 6c 6f 63 61 6c 20 76 61 72 69 61   use local varia
1a4d0 62 6c 65 73 2c 20 73 6f 20 64 6f 20 74 68 65 6d  bles, so do them
1a4e0 20 69 6e 20 61 20 73 65 70 61 72 61 74 65 20 72   in a separate r
1a4f0 6f 75 74 69 6e 65 0a 20 20 20 20 20 20 2a 2a 20  outine.      ** 
1a500 74 6f 20 61 76 6f 69 64 20 68 61 76 69 6e 67 20  to avoid having 
1a510 74 6f 20 6d 6f 76 65 20 74 68 65 20 66 72 61 6d  to move the fram
1a520 65 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65  e pointer in the
1a530 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 2a 2f 0a   common case */.
1a540 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 65 72        return ser
1a550 69 61 6c 47 65 74 28 62 75 66 2c 73 65 72 69 61  ialGet(buf,seria
1a560 6c 5f 74 79 70 65 2c 70 4d 65 6d 29 3b 0a 20 20  l_type,pMem);.  
1a570 20 20 7d 0a 20 20 20 20 63 61 73 65 20 38 3a 20    }.    case 8: 
1a580 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 30 20     /* Integer 0 
1a590 2a 2f 0a 20 20 20 20 63 61 73 65 20 39 3a 20 7b  */.    case 9: {
1a5a0 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 31 20 2a    /* Integer 1 *
1a5b0 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45  /.      /* EVIDE
1a5c0 4e 43 45 2d 4f 46 3a 20 52 2d 31 32 39 37 36 2d  NCE-OF: R-12976-
1a5d0 32 32 38 39 33 20 56 61 6c 75 65 20 69 73 20 74  22893 Value is t
1a5e0 68 65 20 69 6e 74 65 67 65 72 20 30 2e 20 2a 2f  he integer 0. */
1a5f0 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
1a600 43 45 2d 4f 46 3a 20 52 2d 31 38 31 34 33 2d 31  CE-OF: R-18143-1
1a610 32 31 32 31 20 56 61 6c 75 65 20 69 73 20 74 68  2121 Value is th
1a620 65 20 69 6e 74 65 67 65 72 20 31 2e 20 2a 2f 0a  e integer 1. */.
1a630 20 20 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20        pMem->u.i 
1a640 3d 20 73 65 72 69 61 6c 5f 74 79 70 65 2d 38 3b  = serial_type-8;
1a650 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  .      pMem->fla
1a660 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
1a670 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1a680 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
1a690 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
1a6a0 45 4e 43 45 2d 4f 46 3a 20 52 2d 31 34 36 30 36  ENCE-OF: R-14606
1a6b0 2d 33 31 35 36 34 20 56 61 6c 75 65 20 69 73 20  -31564 Value is 
1a6c0 61 20 42 4c 4f 42 20 74 68 61 74 20 69 73 20 28  a BLOB that is (
1a6d0 4e 2d 31 32 29 2f 32 20 62 79 74 65 73 20 69 6e  N-12)/2 bytes in
1a6e0 0a 20 20 20 20 20 20 2a 2a 20 6c 65 6e 67 74 68  .      ** length
1a6f0 2e 0a 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45  ..      ** EVIDE
1a700 4e 43 45 2d 4f 46 3a 20 52 2d 32 38 34 30 31 2d  NCE-OF: R-28401-
1a710 30 30 31 34 30 20 56 61 6c 75 65 20 69 73 20 61  00140 Value is a
1a720 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65 20 74   string in the t
1a730 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 61 6e 64  ext encoding and
1a740 0a 20 20 20 20 20 20 2a 2a 20 28 4e 2d 31 33 29  .      ** (N-13)
1a750 2f 32 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67  /2 bytes in leng
1a760 74 68 2e 20 2a 2f 0a 20 20 20 20 20 20 73 74 61  th. */.      sta
1a770 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 61 46  tic const u16 aF
1a780 6c 61 67 5b 5d 20 3d 20 7b 20 4d 45 4d 5f 42 6c  lag[] = { MEM_Bl
1a790 6f 62 7c 4d 45 4d 5f 45 70 68 65 6d 2c 20 4d 45  ob|MEM_Ephem, ME
1a7a0 4d 5f 53 74 72 7c 4d 45 4d 5f 45 70 68 65 6d 20  M_Str|MEM_Ephem 
1a7b0 7d 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 7a  };.      pMem->z
1a7c0 20 3d 20 28 63 68 61 72 20 2a 29 62 75 66 3b 0a   = (char *)buf;.
1a7d0 20 20 20 20 20 20 70 4d 65 6d 2d 3e 6e 20 3d 20        pMem->n = 
1a7e0 28 73 65 72 69 61 6c 5f 74 79 70 65 2d 31 32 29  (serial_type-12)
1a7f0 2f 32 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e  /2;.      pMem->
1a800 66 6c 61 67 73 20 3d 20 61 46 6c 61 67 5b 73 65  flags = aFlag[se
1a810 72 69 61 6c 5f 74 79 70 65 26 31 5d 3b 0a 20 20  rial_type&1];.  
1a820 20 20 20 20 72 65 74 75 72 6e 20 70 4d 65 6d 2d      return pMem-
1a830 3e 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  >n;.    }.  }.  
1a840 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 2f 2a 0a 2a  return 0;.}./*.*
1a850 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
1a860 73 20 75 73 65 64 20 74 6f 20 61 6c 6c 6f 63 61  s used to alloca
1a870 74 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  te sufficient sp
1a880 61 63 65 20 66 6f 72 20 61 6e 20 55 6e 70 61 63  ace for an Unpac
1a890 6b 65 64 52 65 63 6f 72 64 0a 2a 2a 20 73 74 72  kedRecord.** str
1a8a0 75 63 74 75 72 65 20 6c 61 72 67 65 20 65 6e 6f  ucture large eno
1a8b0 75 67 68 20 74 6f 20 62 65 20 75 73 65 64 20 77  ugh to be used w
1a8c0 69 74 68 20 73 71 6c 69 74 65 33 56 64 62 65 52  ith sqlite3VdbeR
1a8d0 65 63 6f 72 64 55 6e 70 61 63 6b 28 29 20 69 66  ecordUnpack() if
1a8e0 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 61 72  .** the first ar
1a8f0 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e  gument is a poin
1a900 74 65 72 20 74 6f 20 4b 65 79 49 6e 66 6f 20 73  ter to KeyInfo s
1a910 74 72 75 63 74 75 72 65 20 70 4b 65 79 49 6e 66  tructure pKeyInf
1a920 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 70 61  o..**.** The spa
1a930 63 65 20 69 73 20 65 69 74 68 65 72 20 61 6c 6c  ce is either all
1a940 6f 63 61 74 65 64 20 75 73 69 6e 67 20 73 71 6c  ocated using sql
1a950 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28  ite3DbMallocRaw(
1a960 29 20 6f 72 20 66 72 6f 6d 20 77 69 74 68 69 6e  ) or from within
1a970 0a 2a 2a 20 74 68 65 20 75 6e 61 6c 69 67 6e 65  .** the unaligne
1a980 64 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  d buffer passed 
1a990 76 69 61 20 74 68 65 20 73 65 63 6f 6e 64 20 61  via the second a
1a9a0 6e 64 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  nd third argumen
1a9b0 74 73 20 28 70 72 65 73 75 6d 61 62 6c 79 0a 2a  ts (presumably.*
1a9c0 2a 20 73 74 61 63 6b 20 73 70 61 63 65 29 2e 20  * stack space). 
1a9d0 49 66 20 74 68 65 20 66 6f 72 6d 65 72 2c 20 74  If the former, t
1a9e0 68 65 6e 20 2a 70 70 46 72 65 65 20 69 73 20 73  hen *ppFree is s
1a9f0 65 74 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 20  et to a pointer 
1aa00 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
1aa10 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65  e eventually fre
1aa20 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1aa30 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 44 62   using sqlite3Db
1aa40 46 72 65 65 28 29 2e 20 4f 72 2c 20 69 66 20 74  Free(). Or, if t
1aa50 68 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69 6f  he .** allocatio
1aa60 6e 20 63 6f 6d 65 73 20 66 72 6f 6d 20 74 68 65  n comes from the
1aa70 20 70 53 70 61 63 65 2f 73 7a 53 70 61 63 65 20   pSpace/szSpace 
1aa80 62 75 66 66 65 72 2c 20 2a 70 70 46 72 65 65 20  buffer, *ppFree 
1aa90 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a  is set to NULL.*
1aaa0 2a 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  * before returni
1aab0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ng..**.** If an 
1aac0 4f 4f 4d 20 65 72 72 6f 72 20 6f 63 63 75 72 73  OOM error occurs
1aad0 2c 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  , NULL is return
1aae0 65 64 2e 0a 2a 2f 0a 55 6e 70 61 63 6b 65 64 52  ed..*/.UnpackedR
1aaf0 65 63 6f 72 64 20 2a 73 71 6c 69 74 65 33 56 64  ecord *sqlite3Vd
1ab00 62 65 41 6c 6c 6f 63 55 6e 70 61 63 6b 65 64 52  beAllocUnpackedR
1ab10 65 63 6f 72 64 28 0a 20 20 4b 65 79 49 6e 66 6f  ecord(.  KeyInfo
1ab20 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
1ab30 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 63           /* Desc
1ab40 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 72  ription of the r
1ab50 65 63 6f 72 64 20 2a 2f 0a 20 20 63 68 61 72 20  ecord */.  char 
1ab60 2a 70 53 70 61 63 65 2c 20 20 20 20 20 20 20 20  *pSpace,        
1ab70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
1ab80 61 6c 69 67 6e 65 64 20 73 70 61 63 65 20 61 76  aligned space av
1ab90 61 69 6c 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74  ailable */.  int
1aba0 20 73 7a 53 70 61 63 65 2c 20 20 20 20 20 20 20   szSpace,       
1abb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1abc0 53 69 7a 65 20 6f 66 20 70 53 70 61 63 65 5b 5d  Size of pSpace[]
1abd0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 63   in bytes */.  c
1abe0 68 61 72 20 2a 2a 70 70 46 72 65 65 20 20 20 20  har **ppFree    
1abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac00 2a 20 4f 55 54 3a 20 43 61 6c 6c 65 72 20 73 68  * OUT: Caller sh
1ac10 6f 75 6c 64 20 66 72 65 65 20 74 68 69 73 20 70  ould free this p
1ac20 6f 69 6e 74 65 72 20 2a 2f 0a 29 7b 0a 20 20 55  ointer */.){.  U
1ac30 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70  npackedRecord *p
1ac40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1ac50 2a 20 55 6e 70 61 63 6b 65 64 20 72 65 63 6f 72  * Unpacked recor
1ac60 64 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20  d to return */. 
1ac70 20 69 6e 74 20 6e 4f 66 66 3b 20 20 20 20 20 20   int nOff;      
1ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac90 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 70 53   /* Increment pS
1aca0 70 61 63 65 20 62 79 20 6e 4f 66 66 20 74 6f 20  pace by nOff to 
1acb0 61 6c 69 67 6e 20 69 74 20 2a 2f 0a 20 20 69 6e  align it */.  in
1acc0 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20 20  t nByte;        
1acd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ace0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1acf0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 2a 70   required for *p
1ad00 20 2a 2f 0a 0a 20 20 2f 2a 20 57 65 20 77 61 6e   */..  /* We wan
1ad10 74 20 74 6f 20 73 68 69 66 74 20 74 68 65 20 70  t to shift the p
1ad20 6f 69 6e 74 65 72 20 70 53 70 61 63 65 20 75 70  ointer pSpace up
1ad30 20 73 75 63 68 20 74 68 61 74 20 69 74 20 69 73   such that it is
1ad40 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 2e   8-byte aligned.
1ad50 0a 20 20 2a 2a 20 54 68 75 73 2c 20 77 65 20 6e  .  ** Thus, we n
1ad60 65 65 64 20 74 6f 20 63 61 6c 63 75 6c 61 74 65  eed to calculate
1ad70 20 61 20 76 61 6c 75 65 2c 20 6e 4f 66 66 2c 20   a value, nOff, 
1ad80 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 37 2c  between 0 and 7,
1ad90 20 74 6f 20 73 68 69 66 74 20 0a 20 20 2a 2a 20   to shift .  ** 
1ada0 69 74 20 62 79 2e 20 20 49 66 20 70 53 70 61 63  it by.  If pSpac
1adb0 65 20 69 73 20 61 6c 72 65 61 64 79 20 38 2d 62  e is already 8-b
1adc0 79 74 65 20 61 6c 69 67 6e 65 64 2c 20 6e 4f 66  yte aligned, nOf
1add0 66 20 73 68 6f 75 6c 64 20 62 65 20 7a 65 72 6f  f should be zero
1ade0 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 66 66 20 3d 20  ..  */.  nOff = 
1adf0 28 38 20 2d 20 28 53 51 4c 49 54 45 5f 50 54 52  (8 - (SQLITE_PTR
1ae00 5f 54 4f 5f 49 4e 54 28 70 53 70 61 63 65 29 20  _TO_INT(pSpace) 
1ae10 26 20 37 29 29 20 26 20 37 3b 0a 20 20 6e 42 79  & 7)) & 7;.  nBy
1ae20 74 65 20 3d 20 52 4f 55 4e 44 38 28 73 69 7a 65  te = ROUND8(size
1ae30 6f 66 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72  of(UnpackedRecor
1ae40 64 29 29 20 2b 20 73 69 7a 65 6f 66 28 4d 65 6d  d)) + sizeof(Mem
1ae50 29 2a 28 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  )*(pKeyInfo->nFi
1ae60 65 6c 64 2b 31 29 3b 0a 20 20 69 66 28 20 6e 42  eld+1);.  if( nB
1ae70 79 74 65 3e 73 7a 53 70 61 63 65 2b 6e 4f 66 66  yte>szSpace+nOff
1ae80 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 55 6e 70   ){.    p = (Unp
1ae90 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 29 73 71  ackedRecord *)sq
1aea0 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
1aeb0 28 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2c 20 6e  (pKeyInfo->db, n
1aec0 42 79 74 65 29 3b 0a 20 20 20 20 2a 70 70 46 72  Byte);.    *ppFr
1aed0 65 65 20 3d 20 28 63 68 61 72 20 2a 29 70 3b 0a  ee = (char *)p;.
1aee0 20 20 20 20 69 66 28 20 21 70 20 29 20 72 65 74      if( !p ) ret
1aef0 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  urn 0;.  }else{.
1af00 20 20 20 20 70 20 3d 20 28 55 6e 70 61 63 6b 65      p = (Unpacke
1af10 64 52 65 63 6f 72 64 2a 29 26 70 53 70 61 63 65  dRecord*)&pSpace
1af20 5b 6e 4f 66 66 5d 3b 0a 20 20 20 20 2a 70 70 46  [nOff];.    *ppF
1af30 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  ree = 0;.  }..  
1af40 70 2d 3e 61 4d 65 6d 20 3d 20 28 4d 65 6d 2a 29  p->aMem = (Mem*)
1af50 26 28 28 63 68 61 72 2a 29 70 29 5b 52 4f 55 4e  &((char*)p)[ROUN
1af60 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1af70 65 64 52 65 63 6f 72 64 29 29 5d 3b 0a 20 20 61  edRecord))];.  a
1af80 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d  ssert( pKeyInfo-
1af90 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d 30 20 29  >aSortOrder!=0 )
1afa0 3b 0a 20 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 20  ;.  p->pKeyInfo 
1afb0 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 2d  = pKeyInfo;.  p-
1afc0 3e 6e 46 69 65 6c 64 20 3d 20 70 4b 65 79 49 6e  >nField = pKeyIn
1afd0 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 31 3b 0a  fo->nField + 1;.
1afe0 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
1aff0 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
1b000 4b 65 79 2d 62 79 74 65 20 65 6e 63 6f 64 69 6e  Key-byte encodin
1b010 67 20 6f 66 20 61 20 72 65 63 6f 72 64 20 69 6e  g of a record in
1b020 20 70 4b 65 79 5b 5d 2c 20 70 6f 70 75 6c 61 74   pKey[], populat
1b030 65 20 74 68 65 20 0a 2a 2a 20 55 6e 70 61 63 6b  e the .** Unpack
1b040 65 64 52 65 63 6f 72 64 20 73 74 72 75 63 74 75  edRecord structu
1b050 72 65 20 69 6e 64 69 63 61 74 65 64 20 62 79 20  re indicated by 
1b060 74 68 65 20 66 6f 75 72 74 68 20 61 72 67 75 6d  the fourth argum
1b070 65 6e 74 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  ent with the.** 
1b080 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
1b090 64 65 63 6f 64 65 64 20 72 65 63 6f 72 64 2e 0a  decoded record..
1b0a0 2a 2f 20 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  */ .void sqlite3
1b0b0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1b0c0 28 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  (.  KeyInfo *pKe
1b0d0 79 49 6e 66 6f 2c 20 20 20 20 20 2f 2a 20 49 6e  yInfo,     /* In
1b0e0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
1b0f0 74 68 65 20 72 65 63 6f 72 64 20 66 6f 72 6d 61  the record forma
1b100 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4b 65 79 2c  t */.  int nKey,
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b120 20 53 69 7a 65 20 6f 66 20 74 68 65 20 62 69 6e   Size of the bin
1b130 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  ary record */.  
1b140 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b150 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 69  ,      /* The bi
1b160 6e 61 72 79 20 72 65 63 6f 72 64 20 2a 2f 0a 20  nary record */. 
1b170 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1b180 2a 70 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c  *p      /* Popul
1b190 61 74 65 20 74 68 69 73 20 73 74 72 75 63 74 75  ate this structu
1b1a0 72 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  re before return
1b1b0 69 6e 67 2e 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  ing. */.){.  con
1b1c0 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
1b1d0 20 2a 61 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20   *aKey = (const 
1b1e0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
1b1f0 70 4b 65 79 3b 0a 20 20 69 6e 74 20 64 3b 20 0a  pKey;.  int d; .
1b200 20 20 75 33 32 20 69 64 78 3b 20 20 20 20 20 20    u32 idx;      
1b210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b220 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 61    /* Offset in a
1b230 4b 65 79 5b 5d 20 74 6f 20 72 65 61 64 20 66 72  Key[] to read fr
1b240 6f 6d 20 2a 2f 0a 20 20 75 31 36 20 75 3b 20 20  om */.  u16 u;  
1b250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b260 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67          /* Unsig
1b270 6e 65 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72  ned loop counter
1b280 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72 3b   */.  u32 szHdr;
1b290 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 3d 20 70  .  Mem *pMem = p
1b2a0 2d 3e 61 4d 65 6d 3b 0a 0a 20 20 70 2d 3e 64 65  ->aMem;..  p->de
1b2b0 66 61 75 6c 74 5f 72 63 20 3d 20 30 3b 0a 20 20  fault_rc = 0;.  
1b2c0 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42 59  assert( EIGHT_BY
1b2d0 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 4d 65  TE_ALIGNMENT(pMe
1b2e0 6d 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 67 65  m) );.  idx = ge
1b2f0 74 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20  tVarint32(aKey, 
1b300 73 7a 48 64 72 29 3b 0a 20 20 64 20 3d 20 73 7a  szHdr);.  d = sz
1b310 48 64 72 3b 0a 20 20 75 20 3d 20 30 3b 0a 20 20  Hdr;.  u = 0;.  
1b320 77 68 69 6c 65 28 20 69 64 78 3c 73 7a 48 64 72  while( idx<szHdr
1b330 20 26 26 20 64 3c 3d 6e 4b 65 79 20 29 7b 0a 20   && d<=nKey ){. 
1b340 20 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79     u32 serial_ty
1b350 70 65 3b 0a 0a 20 20 20 20 69 64 78 20 2b 3d 20  pe;..    idx += 
1b360 67 65 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65  getVarint32(&aKe
1b370 79 5b 69 64 78 5d 2c 20 73 65 72 69 61 6c 5f 74  y[idx], serial_t
1b380 79 70 65 29 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e  ype);.    pMem->
1b390 65 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  enc = pKeyInfo->
1b3a0 65 6e 63 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 64  enc;.    pMem->d
1b3b0 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62  b = pKeyInfo->db
1b3c0 3b 0a 20 20 20 20 2f 2a 20 70 4d 65 6d 2d 3e 66  ;.    /* pMem->f
1b3d0 6c 61 67 73 20 3d 20 30 3b 20 2f 2f 20 73 71 6c  lags = 0; // sql
1b3e0 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1b3f0 74 28 29 20 77 69 6c 6c 20 73 65 74 20 74 68 69  t() will set thi
1b400 73 20 66 6f 72 20 75 73 20 2a 2f 0a 20 20 20 20  s for us */.    
1b410 70 4d 65 6d 2d 3e 73 7a 4d 61 6c 6c 6f 63 20 3d  pMem->szMalloc =
1b420 20 30 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 7a 20   0;.    pMem->z 
1b430 3d 20 30 3b 0a 20 20 20 20 64 20 2b 3d 20 73 71  = 0;.    d += sq
1b440 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
1b450 65 74 28 26 61 4b 65 79 5b 64 5d 2c 20 73 65 72  et(&aKey[d], ser
1b460 69 61 6c 5f 74 79 70 65 2c 20 70 4d 65 6d 29 3b  ial_type, pMem);
1b470 0a 20 20 20 20 70 4d 65 6d 2b 2b 3b 0a 20 20 20  .    pMem++;.   
1b480 20 69 66 28 20 28 2b 2b 75 29 3e 3d 70 2d 3e 6e   if( (++u)>=p->n
1b490 46 69 65 6c 64 20 29 20 62 72 65 61 6b 3b 0a 20  Field ) break;. 
1b4a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 75 3c 3d   }.  assert( u<=
1b4b0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1b4c0 20 2b 20 31 20 29 3b 0a 20 20 70 2d 3e 6e 46 69   + 1 );.  p->nFi
1b4d0 65 6c 64 20 3d 20 75 3b 0a 7d 0a 0a 23 69 66 20  eld = u;.}..#if 
1b4e0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a  SQLITE_DEBUG./*.
1b4f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1b500 20 63 6f 6d 70 61 72 65 73 20 74 77 6f 20 69 6e   compares two in
1b510 64 65 78 20 6f 72 20 74 61 62 6c 65 20 72 65 63  dex or table rec
1b520 6f 72 64 20 6b 65 79 73 20 69 6e 20 74 68 65 20  ord keys in the 
1b530 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 74  same way.** as t
1b540 68 65 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  he sqlite3VdbeRe
1b550 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 72 6f  cordCompare() ro
1b560 75 74 69 6e 65 2e 20 55 6e 6c 69 6b 65 20 56 64  utine. Unlike Vd
1b570 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28  beRecordCompare(
1b580 29 2c 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74  ),.** this funct
1b590 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73  ion deserializes
1b5a0 20 61 6e 64 20 63 6f 6d 70 61 72 65 73 20 76 61   and compares va
1b5b0 6c 75 65 73 20 75 73 69 6e 67 20 74 68 65 0a 2a  lues using the.*
1b5c0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72  * sqlite3VdbeSer
1b5d0 69 61 6c 47 65 74 28 29 20 61 6e 64 20 73 71 6c  ialGet() and sql
1b5e0 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 29  ite3MemCompare()
1b5f0 20 66 75 6e 63 74 69 6f 6e 73 2e 20 49 74 20 69   functions. It i
1b600 73 20 75 73 65 64 0a 2a 2a 20 69 6e 20 61 73 73  s used.** in ass
1b610 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b620 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20   to ensure that 
1b630 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 63 6f  the optimized co
1b640 64 65 20 69 6e 0a 2a 2a 20 73 71 6c 69 74 65 33  de in.** sqlite3
1b650 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1b660 65 28 29 20 72 65 74 75 72 6e 73 20 72 65 73 75  e() returns resu
1b670 6c 74 73 20 77 69 74 68 20 74 68 65 73 65 20 74  lts with these t
1b680 77 6f 20 70 72 69 6d 69 74 69 76 65 73 2e 0a 2a  wo primitives..*
1b690 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
1b6a0 20 69 66 20 74 68 65 20 72 65 73 75 6c 74 20 6f   if the result o
1b6b0 66 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  f comparison is 
1b6c0 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 64 65  equivalent to de
1b6d0 73 69 72 65 64 52 65 73 75 6c 74 2e 0a 2a 2a 20  siredResult..** 
1b6e0 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69 66 20  Return false if 
1b6f0 74 68 65 72 65 20 69 73 20 61 20 64 69 73 61 67  there is a disag
1b700 72 65 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  reement..*/.stat
1b710 69 63 20 69 6e 74 20 76 64 62 65 52 65 63 6f 72  ic int vdbeRecor
1b720 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 0a 20  dCompareDebug(. 
1b730 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
1b740 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
1b750 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
1b760 63 6f 6e 73 74 20 55 6e 70 61 63 6b 65 64 52 65  const UnpackedRe
1b770 63 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 2f 2a  cord *pPKey2, /*
1b780 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1b790 69 6e 74 20 64 65 73 69 72 65 64 52 65 73 75 6c  int desiredResul
1b7a0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t             /*
1b7b0 20 43 6f 72 72 65 63 74 20 61 6e 73 77 65 72 20   Correct answer 
1b7c0 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b 20  */.){.  u32 d1; 
1b7d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
1b7e0 66 73 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d  fset into aKey[]
1b7f0 20 6f 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c   of next data el
1b800 65 6d 65 6e 74 20 2a 2f 0a 20 20 75 33 32 20 69  ement */.  u32 i
1b810 64 78 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  dx1;          /*
1b820 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61 4b 65   Offset into aKe
1b830 79 5b 5d 20 6f 66 20 6e 65 78 74 20 68 65 61 64  y[] of next head
1b840 65 72 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  er element */.  
1b850 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1b860 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1b870 62 79 74 65 73 20 69 6e 20 68 65 61 64 65 72 20  bytes in header 
1b880 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  */.  int i = 0;.
1b890 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20    int rc = 0;.  
1b8a0 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
1b8b0 68 61 72 20 2a 61 4b 65 79 31 20 3d 20 28 63 6f  har *aKey1 = (co
1b8c0 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1b8d0 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20 4b 65 79  r *)pKey1;.  Key
1b8e0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 3b 0a  Info *pKeyInfo;.
1b8f0 20 20 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 70    Mem mem1;..  p
1b900 4b 65 79 49 6e 66 6f 20 3d 20 70 50 4b 65 79 32  KeyInfo = pPKey2
1b910 2d 3e 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 69 66  ->pKeyInfo;.  if
1b920 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ( pKeyInfo->db==
1b930 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1b940 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79 49  mem1.enc = pKeyI
1b950 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 6d 65 6d 31  nfo->enc;.  mem1
1b960 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e  .db = pKeyInfo->
1b970 64 62 3b 0a 20 20 2f 2a 20 6d 65 6d 31 2e 66 6c  db;.  /* mem1.fl
1b980 61 67 73 20 3d 20 30 3b 20 20 2f 2f 20 57 69 6c  ags = 0;  // Wil
1b990 6c 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  l be initialized
1b9a0 20 62 79 20 73 71 6c 69 74 65 33 56 64 62 65 53   by sqlite3VdbeS
1b9b0 65 72 69 61 6c 47 65 74 28 29 20 2a 2f 0a 20 20  erialGet() */.  
1b9c0 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d 31 2e 73  VVA_ONLY( mem1.s
1b9d0 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20 29 20 2f  zMalloc = 0; ) /
1b9e0 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64 20 62 79  * Only needed by
1b9f0 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
1ba00 65 6e 74 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 6f  ents */..  /* Co
1ba10 6d 70 69 6c 65 72 73 20 6d 61 79 20 63 6f 6d 70  mpilers may comp
1ba20 6c 61 69 6e 20 74 68 61 74 20 6d 65 6d 31 2e 75  lain that mem1.u
1ba30 2e 69 20 69 73 20 70 6f 74 65 6e 74 69 61 6c 6c  .i is potentiall
1ba40 79 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2e  y uninitialized.
1ba50 0a 20 20 2a 2a 20 57 65 20 63 6f 75 6c 64 20 69  .  ** We could i
1ba60 6e 69 74 69 61 6c 69 7a 65 20 69 74 2c 20 61 73  nitialize it, as
1ba70 20 73 68 6f 77 6e 20 68 65 72 65 2c 20 74 6f 20   shown here, to 
1ba80 73 69 6c 65 6e 63 65 20 74 68 6f 73 65 20 63 6f  silence those co
1ba90 6d 70 6c 61 69 6e 74 73 2e 0a 20 20 2a 2a 20 42  mplaints..  ** B
1baa0 75 74 20 69 6e 20 66 61 63 74 2c 20 6d 65 6d 31  ut in fact, mem1
1bab0 2e 75 2e 69 20 77 69 6c 6c 20 6e 65 76 65 72 20  .u.i will never 
1bac0 61 63 74 75 61 6c 6c 79 20 62 65 20 75 73 65 64  actually be used
1bad0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20   uninitialized, 
1bae0 61 6e 64 20 64 6f 69 6e 67 20 0a 20 20 2a 2a 20  and doing .  ** 
1baf0 74 68 65 20 75 6e 6e 65 63 65 73 73 61 72 79 20  the unnecessary 
1bb00 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 68  initialization h
1bb10 61 73 20 61 20 6d 65 61 73 75 72 61 62 6c 65 20  as a measurable 
1bb20 6e 65 67 61 74 69 76 65 20 70 65 72 66 6f 72 6d  negative perform
1bb30 61 6e 63 65 0a 20 20 2a 2a 20 69 6d 70 61 63 74  ance.  ** impact
1bb40 2c 20 73 69 6e 63 65 20 74 68 69 73 20 72 6f 75  , since this rou
1bb50 74 69 6e 65 20 69 73 20 61 20 76 65 72 79 20 68  tine is a very h
1bb60 69 67 68 20 72 75 6e 6e 65 72 2e 20 20 41 6e 64  igh runner.  And
1bb70 20 73 6f 2c 20 77 65 20 63 68 6f 6f 73 65 0a 20   so, we choose. 
1bb80 20 2a 2a 20 74 6f 20 69 67 6e 6f 72 65 20 74 68   ** to ignore th
1bb90 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69  e compiler warni
1bba0 6e 67 73 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ngs and leave th
1bbb0 69 73 20 76 61 72 69 61 62 6c 65 20 75 6e 69 6e  is variable unin
1bbc0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
1bbd0 20 20 2f 2a 20 20 6d 65 6d 31 2e 75 2e 69 20 3d    /*  mem1.u.i =
1bbe0 20 30 3b 20 20 2f 2f 20 6e 6f 74 20 6e 65 65 64   0;  // not need
1bbf0 65 64 2c 20 68 65 72 65 20 74 6f 20 73 69 6c 65  ed, here to sile
1bc00 6e 63 65 20 63 6f 6d 70 69 6c 65 72 20 77 61 72  nce compiler war
1bc10 6e 69 6e 67 20 2a 2f 0a 20 20 0a 20 20 69 64 78  ning */.  .  idx
1bc20 31 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28  1 = getVarint32(
1bc30 61 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a  aKey1, szHdr1);.
1bc40 20 20 69 66 28 20 73 7a 48 64 72 31 3e 39 38 33    if( szHdr1>983
1bc50 30 37 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  07 ) return SQLI
1bc60 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 64 31  TE_CORRUPT;.  d1
1bc70 20 3d 20 73 7a 48 64 72 31 3b 0a 20 20 61 73 73   = szHdr1;.  ass
1bc80 65 72 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e  ert( pKeyInfo->n
1bc90 46 69 65 6c 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e  Field+pKeyInfo->
1bca0 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1bcb0 3e 6e 46 69 65 6c 64 20 7c 7c 20 43 4f 52 52 55  >nField || CORRU
1bcc0 50 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  PT_DB );.  asser
1bcd0 74 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  t( pKeyInfo->aSo
1bce0 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1bcf0 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e 66 6f  assert( pKeyInfo
1bd00 2d 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20  ->nField>0 );.  
1bd10 61 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a  assert( idx1<=sz
1bd20 48 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f  Hdr1 || CORRUPT_
1bd30 44 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20  DB );.  do{.    
1bd40 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 31  u32 serial_type1
1bd50 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74  ;..    /* Read t
1bd60 68 65 20 73 65 72 69 61 6c 20 74 79 70 65 73 20  he serial types 
1bd70 66 6f 72 20 74 68 65 20 6e 65 78 74 20 65 6c 65  for the next ele
1bd80 6d 65 6e 74 20 69 6e 20 65 61 63 68 20 6b 65 79  ment in each key
1bd90 2e 20 2a 2f 0a 20 20 20 20 69 64 78 31 20 2b 3d  . */.    idx1 +=
1bda0 20 67 65 74 56 61 72 69 6e 74 33 32 28 20 61 4b   getVarint32( aK
1bdb0 65 79 31 2b 69 64 78 31 2c 20 73 65 72 69 61 6c  ey1+idx1, serial
1bdc0 5f 74 79 70 65 31 20 29 3b 0a 0a 20 20 20 20 2f  _type1 );..    /
1bdd0 2a 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68  * Verify that th
1bde0 65 72 65 20 69 73 20 65 6e 6f 75 67 68 20 6b 65  ere is enough ke
1bdf0 79 20 73 70 61 63 65 20 72 65 6d 61 69 6e 69 6e  y space remainin
1be00 67 20 74 6f 20 61 76 6f 69 64 0a 20 20 20 20 2a  g to avoid.    *
1be10 2a 20 61 20 62 75 66 66 65 72 20 6f 76 65 72 72  * a buffer overr
1be20 65 61 64 2e 20 20 54 68 65 20 22 64 31 2b 73 65  ead.  The "d1+se
1be30 72 69 61 6c 5f 74 79 70 65 31 2b 32 22 20 73 75  rial_type1+2" su
1be40 62 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c  bexpression will
1be50 0a 20 20 20 20 2a 2a 20 61 6c 77 61 79 73 20 62  .    ** always b
1be60 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
1be70 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
1be80 6d 6f 75 6e 74 20 6f 66 20 72 65 71 75 69 72 65  mount of require
1be90 64 20 6b 65 79 20 73 70 61 63 65 2e 0a 20 20 20  d key space..   
1bea0 20 2a 2a 20 55 73 65 20 74 68 61 74 20 61 70 70   ** Use that app
1beb0 72 6f 78 69 6d 61 74 69 6f 6e 20 74 6f 20 61 76  roximation to av
1bec0 6f 69 64 20 74 68 65 20 6d 6f 72 65 20 65 78 70  oid the more exp
1bed0 65 6e 73 69 76 65 20 63 61 6c 6c 20 74 6f 0a 20  ensive call to. 
1bee0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 56 64 62     ** sqlite3Vdb
1bef0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 29  eSerialTypeLen()
1bf00 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1bf10 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ase..    */.    
1bf20 69 66 28 20 64 31 2b 73 65 72 69 61 6c 5f 74 79  if( d1+serial_ty
1bf30 70 65 31 2b 32 3e 28 75 33 32 29 6e 4b 65 79 31  pe1+2>(u32)nKey1
1bf40 0a 20 20 20 20 20 26 26 20 64 31 2b 73 71 6c 69  .     && d1+sqli
1bf50 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70  te3VdbeSerialTyp
1bf60 65 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65  eLen(serial_type
1bf70 31 29 3e 28 75 33 32 29 6e 4b 65 79 31 20 0a 20  1)>(u32)nKey1 . 
1bf80 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61     ){.      brea
1bf90 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
1bfa0 20 45 78 74 72 61 63 74 20 74 68 65 20 76 61 6c   Extract the val
1bfb0 75 65 73 20 74 6f 20 62 65 20 63 6f 6d 70 61 72  ues to be compar
1bfc0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ed..    */.    d
1bfd0 31 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  1 += sqlite3Vdbe
1bfe0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 31  SerialGet(&aKey1
1bff0 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70  [d1], serial_typ
1c000 65 31 2c 20 26 6d 65 6d 31 29 3b 0a 0a 20 20 20  e1, &mem1);..   
1c010 20 2f 2a 20 44 6f 20 74 68 65 20 63 6f 6d 70 61   /* Do the compa
1c020 72 69 73 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20  rison.    */.   
1c030 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d 65 6d   rc = sqlite3Mem
1c040 43 6f 6d 70 61 72 65 28 26 6d 65 6d 31 2c 20 26  Compare(&mem1, &
1c050 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 69 5d 2c  pPKey2->aMem[i],
1c060 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1c070 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  [i]);.    if( rc
1c080 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
1c090 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c  ert( mem1.szMall
1c0a0 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53 65 65  oc==0 );  /* See
1c0b0 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77 20 2a   comment below *
1c0c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79  /.      if( pKey
1c0d0 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72  Info->aSortOrder
1c0e0 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  [i] ){.        r
1c0f0 63 20 3d 20 2d 72 63 3b 20 20 2f 2a 20 49 6e 76  c = -rc;  /* Inv
1c100 65 72 74 20 74 68 65 20 72 65 73 75 6c 74 20 66  ert the result f
1c110 6f 72 20 44 45 53 43 20 73 6f 72 74 20 6f 72 64  or DESC sort ord
1c120 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  er. */.      }. 
1c130 20 20 20 20 20 67 6f 74 6f 20 64 65 62 75 67 43       goto debugC
1c140 6f 6d 70 61 72 65 45 6e 64 3b 0a 20 20 20 20 7d  ompareEnd;.    }
1c150 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 77 68 69  .    i++;.  }whi
1c160 6c 65 28 20 69 64 78 31 3c 73 7a 48 64 72 31 20  le( idx1<szHdr1 
1c170 26 26 20 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69  && i<pPKey2->nFi
1c180 65 6c 64 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  eld );..  /* No 
1c190 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1c1a0 6e 20 69 73 20 65 76 65 72 20 75 73 65 64 20 6f  n is ever used o
1c1b0 6e 20 6d 65 6d 31 2e 20 20 50 72 6f 76 65 20 74  n mem1.  Prove t
1c1c0 68 69 73 20 75 73 69 6e 67 0a 20 20 2a 2a 20 74  his using.  ** t
1c1d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
1c1e0 65 72 74 28 29 2e 20 20 49 66 20 74 68 65 20 61  ert().  If the a
1c1f0 73 73 65 72 74 28 29 20 66 61 69 6c 73 2c 20 69  ssert() fails, i
1c200 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 20 20  t indicates a.  
1c210 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 61  ** memory leak a
1c220 6e 64 20 61 20 6e 65 65 64 20 74 6f 20 63 61 6c  nd a need to cal
1c230 6c 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d  l sqlite3VdbeMem
1c240 52 65 6c 65 61 73 65 28 26 6d 65 6d 31 29 2e 0a  Release(&mem1)..
1c250 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6d    */.  assert( m
1c260 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20  em1.szMalloc==0 
1c270 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d 30 20 68  );..  /* rc==0 h
1c280 65 72 65 20 6d 65 61 6e 73 20 74 68 61 74 20 6f  ere means that o
1c290 6e 65 20 6f 66 20 74 68 65 20 6b 65 79 73 20 72  ne of the keys r
1c2a0 61 6e 20 6f 75 74 20 6f 66 20 66 69 65 6c 64 73  an out of fields
1c2b0 20 61 6e 64 0a 20 20 2a 2a 20 61 6c 6c 20 74 68   and.  ** all th
1c2c0 65 20 66 69 65 6c 64 73 20 75 70 20 74 6f 20 74  e fields up to t
1c2d0 68 61 74 20 70 6f 69 6e 74 20 77 65 72 65 20 65  hat point were e
1c2e0 71 75 61 6c 2e 20 52 65 74 75 72 6e 20 74 68 65  qual. Return the
1c2f0 20 64 65 66 61 75 6c 74 5f 72 63 0a 20 20 2a 2a   default_rc.  **
1c300 20 76 61 6c 75 65 2e 20 20 2a 2f 0a 20 20 72 63   value.  */.  rc
1c310 20 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75   = pPKey2->defau
1c320 6c 74 5f 72 63 3b 0a 0a 64 65 62 75 67 43 6f 6d  lt_rc;..debugCom
1c330 70 61 72 65 45 6e 64 3a 0a 20 20 69 66 28 20 64  pareEnd:.  if( d
1c340 65 73 69 72 65 64 52 65 73 75 6c 74 3d 3d 30 20  esiredResult==0 
1c350 26 26 20 72 63 3d 3d 30 20 29 20 72 65 74 75 72  && rc==0 ) retur
1c360 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69 72  n 1;.  if( desir
1c370 65 64 52 65 73 75 6c 74 3c 30 20 26 26 20 72 63  edResult<0 && rc
1c380 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
1c390 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73 75   if( desiredResu
1c3a0 6c 74 3e 30 20 26 26 20 72 63 3e 30 20 29 20 72  lt>0 && rc>0 ) r
1c3b0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 43  eturn 1;.  if( C
1c3c0 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74 75  ORRUPT_DB ) retu
1c3d0 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 4b 65 79  rn 1;.  if( pKey
1c3e0 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  Info->db->malloc
1c3f0 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
1c400 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  1;.  return 0;.}
1c410 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1c420 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1c430 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72  Count the number
1c440 20 6f 66 20 66 69 65 6c 64 73 20 28 61 2e 6b 2e   of fields (a.k.
1c450 61 2e 20 63 6f 6c 75 6d 6e 73 29 20 69 6e 20 74  a. columns) in t
1c460 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
1c470 62 79 0a 2a 2a 20 70 4b 65 79 2c 6e 4b 65 79 2e  by.** pKey,nKey.
1c480 20 20 54 68 65 20 76 65 72 69 66 79 20 74 68 61    The verify tha
1c490 74 20 74 68 69 73 20 63 6f 75 6e 74 20 69 73 20  t this count is 
1c4a0 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75  less than or equ
1c4b0 61 6c 20 74 6f 20 74 68 65 0a 2a 2a 20 6c 69 6d  al to the.** lim
1c4c0 69 74 20 67 69 76 65 6e 20 62 79 20 70 4b 65 79  it given by pKey
1c4d0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b 20 70  Info->nField + p
1c4e0 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64  KeyInfo->nXField
1c4f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
1c500 63 6f 6e 73 74 72 61 69 6e 74 20 69 73 20 6e 6f  constraint is no
1c510 74 20 73 61 74 69 73 66 69 65 64 2c 20 69 74 20  t satisfied, it 
1c520 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 68  means that the h
1c530 69 67 68 2d 73 70 65 65 64 0a 2a 2a 20 76 64 62  igh-speed.** vdb
1c540 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 49 6e  eRecordCompareIn
1c550 74 28 29 20 61 6e 64 20 76 64 62 65 52 65 63 6f  t() and vdbeReco
1c560 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 28  rdCompareString(
1c570 29 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 0a  ) routines will.
1c580 2a 2a 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72  ** not work corr
1c590 65 63 74 6c 79 2e 20 20 49 66 20 74 68 69 73 20  ectly.  If this 
1c5a0 61 73 73 65 72 74 28 29 20 65 76 65 72 20 66 69  assert() ever fi
1c5b0 72 65 73 2c 20 69 74 20 70 72 6f 62 61 62 6c 79  res, it probably
1c5c0 20 6d 65 61 6e 73 0a 2a 2a 20 74 68 61 74 20 74   means.** that t
1c5d0 68 65 20 4b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c  he KeyInfo.nFiel
1c5e0 64 20 6f 72 20 4b 65 79 49 6e 66 6f 2e 6e 58 46  d or KeyInfo.nXF
1c5f0 69 65 6c 64 20 76 61 6c 75 65 73 20 77 65 72 65  ield values were
1c600 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 69 6e 63   computed.** inc
1c610 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
1c620 74 69 63 20 76 6f 69 64 20 76 64 62 65 41 73 73  tic void vdbeAss
1c630 65 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74  ertFieldCountWit
1c640 68 69 6e 4c 69 6d 69 74 73 28 0a 20 20 69 6e 74  hinLimits(.  int
1c650 20 6e 4b 65 79 2c 20 63 6f 6e 73 74 20 76 6f 69   nKey, const voi
1c660 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 54 68  d *pKey,   /* Th
1c670 65 20 72 65 63 6f 72 64 20 74 6f 20 76 65 72 69  e record to veri
1c680 66 79 20 2a 2f 20 0a 20 20 63 6f 6e 73 74 20 4b  fy */ .  const K
1c690 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f  eyInfo *pKeyInfo
1c6a0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 61 72         /* Compar
1c6b0 65 20 73 69 7a 65 20 77 69 74 68 20 74 68 69 73  e size with this
1c6c0 20 4b 65 79 49 6e 66 6f 20 2a 2f 0a 29 7b 0a 20   KeyInfo */.){. 
1c6d0 20 69 6e 74 20 6e 46 69 65 6c 64 20 3d 20 30 3b   int nField = 0;
1c6e0 0a 20 20 75 33 32 20 73 7a 48 64 72 3b 0a 20 20  .  u32 szHdr;.  
1c6f0 75 33 32 20 69 64 78 3b 0a 20 20 75 33 32 20 6e  u32 idx;.  u32 n
1c700 6f 74 55 73 65 64 3b 0a 20 20 63 6f 6e 73 74 20  otUsed;.  const 
1c710 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1c720 4b 65 79 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73  Key = (const uns
1c730 69 67 6e 65 64 20 63 68 61 72 2a 29 70 4b 65 79  igned char*)pKey
1c740 3b 0a 0a 20 20 69 66 28 20 43 4f 52 52 55 50 54  ;..  if( CORRUPT
1c750 5f 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  _DB ) return;.  
1c760 69 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33  idx = getVarint3
1c770 32 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a  2(aKey, szHdr);.
1c780 20 20 61 73 73 65 72 74 28 20 6e 4b 65 79 3e 3d    assert( nKey>=
1c790 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
1c7a0 7a 48 64 72 3c 3d 28 75 33 32 29 6e 4b 65 79 20  zHdr<=(u32)nKey 
1c7b0 29 3b 0a 20 20 77 68 69 6c 65 28 20 69 64 78 3c  );.  while( idx<
1c7c0 73 7a 48 64 72 20 29 7b 0a 20 20 20 20 69 64 78  szHdr ){.    idx
1c7d0 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28   += getVarint32(
1c7e0 61 4b 65 79 2b 69 64 78 2c 20 6e 6f 74 55 73 65  aKey+idx, notUse
1c7f0 64 29 3b 0a 20 20 20 20 6e 46 69 65 6c 64 2b 2b  d);.    nField++
1c800 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1c810 6e 46 69 65 6c 64 20 3c 3d 20 70 4b 65 79 49 6e  nField <= pKeyIn
1c820 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65 79 49  fo->nField+pKeyI
1c830 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 20 29 3b 0a  nfo->nXField );.
1c840 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1c850 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64   vdbeAssertField
1c860 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74  CountWithinLimit
1c870 73 28 41 2c 42 2c 43 29 0a 23 65 6e 64 69 66 0a  s(A,B,C).#endif.
1c880 0a 2f 2a 0a 2a 2a 20 42 6f 74 68 20 2a 70 4d 65  ./*.** Both *pMe
1c890 6d 31 20 61 6e 64 20 2a 70 4d 65 6d 32 20 63 6f  m1 and *pMem2 co
1c8a0 6e 74 61 69 6e 20 73 74 72 69 6e 67 20 76 61 6c  ntain string val
1c8b0 75 65 73 2e 20 43 6f 6d 70 61 72 65 20 74 68 65  ues. Compare the
1c8c0 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 75   two values.** u
1c8d0 73 69 6e 67 20 74 68 65 20 63 6f 6c 6c 61 74 69  sing the collati
1c8e0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
1c8f0 6c 2e 20 41 73 20 75 73 75 61 6c 2c 20 72 65 74  l. As usual, ret
1c900 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65 20 2c  urn a negative ,
1c910 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1c920 74 69 76 65 20 76 61 6c 75 65 20 69 66 20 2a 70  tive value if *p
1c930 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68 61  Mem1 is less tha
1c940 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 67  n, equal to or g
1c950 72 65 61 74 65 72 20 74 68 61 6e 20 0a 2a 2a 20  reater than .** 
1c960 2a 70 4d 65 6d 32 2c 20 72 65 73 70 65 63 74 69  *pMem2, respecti
1c970 76 65 6c 79 2e 20 53 69 6d 69 6c 61 72 20 69 6e  vely. Similar in
1c980 20 73 70 69 72 69 74 20 74 6f 20 22 72 63 20 3d   spirit to "rc =
1c990 20 28 2a 70 4d 65 6d 31 29 20 2d 20 28 2a 70 4d   (*pMem1) - (*pM
1c9a0 65 6d 32 29 3b 22 2e 0a 2a 2f 0a 73 74 61 74 69  em2);"..*/.stati
1c9b0 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 70 61 72  c int vdbeCompar
1c9c0 65 4d 65 6d 53 74 72 69 6e 67 28 0a 20 20 63 6f  eMemString(.  co
1c9d0 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d 31 2c 0a  nst Mem *pMem1,.
1c9e0 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65    const Mem *pMe
1c9f0 6d 32 2c 0a 20 20 63 6f 6e 73 74 20 43 6f 6c 6c  m2,.  const Coll
1ca00 53 65 71 20 2a 70 43 6f 6c 6c 2c 0a 20 20 75 38  Seq *pColl,.  u8
1ca10 20 2a 70 72 63 45 72 72 20 20 20 20 20 20 20 20   *prcErr        
1ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca30 20 49 66 20 61 6e 20 4f 4f 4d 20 6f 63 63 75 72   If an OOM occur
1ca40 73 2c 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  s, set to SQLITE
1ca50 5f 4e 4f 4d 45 4d 20 2a 2f 0a 29 7b 0a 20 20 69  _NOMEM */.){.  i
1ca60 66 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70  f( pMem1->enc==p
1ca70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20  Coll->enc ){.   
1ca80 20 2f 2a 20 54 68 65 20 73 74 72 69 6e 67 73 20   /* The strings 
1ca90 61 72 65 20 61 6c 72 65 61 64 79 20 69 6e 20 74  are already in t
1caa0 68 65 20 63 6f 72 72 65 63 74 20 65 6e 63 6f 64  he correct encod
1cab0 69 6e 67 2e 20 20 43 61 6c 6c 20 74 68 65 0a 20  ing.  Call the. 
1cac0 20 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f      ** compariso
1cad0 6e 20 66 75 6e 63 74 69 6f 6e 20 64 69 72 65 63  n function direc
1cae0 74 6c 79 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  tly */.    retur
1caf0 6e 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43  n pColl->xCmp(pC
1cb00 6f 6c 6c 2d 3e 70 55 73 65 72 2c 70 4d 65 6d 31  oll->pUser,pMem1
1cb10 2d 3e 6e 2c 70 4d 65 6d 31 2d 3e 7a 2c 70 4d 65  ->n,pMem1->z,pMe
1cb20 6d 32 2d 3e 6e 2c 70 4d 65 6d 32 2d 3e 7a 29 3b  m2->n,pMem2->z);
1cb30 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1cb40 74 20 72 63 3b 0a 20 20 20 20 63 6f 6e 73 74 20  t rc;.    const 
1cb50 76 6f 69 64 20 2a 76 31 2c 20 2a 76 32 3b 0a 20  void *v1, *v2;. 
1cb60 20 20 20 69 6e 74 20 6e 31 2c 20 6e 32 3b 0a 20     int n1, n2;. 
1cb70 20 20 20 4d 65 6d 20 63 31 3b 0a 20 20 20 20 4d     Mem c1;.    M
1cb80 65 6d 20 63 32 3b 0a 20 20 20 20 73 71 6c 69 74  em c2;.    sqlit
1cb90 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 63  e3VdbeMemInit(&c
1cba0 31 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20 4d 45  1, pMem1->db, ME
1cbb0 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73 71 6c  M_Null);.    sql
1cbc0 69 74 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28  ite3VdbeMemInit(
1cbd0 26 63 32 2c 20 70 4d 65 6d 31 2d 3e 64 62 2c 20  &c2, pMem1->db, 
1cbe0 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 20 20 73  MEM_Null);.    s
1cbf0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 68 61  qlite3VdbeMemSha
1cc00 6c 6c 6f 77 43 6f 70 79 28 26 63 31 2c 20 70 4d  llowCopy(&c1, pM
1cc10 65 6d 31 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b  em1, MEM_Ephem);
1cc20 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1cc30 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28 26  MemShallowCopy(&
1cc40 63 32 2c 20 70 4d 65 6d 32 2c 20 4d 45 4d 5f 45  c2, pMem2, MEM_E
1cc50 70 68 65 6d 29 3b 0a 20 20 20 20 76 31 20 3d 20  phem);.    v1 = 
1cc60 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
1cc70 28 28 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  ((sqlite3_value*
1cc80 29 26 63 31 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63  )&c1, pColl->enc
1cc90 29 3b 0a 20 20 20 20 6e 31 20 3d 20 76 31 3d 3d  );.    n1 = v1==
1cca0 30 20 3f 20 30 20 3a 20 63 31 2e 6e 3b 0a 20 20  0 ? 0 : c1.n;.  
1ccb0 20 20 76 32 20 3d 20 73 71 6c 69 74 65 33 56 61    v2 = sqlite3Va
1ccc0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1ccd0 5f 76 61 6c 75 65 2a 29 26 63 32 2c 20 70 43 6f  _value*)&c2, pCo
1cce0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 32  ll->enc);.    n2
1ccf0 20 3d 20 76 32 3d 3d 30 20 3f 20 30 20 3a 20 63   = v2==0 ? 0 : c
1cd00 32 2e 6e 3b 0a 20 20 20 20 72 63 20 3d 20 70 43  2.n;.    rc = pC
1cd10 6f 6c 6c 2d 3e 78 43 6d 70 28 70 43 6f 6c 6c 2d  oll->xCmp(pColl-
1cd20 3e 70 55 73 65 72 2c 20 6e 31 2c 20 76 31 2c 20  >pUser, n1, v1, 
1cd30 6e 32 2c 20 76 32 29 3b 0a 20 20 20 20 69 66 28  n2, v2);.    if(
1cd40 20 28 76 31 3d 3d 30 20 7c 7c 20 76 32 3d 3d 30   (v1==0 || v2==0
1cd50 29 20 26 26 20 70 72 63 45 72 72 20 29 20 2a 70  ) && prcErr ) *p
1cd60 72 63 45 72 72 20 3d 20 53 51 4c 49 54 45 5f 4e  rcErr = SQLITE_N
1cd70 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 73  OMEM_BKPT;.    s
1cd80 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cd90 65 61 73 65 28 26 63 31 29 3b 0a 20 20 20 20 73  ease(&c1);.    s
1cda0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
1cdb0 65 61 73 65 28 26 63 32 29 3b 0a 20 20 20 20 72  ease(&c2);.    r
1cdc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 7d 0a  eturn rc;.  }.}.
1cdd0 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6e 70 75 74  ./*.** The input
1cde0 20 70 42 6c 6f 62 20 69 73 20 67 75 61 72 61 6e   pBlob is guaran
1cdf0 74 65 65 64 20 74 6f 20 62 65 20 61 20 42 6c 6f  teed to be a Blo
1ce00 62 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6d 61  b that is not ma
1ce10 72 6b 65 64 0a 2a 2a 20 77 69 74 68 20 4d 45 4d  rked.** with MEM
1ce20 5f 5a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 74  _Zero.  Return t
1ce30 72 75 65 20 69 66 20 69 74 20 63 6f 75 6c 64 20  rue if it could 
1ce40 62 65 20 61 20 7a 65 72 6f 2d 62 6c 6f 62 2e 0a  be a zero-blob..
1ce50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73  */.static int is
1ce60 5a 65 72 6f 42 6c 6f 62 28 63 6f 6e 73 74 20 4d  ZeroBlob(const M
1ce70 65 6d 20 2a 70 42 6c 6f 62 29 7b 0a 20 20 69 6e  em *pBlob){.  in
1ce80 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1ce90 69 3c 70 42 6c 6f 62 2d 3e 6e 20 26 26 20 70 42  i<pBlob->n && pB
1cea0 6c 6f 62 2d 3e 7a 5b 69 5d 3d 3d 30 3b 20 69 2b  lob->z[i]==0; i+
1ceb0 2b 29 7b 7d 0a 20 20 72 65 74 75 72 6e 20 69 3d  +){}.  return i=
1cec0 3d 70 42 6c 6f 62 2d 3e 6e 3b 0a 7d 0a 0a 2f 2a  =pBlob->n;.}../*
1ced0 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
1cee0 62 6c 6f 62 73 2e 20 20 52 65 74 75 72 6e 20 6e  blobs.  Return n
1cef0 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f  egative, zero, o
1cf00 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 74 68  r positive if th
1cf10 65 20 66 69 72 73 74 0a 2a 2a 20 69 73 20 6c 65  e first.** is le
1cf20 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20 74  ss than, equal t
1cf30 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  o, or greater th
1cf40 61 6e 20 74 68 65 20 73 65 63 6f 6e 64 2c 20 72  an the second, r
1cf50 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 2a 2a 20  espectively..** 
1cf60 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69 73 20 61  If one blob is a
1cf70 20 70 72 65 66 69 78 20 6f 66 20 74 68 65 20 6f   prefix of the o
1cf80 74 68 65 72 2c 20 74 68 65 6e 20 74 68 65 20 73  ther, then the s
1cf90 68 6f 72 74 65 72 20 69 73 20 74 68 65 20 6c 65  horter is the le
1cfa0 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ssor..*/.static 
1cfb0 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49 4e 45 20  SQLITE_NOINLINE 
1cfc0 69 6e 74 20 73 71 6c 69 74 65 33 42 6c 6f 62 43  int sqlite3BlobC
1cfd0 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65 6d  ompare(const Mem
1cfe0 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20 4d 65 6d   *pB1, const Mem
1cff0 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74 20 63 3b   *pB2){.  int c;
1d000 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70 42 31 2d  .  int n1 = pB1-
1d010 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20 3d 20 70  >n;.  int n2 = p
1d020 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20 49 74 20  B2->n;..  /* It 
1d030 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68  is possible to h
1d040 61 76 65 20 61 20 42 6c 6f 62 20 76 61 6c 75 65  ave a Blob value
1d050 20 74 68 61 74 20 68 61 73 20 73 6f 6d 65 20 6e   that has some n
1d060 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 0a  on-zero content.
1d070 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64 20 62 79    ** followed by
1d080 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74 2e 20 20   zero content.  
1d090 42 75 74 20 74 68 61 74 20 6f 6e 6c 79 20 63 6f  But that only co
1d0a0 6d 65 73 20 75 70 20 66 6f 72 20 42 6c 6f 62 73  mes up for Blobs
1d0b0 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20 62 79 20   formed.  ** by 
1d0c0 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  the OP_MakeRecor
1d0d0 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64 20 73 75  d opcode, and su
1d0e0 63 68 20 42 6c 6f 62 73 20 6e 65 76 65 72 20 67  ch Blobs never g
1d0f0 65 74 20 70 61 73 73 65 64 20 69 6e 74 6f 0a 20  et passed into. 
1d100 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f   ** sqlite3MemCo
1d110 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20 20 61 73  mpare(). */.  as
1d120 73 65 72 74 28 20 28 70 42 31 2d 3e 66 6c 61 67  sert( (pB1->flag
1d130 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1d140 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a 20 20 61   || n1==0 );.  a
1d150 73 73 65 72 74 28 20 28 70 42 32 2d 3e 66 6c 61  ssert( (pB2->fla
1d160 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d  gs & MEM_Zero)==
1d170 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b 0a 0a 20  0 || n2==0 );.. 
1d180 20 69 66 28 20 28 70 42 31 2d 3e 66 6c 61 67 73   if( (pB1->flags
1d190 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20 26 20 4d  |pB2->flags) & M
1d1a0 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 69  EM_Zero ){.    i
1d1b0 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20  f( pB1->flags & 
1d1c0 70 42 32 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d  pB2->flags & MEM
1d1d0 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20 72  _Zero ){.      r
1d1e0 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e 6e 5a 65  eturn pB1->u.nZe
1d1f0 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a 65 72  ro - pB2->u.nZer
1d200 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  o;.    }else if(
1d210 20 70 42 31 2d 3e 66 6c 61 67 73 20 26 20 4d 45   pB1->flags & ME
1d220 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20 20 20  M_Zero ){.      
1d230 69 66 28 20 21 69 73 5a 65 72 6f 42 6c 6f 62 28  if( !isZeroBlob(
1d240 70 42 32 29 20 29 20 72 65 74 75 72 6e 20 2d 31  pB2) ) return -1
1d250 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
1d260 42 31 2d 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32  B1->u.nZero - n2
1d270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1d280 20 20 20 69 66 28 20 21 69 73 5a 65 72 6f 42 6c     if( !isZeroBl
1d290 6f 62 28 70 42 31 29 20 29 20 72 65 74 75 72 6e  ob(pB1) ) return
1d2a0 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72   +1;.      retur
1d2b0 6e 20 6e 31 20 2d 20 70 42 32 2d 3e 75 2e 6e 5a  n n1 - pB2->u.nZ
1d2c0 65 72 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ero;.    }.  }. 
1d2d0 20 63 20 3d 20 6d 65 6d 63 6d 70 28 70 42 31 2d   c = memcmp(pB1-
1d2e0 3e 7a 2c 20 70 42 32 2d 3e 7a 2c 20 6e 31 3e 6e  >z, pB2->z, n1>n
1d2f0 32 20 3f 20 6e 32 20 3a 20 6e 31 29 3b 0a 20 20  2 ? n2 : n1);.  
1d300 69 66 28 20 63 20 29 20 72 65 74 75 72 6e 20 63  if( c ) return c
1d310 3b 0a 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20  ;.  return n1 - 
1d320 6e 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  n2;.}../*.** Do 
1d330 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 62 65 74  a comparison bet
1d340 77 65 65 6e 20 61 20 36 34 2d 62 69 74 20 73 69  ween a 64-bit si
1d350 67 6e 65 64 20 69 6e 74 65 67 65 72 20 61 6e 64  gned integer and
1d360 20 61 20 36 34 2d 62 69 74 20 66 6c 6f 61 74 69   a 64-bit floati
1d370 6e 67 2d 70 6f 69 6e 74 0a 2a 2a 20 6e 75 6d 62  ng-point.** numb
1d380 65 72 2e 20 20 52 65 74 75 72 6e 20 6e 65 67 61  er.  Return nega
1d390 74 69 76 65 2c 20 7a 65 72 6f 2c 20 6f 72 20 70  tive, zero, or p
1d3a0 6f 73 69 74 69 76 65 20 69 66 20 74 68 65 20 66  ositive if the f
1d3b0 69 72 73 74 20 28 69 36 34 29 20 69 73 20 6c 65  irst (i64) is le
1d3c0 73 73 20 74 68 61 6e 2c 0a 2a 2a 20 65 71 75 61  ss than,.** equa
1d3d0 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1d3e0 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1d3f0 20 28 64 6f 75 62 6c 65 29 2e 0a 2a 2f 0a 73 74   (double)..*/.st
1d400 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
1d410 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28  IntFloatCompare(
1d420 69 36 34 20 69 2c 20 64 6f 75 62 6c 65 20 72 29  i64 i, double r)
1d430 7b 0a 20 20 69 66 28 20 73 69 7a 65 6f 66 28 4c  {.  if( sizeof(L
1d440 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 3e  ONGDOUBLE_TYPE)>
1d450 38 20 29 7b 0a 20 20 20 20 4c 4f 4e 47 44 4f 55  8 ){.    LONGDOU
1d460 42 4c 45 5f 54 59 50 45 20 78 20 3d 20 28 4c 4f  BLE_TYPE x = (LO
1d470 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 29 69 3b  NGDOUBLE_TYPE)i;
1d480 0a 20 20 20 20 69 66 28 20 78 3c 72 20 29 20 72  .    if( x<r ) r
1d490 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66  eturn -1;.    if
1d4a0 28 20 78 3e 72 20 29 20 72 65 74 75 72 6e 20 2b  ( x>r ) return +
1d4b0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  1;.    return 0;
1d4c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 36  .  }else{.    i6
1d4d0 34 20 79 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20  4 y;.    double 
1d4e0 73 3b 0a 20 20 20 20 69 66 28 20 72 3c 2d 39 32  s;.    if( r<-92
1d4f0 32 33 33 37 32 30 33 36 38 35 34 37 37 35 38 30  2337203685477580
1d500 38 2e 30 20 29 20 72 65 74 75 72 6e 20 2b 31 3b  8.0 ) return +1;
1d510 0a 20 20 20 20 69 66 28 20 72 3e 39 32 32 33 33  .    if( r>92233
1d520 37 32 30 33 36 38 35 34 37 37 35 38 30 37 2e 30  72036854775807.0
1d530 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d540 20 20 79 20 3d 20 28 69 36 34 29 72 3b 0a 20 20    y = (i64)r;.  
1d550 20 20 69 66 28 20 69 3c 79 20 29 20 72 65 74 75    if( i<y ) retu
1d560 72 6e 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 69  rn -1;.    if( i
1d570 3e 79 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  >y ){.      if( 
1d580 79 3d 3d 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36  y==SMALLEST_INT6
1d590 34 20 26 26 20 72 3e 30 2e 30 20 29 20 72 65 74  4 && r>0.0 ) ret
1d5a0 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  urn -1;.      re
1d5b0 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 7d 0a 20  turn +1;.    }. 
1d5c0 20 20 20 73 20 3d 20 28 64 6f 75 62 6c 65 29 69     s = (double)i
1d5d0 3b 0a 20 20 20 20 69 66 28 20 73 3c 72 20 29 20  ;.    if( s<r ) 
1d5e0 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 69  return -1;.    i
1d5f0 66 28 20 73 3e 72 20 29 20 72 65 74 75 72 6e 20  f( s>r ) return 
1d600 2b 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  +1;.    return 0
1d610 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1d620 6f 6d 70 61 72 65 20 74 68 65 20 76 61 6c 75 65  ompare the value
1d630 73 20 63 6f 6e 74 61 69 6e 65 64 20 62 79 20 74  s contained by t
1d640 68 65 20 74 77 6f 20 6d 65 6d 6f 72 79 20 63 65  he two memory ce
1d650 6c 6c 73 2c 20 72 65 74 75 72 6e 69 6e 67 0a 2a  lls, returning.*
1d660 2a 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  * negative, zero
1d670 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20   or positive if 
1d680 70 4d 65 6d 31 20 69 73 20 6c 65 73 73 20 74 68  pMem1 is less th
1d690 61 6e 2c 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72  an, equal to, or
1d6a0 20 67 72 65 61 74 65 72 0a 2a 2a 20 74 68 61 6e   greater.** than
1d6b0 20 70 4d 65 6d 32 2e 20 53 6f 72 74 69 6e 67 20   pMem2. Sorting 
1d6c0 6f 72 64 65 72 20 69 73 20 4e 55 4c 4c 27 73 20  order is NULL's 
1d6d0 66 69 72 73 74 2c 20 66 6f 6c 6c 6f 77 65 64 20  first, followed 
1d6e0 62 79 20 6e 75 6d 62 65 72 73 20 28 69 6e 74 65  by numbers (inte
1d6f0 67 65 72 73 0a 2a 2a 20 61 6e 64 20 72 65 61 6c  gers.** and real
1d700 73 29 20 73 6f 72 74 65 64 20 6e 75 6d 65 72 69  s) sorted numeri
1d710 63 61 6c 6c 79 2c 20 66 6f 6c 6c 6f 77 65 64 20  cally, followed 
1d720 62 79 20 74 65 78 74 20 6f 72 64 65 72 65 64 20  by text ordered 
1d730 62 79 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  by the collating
1d740 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 70 43 6f  .** sequence pCo
1d750 6c 6c 20 61 6e 64 20 66 69 6e 61 6c 6c 79 20 62  ll and finally b
1d760 6c 6f 62 27 73 20 6f 72 64 65 72 65 64 20 62 79  lob's ordered by
1d770 20 6d 65 6d 63 6d 70 28 29 2e 0a 2a 2a 0a 2a 2a   memcmp()..**.**
1d780 20 54 77 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73   Two NULL values
1d790 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 20   are considered 
1d7a0 65 71 75 61 6c 20 62 79 20 74 68 69 73 20 66 75  equal by this fu
1d7b0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
1d7c0 71 6c 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65  qlite3MemCompare
1d7d0 28 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d 65 6d  (const Mem *pMem
1d7e0 31 2c 20 63 6f 6e 73 74 20 4d 65 6d 20 2a 70 4d  1, const Mem *pM
1d7f0 65 6d 32 2c 20 63 6f 6e 73 74 20 43 6f 6c 6c 53  em2, const CollS
1d800 65 71 20 2a 70 43 6f 6c 6c 29 7b 0a 20 20 69 6e  eq *pColl){.  in
1d810 74 20 66 31 2c 20 66 32 3b 0a 20 20 69 6e 74 20  t f1, f2;.  int 
1d820 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 3b 0a  combined_flags;.
1d830 0a 20 20 66 31 20 3d 20 70 4d 65 6d 31 2d 3e 66  .  f1 = pMem1->f
1d840 6c 61 67 73 3b 0a 20 20 66 32 20 3d 20 70 4d 65  lags;.  f2 = pMe
1d850 6d 32 2d 3e 66 6c 61 67 73 3b 0a 20 20 63 6f 6d  m2->flags;.  com
1d860 62 69 6e 65 64 5f 66 6c 61 67 73 20 3d 20 66 31  bined_flags = f1
1d870 7c 66 32 3b 0a 20 20 61 73 73 65 72 74 28 20 28  |f2;.  assert( (
1d880 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67 73 20 26  combined_flags &
1d890 20 4d 45 4d 5f 52 6f 77 53 65 74 29 3d 3d 30 20   MEM_RowSet)==0 
1d8a0 29 3b 0a 20 0a 20 20 2f 2a 20 49 66 20 6f 6e 65  );. .  /* If one
1d8b0 20 76 61 6c 75 65 20 69 73 20 4e 55 4c 4c 2c 20   value is NULL, 
1d8c0 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
1d8d0 74 68 65 20 6f 74 68 65 72 2e 20 49 66 20 62 6f  the other. If bo
1d8e0 74 68 20 76 61 6c 75 65 73 0a 20 20 2a 2a 20 61  th values.  ** a
1d8f0 72 65 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  re NULL, return 
1d900 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f  0..  */.  if( co
1d910 6d 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d  mbined_flags&MEM
1d920 5f 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  _Null ){.    ret
1d930 75 72 6e 20 28 66 32 26 4d 45 4d 5f 4e 75 6c 6c  urn (f2&MEM_Null
1d940 29 20 2d 20 28 66 31 26 4d 45 4d 5f 4e 75 6c 6c  ) - (f1&MEM_Null
1d950 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
1d960 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65  least one of the
1d970 20 74 77 6f 20 76 61 6c 75 65 73 20 69 73 20 61   two values is a
1d980 20 6e 75 6d 62 65 72 0a 20 20 2a 2f 0a 20 20 69   number.  */.  i
1d990 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61 67  f( combined_flag
1d9a0 73 26 28 4d 45 4d 5f 49 6e 74 7c 4d 45 4d 5f 52  s&(MEM_Int|MEM_R
1d9b0 65 61 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  eal) ){.    if( 
1d9c0 28 66 31 20 26 20 66 32 20 26 20 4d 45 4d 5f 49  (f1 & f2 & MEM_I
1d9d0 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  nt)!=0 ){.      
1d9e0 69 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3c  if( pMem1->u.i <
1d9f0 20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65   pMem2->u.i ) re
1da00 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69  turn -1;.      i
1da10 66 28 20 70 4d 65 6d 31 2d 3e 75 2e 69 20 3e 20  f( pMem1->u.i > 
1da20 70 4d 65 6d 32 2d 3e 75 2e 69 20 29 20 72 65 74  pMem2->u.i ) ret
1da30 75 72 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65  urn +1;.      re
1da40 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
1da50 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20 26    if( (f1 & f2 &
1da60 20 4d 45 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b   MEM_Real)!=0 ){
1da70 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1da80 2d 3e 75 2e 72 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.r < pMem2->u
1da90 2e 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .r ) return -1;.
1daa0 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1dab0 3e 75 2e 72 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.r > pMem2->u.
1dac0 72 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  r ) return +1;. 
1dad0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1dae0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1daf0 26 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b 0a  &MEM_Int)!=0 ){.
1db00 20 20 20 20 20 20 69 66 28 20 28 66 32 26 4d 45        if( (f2&ME
1db10 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1db20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1db30 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70  ite3IntFloatComp
1db40 61 72 65 28 70 4d 65 6d 31 2d 3e 75 2e 69 2c 20  are(pMem1->u.i, 
1db50 70 4d 65 6d 32 2d 3e 75 2e 72 29 3b 0a 20 20 20  pMem2->u.r);.   
1db60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1db70 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
1db80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1db90 66 28 20 28 66 31 26 4d 45 4d 5f 52 65 61 6c 29  f( (f1&MEM_Real)
1dba0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1dbb0 20 28 66 32 26 4d 45 4d 5f 49 6e 74 29 21 3d 30   (f2&MEM_Int)!=0
1dbc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
1dbd0 72 6e 20 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c  rn -sqlite3IntFl
1dbe0 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 32  oatCompare(pMem2
1dbf0 2d 3e 75 2e 69 2c 20 70 4d 65 6d 31 2d 3e 75 2e  ->u.i, pMem1->u.
1dc00 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1dc10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1dc20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1dc30 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b  }.    return +1;
1dc40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6f 6e  .  }..  /* If on
1dc50 65 20 76 61 6c 75 65 20 69 73 20 61 20 73 74 72  e value is a str
1dc60 69 6e 67 20 61 6e 64 20 74 68 65 20 6f 74 68 65  ing and the othe
1dc70 72 20 69 73 20 61 20 62 6c 6f 62 2c 20 74 68 65  r is a blob, the
1dc80 20 73 74 72 69 6e 67 20 69 73 20 6c 65 73 73 2e   string is less.
1dc90 0a 20 20 2a 2a 20 49 66 20 62 6f 74 68 20 61 72  .  ** If both ar
1dca0 65 20 73 74 72 69 6e 67 73 2c 20 63 6f 6d 70 61  e strings, compa
1dcb0 72 65 20 75 73 69 6e 67 20 74 68 65 20 63 6f 6c  re using the col
1dcc0 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73  lating functions
1dcd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d  ..  */.  if( com
1dce0 62 69 6e 65 64 5f 66 6c 61 67 73 26 4d 45 4d 5f  bined_flags&MEM_
1dcf0 53 74 72 20 29 7b 0a 20 20 20 20 69 66 28 20 28  Str ){.    if( (
1dd00 66 31 20 26 20 4d 45 4d 5f 53 74 72 29 3d 3d 30  f1 & MEM_Str)==0
1dd10 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1dd20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
1dd30 28 20 28 66 32 20 26 20 4d 45 4d 5f 53 74 72 29  ( (f2 & MEM_Str)
1dd40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
1dd50 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 0a 20  urn -1;.    }.. 
1dd60 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d 31     assert( pMem1
1dd70 2d 3e 65 6e 63 3d 3d 70 4d 65 6d 32 2d 3e 65 6e  ->enc==pMem2->en
1dd80 63 20 7c 7c 20 70 4d 65 6d 31 2d 3e 64 62 2d 3e  c || pMem1->db->
1dd90 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
1dda0 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 65 6d      assert( pMem
1ddb0 31 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  1->enc==SQLITE_U
1ddc0 54 46 38 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  TF8 || .        
1ddd0 20 20 20 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d      pMem1->enc==
1dde0 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
1ddf0 7c 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53 51  | pMem1->enc==SQ
1de00 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
1de10 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 6c  .    /* The coll
1de20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6d  ation sequence m
1de30 75 73 74 20 62 65 20 64 65 66 69 6e 65 64 20 61  ust be defined a
1de40 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 65 76  t this point, ev
1de50 65 6e 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  en if.    ** the
1de60 20 75 73 65 72 20 64 65 6c 65 74 65 73 20 74 68   user deletes th
1de70 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
1de80 65 6e 63 65 20 61 66 74 65 72 20 74 68 65 20 76  ence after the v
1de90 64 62 65 20 70 72 6f 67 72 61 6d 20 69 73 0a 20  dbe program is. 
1dea0 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 20 28     ** compiled (
1deb0 74 68 69 73 20 77 61 73 20 6e 6f 74 20 61 6c 77  this was not alw
1dec0 61 79 73 20 74 68 65 20 63 61 73 65 29 2e 0a 20  ays the case).. 
1ded0 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
1dee0 28 20 21 70 43 6f 6c 6c 20 7c 7c 20 70 43 6f 6c  ( !pColl || pCol
1def0 6c 2d 3e 78 43 6d 70 20 29 3b 0a 0a 20 20 20 20  l->xCmp );..    
1df00 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20  if( pColl ){.   
1df10 20 20 20 72 65 74 75 72 6e 20 76 64 62 65 43 6f     return vdbeCo
1df20 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28 70  mpareMemString(p
1df30 4d 65 6d 31 2c 20 70 4d 65 6d 32 2c 20 70 43 6f  Mem1, pMem2, pCo
1df40 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ll, 0);.    }.  
1df50 20 20 2f 2a 20 49 66 20 61 20 4e 55 4c 4c 20 70    /* If a NULL p
1df60 6f 69 6e 74 65 72 20 77 61 73 20 70 61 73 73 65  ointer was passe
1df70 64 20 61 73 20 74 68 65 20 63 6f 6c 6c 61 74 65  d as the collate
1df80 20 66 75 6e 63 74 69 6f 6e 2c 20 66 61 6c 6c 20   function, fall 
1df90 74 68 72 6f 75 67 68 0a 20 20 20 20 2a 2a 20 74  through.    ** t
1dfa0 6f 20 74 68 65 20 62 6c 6f 62 20 63 61 73 65 20  o the blob case 
1dfb0 61 6e 64 20 75 73 65 20 6d 65 6d 63 6d 70 28 29  and use memcmp()
1dfc0 2e 20 20 2a 2f 0a 20 20 7d 0a 20 0a 20 20 2f 2a  .  */.  }. .  /*
1dfd0 20 42 6f 74 68 20 76 61 6c 75 65 73 20 6d 75 73   Both values mus
1dfe0 74 20 62 65 20 62 6c 6f 62 73 2e 20 20 43 6f 6d  t be blobs.  Com
1dff0 70 61 72 65 20 75 73 69 6e 67 20 6d 65 6d 63 6d  pare using memcm
1e000 70 28 29 2e 20 20 2a 2f 0a 20 20 72 65 74 75 72  p().  */.  retur
1e010 6e 20 73 71 6c 69 74 65 33 42 6c 6f 62 43 6f 6d  n sqlite3BlobCom
1e020 70 61 72 65 28 70 4d 65 6d 31 2c 20 70 4d 65 6d  pare(pMem1, pMem
1e030 32 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  2);.}.../*.** Th
1e040 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
1e050 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
1e060 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 73 65  function is a se
1e070 72 69 61 6c 2d 74 79 70 65 20 74 68 61 74 0a 2a  rial-type that.*
1e080 2a 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  * corresponds to
1e090 20 61 6e 20 69 6e 74 65 67 65 72 20 2d 20 61 6c   an integer - al
1e0a0 6c 20 76 61 6c 75 65 73 20 62 65 74 77 65 65 6e  l values between
1e0b0 20 31 20 61 6e 64 20 39 20 69 6e 63 6c 75 73 69   1 and 9 inclusi
1e0c0 76 65 20 0a 2a 2a 20 65 78 63 65 70 74 20 37 2e  ve .** except 7.
1e0d0 20 54 68 65 20 73 65 63 6f 6e 64 20 70 6f 69 6e   The second poin
1e0e0 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  ts to a buffer c
1e0f0 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 69 6e 74  ontaining an int
1e100 65 67 65 72 20 76 61 6c 75 65 0a 2a 2a 20 73 65  eger value.** se
1e110 72 69 61 6c 69 7a 65 64 20 61 63 63 6f 72 64 69  rialized accordi
1e120 6e 67 20 74 6f 20 73 65 72 69 61 6c 5f 74 79 70  ng to serial_typ
1e130 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  e. This function
1e140 20 64 65 73 65 72 69 61 6c 69 7a 65 73 0a 2a 2a   deserializes.**
1e150 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65   and returns the
1e160 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
1e170 63 20 69 36 34 20 76 64 62 65 52 65 63 6f 72 64  c i64 vdbeRecord
1e180 44 65 63 6f 64 65 49 6e 74 28 75 33 32 20 73 65  DecodeInt(u32 se
1e190 72 69 61 6c 5f 74 79 70 65 2c 20 63 6f 6e 73 74  rial_type, const
1e1a0 20 75 38 20 2a 61 4b 65 79 29 7b 0a 20 20 75 33   u8 *aKey){.  u3
1e1b0 32 20 79 3b 0a 20 20 61 73 73 65 72 74 28 20 43  2 y;.  assert( C
1e1c0 4f 52 52 55 50 54 5f 44 42 20 7c 7c 20 28 73 65  ORRUPT_DB || (se
1e1d0 72 69 61 6c 5f 74 79 70 65 3e 3d 31 20 26 26 20  rial_type>=1 && 
1e1e0 73 65 72 69 61 6c 5f 74 79 70 65 3c 3d 39 20 26  serial_type<=9 &
1e1f0 26 20 73 65 72 69 61 6c 5f 74 79 70 65 21 3d 37  & serial_type!=7
1e200 29 20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73  ) );.  switch( s
1e210 65 72 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20  erial_type ){.  
1e220 20 20 63 61 73 65 20 30 3a 0a 20 20 20 20 63 61    case 0:.    ca
1e230 73 65 20 31 3a 0a 20 20 20 20 20 20 74 65 73 74  se 1:.      test
1e240 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30 78  case( aKey[0]&0x
1e250 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  80 );.      retu
1e260 72 6e 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28  rn ONE_BYTE_INT(
1e270 61 4b 65 79 29 3b 0a 20 20 20 20 63 61 73 65 20  aKey);.    case 
1e280 32 3a 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  2:.      testcas
1e290 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e2a0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1e2b0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
1e2c0 79 29 3b 0a 20 20 20 20 63 61 73 65 20 33 3a 0a  y);.    case 3:.
1e2d0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1e2e0 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a  aKey[0]&0x80 );.
1e2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 48 52        return THR
1e300 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79  EE_BYTE_INT(aKey
1e310 29 3b 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b  );.    case 4: {
1e320 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
1e330 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29 3b   aKey[0]&0x80 );
1e340 0a 20 20 20 20 20 20 79 20 3d 20 46 4f 55 52 5f  .      y = FOUR_
1e350 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79 29 3b  BYTE_UINT(aKey);
1e360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 69  .      return (i
1e370 36 34 29 2a 28 69 6e 74 2a 29 26 79 3b 0a 20 20  64)*(int*)&y;.  
1e380 20 20 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20    }.    case 5: 
1e390 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  {.      testcase
1e3a0 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20 29  ( aKey[0]&0x80 )
1e3b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 46  ;.      return F
1e3c0 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b  OUR_BYTE_UINT(aK
1e3d0 65 79 2b 32 29 20 2b 20 28 28 28 69 36 34 29 31  ey+2) + (((i64)1
1e3e0 29 3c 3c 33 32 29 2a 54 57 4f 5f 42 59 54 45 5f  )<<32)*TWO_BYTE_
1e3f0 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 7d  INT(aKey);.    }
1e400 0a 20 20 20 20 63 61 73 65 20 36 3a 20 7b 0a 20  .    case 6: {. 
1e410 20 20 20 20 20 75 36 34 20 78 20 3d 20 46 4f 55       u64 x = FOU
1e420 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65 79  R_BYTE_UINT(aKey
1e430 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1e440 65 28 20 61 4b 65 79 5b 30 5d 26 30 78 38 30 20  e( aKey[0]&0x80 
1e450 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 28 78 3c  );.      x = (x<
1e460 3c 33 32 29 20 7c 20 46 4f 55 52 5f 42 59 54 45  <32) | FOUR_BYTE
1e470 5f 55 49 4e 54 28 61 4b 65 79 2b 34 29 3b 0a 20  _UINT(aKey+4);. 
1e480 20 20 20 20 20 72 65 74 75 72 6e 20 28 69 36 34       return (i64
1e490 29 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20 20  )*(i64*)&x;.    
1e4a0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
1e4b0 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d 20 38  (serial_type - 8
1e4c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1e4d0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72   function compar
1e4e0 65 73 20 74 68 65 20 74 77 6f 20 74 61 62 6c 65  es the two table
1e4f0 20 72 6f 77 73 20 6f 72 20 69 6e 64 65 78 20 72   rows or index r
1e500 65 63 6f 72 64 73 0a 2a 2a 20 73 70 65 63 69 66  ecords.** specif
1e510 69 65 64 20 62 79 20 7b 6e 4b 65 79 31 2c 20 70  ied by {nKey1, p
1e520 4b 65 79 31 7d 20 61 6e 64 20 70 50 4b 65 79 32  Key1} and pPKey2
1e530 2e 20 20 49 74 20 72 65 74 75 72 6e 73 20 61 20  .  It returns a 
1e540 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 0a 2a  negative, zero.*
1e550 2a 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 6e  * or positive in
1e560 74 65 67 65 72 20 69 66 20 6b 65 79 31 20 69 73  teger if key1 is
1e570 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1e580 6c 20 74 6f 20 6f 72 20 0a 2a 2a 20 67 72 65 61  l to or .** grea
1e590 74 65 72 20 74 68 61 6e 20 6b 65 79 32 2e 20 20  ter than key2.  
1e5a0 54 68 65 20 7b 6e 4b 65 79 31 2c 20 70 4b 65 79  The {nKey1, pKey
1e5b0 31 7d 20 6b 65 79 20 6d 75 73 74 20 62 65 20 61  1} key must be a
1e5c0 20 62 6c 6f 62 0a 2a 2a 20 63 72 65 61 74 65 64   blob.** created
1e5d0 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52   by the OP_MakeR
1e5e0 65 63 6f 72 64 20 6f 70 63 6f 64 65 20 6f 66 20  ecord opcode of 
1e5f0 74 68 65 20 56 44 42 45 2e 20 20 54 68 65 20 70  the VDBE.  The p
1e600 50 4b 65 79 32 0a 2a 2a 20 6b 65 79 20 6d 75 73  PKey2.** key mus
1e610 74 20 62 65 20 61 20 70 61 72 73 65 64 20 6b 65  t be a parsed ke
1e620 79 20 73 75 63 68 20 61 73 20 6f 62 74 61 69 6e  y such as obtain
1e630 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c 69 74  ed from.** sqlit
1e640 65 33 56 64 62 65 50 61 72 73 65 52 65 63 6f 72  e3VdbeParseRecor
1e650 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 72 67 75  d..**.** If argu
1e660 6d 65 6e 74 20 62 53 6b 69 70 20 69 73 20 6e 6f  ment bSkip is no
1e670 6e 2d 7a 65 72 6f 2c 20 69 74 20 69 73 20 61 73  n-zero, it is as
1e680 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 63  sumed that the c
1e690 61 6c 6c 65 72 20 68 61 73 20 61 6c 72 65 61 64  aller has alread
1e6a0 79 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20  y.** determined 
1e6b0 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 66  that the first f
1e6c0 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6b 65 79  ields of the key
1e6d0 73 20 61 72 65 20 65 71 75 61 6c 2e 0a 2a 2a 0a  s are equal..**.
1e6e0 2a 2a 20 4b 65 79 31 20 61 6e 64 20 4b 65 79 32  ** Key1 and Key2
1e6f0 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 6f 20   do not have to 
1e700 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65  contain the same
1e710 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1e720 73 2e 20 49 66 20 61 6c 6c 20 0a 2a 2a 20 66 69  s. If all .** fi
1e730 65 6c 64 73 20 74 68 61 74 20 61 70 70 65 61 72  elds that appear
1e740 20 69 6e 20 62 6f 74 68 20 6b 65 79 73 20 61 72   in both keys ar
1e750 65 20 65 71 75 61 6c 2c 20 74 68 65 6e 20 70 50  e equal, then pP
1e760 4b 65 79 32 2d 3e 64 65 66 61 75 6c 74 5f 72 63  Key2->default_rc
1e770 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
1e780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 62  ..**.** If datab
1e790 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  ase corruption i
1e7a0 73 20 64 69 73 63 6f 76 65 72 65 64 2c 20 73 65  s discovered, se
1e7b0 74 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64  t pPKey2->errCod
1e7c0 65 20 74 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  e to .** SQLITE_
1e7d0 43 4f 52 52 55 50 54 20 61 6e 64 20 72 65 74 75  CORRUPT and retu
1e7e0 72 6e 20 30 2e 20 49 66 20 61 6e 20 4f 4f 4d 20  rn 0. If an OOM 
1e7f0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1e800 65 72 65 64 2c 20 0a 2a 2a 20 70 50 4b 65 79 32  ered, .** pPKey2
1e810 2d 3e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74  ->errCode is set
1e820 20 74 6f 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   to SQLITE_NOMEM
1e830 20 61 6e 64 2c 20 69 66 20 69 74 20 69 73 20 6e   and, if it is n
1e840 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 0a 2a 2a 20  ot NULL, the.** 
1e850 6d 61 6c 6c 6f 63 2d 66 61 69 6c 65 64 20 66 6c  malloc-failed fl
1e860 61 67 20 73 65 74 20 6f 6e 20 64 61 74 61 62 61  ag set on databa
1e870 73 65 20 68 61 6e 64 6c 65 20 28 70 50 4b 65 79  se handle (pPKey
1e880 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 29  2->pKeyInfo->db)
1e890 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e8a0 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72  VdbeRecordCompar
1e8b0 65 57 69 74 68 53 6b 69 70 28 0a 20 20 69 6e 74  eWithSkip(.  int
1e8c0 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
1e8d0 69 64 20 2a 70 4b 65 79 31 2c 20 20 20 2f 2a 20  id *pKey1,   /* 
1e8e0 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
1e8f0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
1e900 4b 65 79 32 2c 20 20 20 20 20 20 20 20 20 2f 2a  Key2,         /*
1e910 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 20 20   Right key */.  
1e920 69 6e 74 20 62 53 6b 69 70 20 20 20 20 20 20 20  int bSkip       
1e930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e940 2f 2a 20 49 66 20 74 72 75 65 2c 20 73 6b 69 70  /* If true, skip
1e950 20 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64   the first field
1e960 20 2a 2f 0a 29 7b 0a 20 20 75 33 32 20 64 31 3b   */.){.  u32 d1;
1e970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e980 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1e990 65 74 20 69 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f  et into aKey[] o
1e9a0 66 20 6e 65 78 74 20 64 61 74 61 20 65 6c 65 6d  f next data elem
1e9b0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1e9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
1e9e0 78 20 6f 66 20 6e 65 78 74 20 66 69 65 6c 64 20  x of next field 
1e9f0 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a 20 20  to compare */.  
1ea00 75 33 32 20 73 7a 48 64 72 31 3b 20 20 20 20 20  u32 szHdr1;     
1ea10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 63 6f 72  /* Size of recor
1ea30 64 20 68 65 61 64 65 72 20 69 6e 20 62 79 74 65  d header in byte
1ea40 73 20 2a 2f 0a 20 20 75 33 32 20 69 64 78 31 3b  s */.  u32 idx1;
1ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea60 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
1ea70 20 6f 66 20 66 69 72 73 74 20 74 79 70 65 20 69   of first type i
1ea80 6e 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  n header */.  in
1ea90 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1eab0 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f   Return value */
1eac0 0a 20 20 4d 65 6d 20 2a 70 52 68 73 20 3d 20 70  .  Mem *pRhs = p
1ead0 50 4b 65 79 32 2d 3e 61 4d 65 6d 3b 20 20 20 20  PKey2->aMem;    
1eae0 20 20 20 2f 2a 20 4e 65 78 74 20 66 69 65 6c 64     /* Next field
1eaf0 20 6f 66 20 70 50 4b 65 79 32 20 74 6f 20 63 6f   of pPKey2 to co
1eb00 6d 70 61 72 65 20 2a 2f 0a 20 20 4b 65 79 49 6e  mpare */.  KeyIn
1eb10 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 20 3d 20 70  fo *pKeyInfo = p
1eb20 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 3b  PKey2->pKeyInfo;
1eb30 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
1eb40 64 20 63 68 61 72 20 2a 61 4b 65 79 31 20 3d 20  d char *aKey1 = 
1eb50 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1eb60 63 68 61 72 20 2a 29 70 4b 65 79 31 3b 0a 20 20  char *)pKey1;.  
1eb70 4d 65 6d 20 6d 65 6d 31 3b 0a 0a 20 20 2f 2a 20  Mem mem1;..  /* 
1eb80 49 66 20 62 53 6b 69 70 20 69 73 20 74 72 75 65  If bSkip is true
1eb90 2c 20 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 65  , then the calle
1eba0 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 64 65  r has already de
1ebb0 74 65 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68  termined that th
1ebc0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 77 6f  e first.  ** two
1ebd0 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65   elements in the
1ebe0 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
1ebf0 20 46 69 78 20 74 68 65 20 76 61 72 69 6f 75 73   Fix the various
1ec00 20 73 74 61 63 6b 20 76 61 72 69 61 62 6c 65 73   stack variables
1ec10 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68   so.  ** that th
1ec20 69 73 20 72 6f 75 74 69 6e 65 20 62 65 67 69 6e  is routine begin
1ec30 73 20 63 6f 6d 70 61 72 69 6e 67 20 61 74 20 74  s comparing at t
1ec40 68 65 20 73 65 63 6f 6e 64 20 66 69 65 6c 64 2e  he second field.
1ec50 20 2a 2f 0a 20 20 69 66 28 20 62 53 6b 69 70 20   */.  if( bSkip 
1ec60 29 7b 0a 20 20 20 20 75 33 32 20 73 31 3b 0a 20  ){.    u32 s1;. 
1ec70 20 20 20 69 64 78 31 20 3d 20 31 20 2b 20 67 65     idx1 = 1 + ge
1ec80 74 56 61 72 69 6e 74 33 32 28 26 61 4b 65 79 31  tVarint32(&aKey1
1ec90 5b 31 5d 2c 20 73 31 29 3b 0a 20 20 20 20 73 7a  [1], s1);.    sz
1eca0 48 64 72 31 20 3d 20 61 4b 65 79 31 5b 30 5d 3b  Hdr1 = aKey1[0];
1ecb0 0a 20 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31  .    d1 = szHdr1
1ecc0 20 2b 20 73 71 6c 69 74 65 33 56 64 62 65 53 65   + sqlite3VdbeSe
1ecd0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 31 29 3b  rialTypeLen(s1);
1ece0 0a 20 20 20 20 69 20 3d 20 31 3b 0a 20 20 20 20  .    i = 1;.    
1ecf0 70 52 68 73 2b 2b 3b 0a 20 20 7d 65 6c 73 65 7b  pRhs++;.  }else{
1ed00 0a 20 20 20 20 69 64 78 31 20 3d 20 67 65 74 56  .    idx1 = getV
1ed10 61 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73  arint32(aKey1, s
1ed20 7a 48 64 72 31 29 3b 0a 20 20 20 20 64 31 20 3d  zHdr1);.    d1 =
1ed30 20 73 7a 48 64 72 31 3b 0a 20 20 20 20 69 66 28   szHdr1;.    if(
1ed40 20 64 31 3e 28 75 6e 73 69 67 6e 65 64 29 6e 4b   d1>(unsigned)nK
1ed50 65 79 31 20 29 7b 20 0a 20 20 20 20 20 20 70 50  ey1 ){ .      pP
1ed60 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20 3d 20  Key2->errCode = 
1ed70 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52 52 55  (u8)SQLITE_CORRU
1ed80 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 72  PT_BKPT;.      r
1ed90 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 43 6f 72  eturn 0;  /* Cor
1eda0 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d  ruption */.    }
1edb0 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 7d 0a  .    i = 0;.  }.
1edc0 0a 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6d 65 6d  .  VVA_ONLY( mem
1edd0 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d 20 30 3b 20  1.szMalloc = 0; 
1ede0 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65 64 65 64  ) /* Only needed
1edf0 20 62 79 20 61 73 73 65 72 74 28 29 20 73 74 61   by assert() sta
1ee00 74 65 6d 65 6e 74 73 20 2a 2f 0a 20 20 61 73 73  tements */.  ass
1ee10 65 72 74 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65  ert( pPKey2->pKe
1ee20 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 50  yInfo->nField+pP
1ee30 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e  Key2->pKeyInfo->
1ee40 6e 58 46 69 65 6c 64 3e 3d 70 50 4b 65 79 32 2d  nXField>=pPKey2-
1ee50 3e 6e 46 69 65 6c 64 20 0a 20 20 20 20 20 20 20  >nField .       
1ee60 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b  || CORRUPT_DB );
1ee70 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65 79  .  assert( pPKey
1ee80 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  2->pKeyInfo->aSo
1ee90 72 74 4f 72 64 65 72 21 3d 30 20 29 3b 0a 20 20  rtOrder!=0 );.  
1eea0 61 73 73 65 72 74 28 20 70 50 4b 65 79 32 2d 3e  assert( pPKey2->
1eeb0 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64  pKeyInfo->nField
1eec0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
1eed0 69 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20  idx1<=szHdr1 || 
1eee0 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20  CORRUPT_DB );.  
1eef0 64 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69  do{.    u32 seri
1ef00 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20 2f 2a  al_type;..    /*
1ef10 20 52 48 53 20 69 73 20 61 6e 20 69 6e 74 65 67   RHS is an integ
1ef20 65 72 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 52  er */.    if( pR
1ef30 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1ef40 49 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 65 72  Int ){.      ser
1ef50 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79 31  ial_type = aKey1
1ef60 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 74 65  [idx1];.      te
1ef70 73 74 63 61 73 65 28 20 73 65 72 69 61 6c 5f 74  stcase( serial_t
1ef80 79 70 65 3d 3d 31 32 20 29 3b 0a 20 20 20 20 20  ype==12 );.     
1ef90 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65   if( serial_type
1efa0 3e 3d 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20  >=10 ){.        
1efb0 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d  rc = +1;.      }
1efc0 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c 5f  else if( serial_
1efd0 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  type==0 ){.     
1efe0 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1eff0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69    }else if( seri
1f000 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20  al_type==7 ){.  
1f010 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f020 65 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79  eSerialGet(&aKey
1f030 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79  1[d1], serial_ty
1f040 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20 20 20 20  pe, &mem1);.    
1f050 20 20 20 20 72 63 20 3d 20 2d 73 71 6c 69 74 65      rc = -sqlite
1f060 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65  3IntFloatCompare
1f070 28 70 52 68 73 2d 3e 75 2e 69 2c 20 6d 65 6d 31  (pRhs->u.i, mem1
1f080 2e 75 2e 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c  .u.r);.      }el
1f090 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20  se{.        i64 
1f0a0 6c 68 73 20 3d 20 76 64 62 65 52 65 63 6f 72 64  lhs = vdbeRecord
1f0b0 44 65 63 6f 64 65 49 6e 74 28 73 65 72 69 61 6c  DecodeInt(serial
1f0c0 5f 74 79 70 65 2c 20 26 61 4b 65 79 31 5b 64 31  _type, &aKey1[d1
1f0d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 36 34 20  ]);.        i64 
1f0e0 72 68 73 20 3d 20 70 52 68 73 2d 3e 75 2e 69 3b  rhs = pRhs->u.i;
1f0f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 68 73  .        if( lhs
1f100 3c 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  <rhs ){.        
1f110 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20    rc = -1;.     
1f120 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 68 73     }else if( lhs
1f130 3e 72 68 73 20 29 7b 0a 20 20 20 20 20 20 20 20  >rhs ){.        
1f140 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20    rc = +1;.     
1f150 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1f160 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69   }..    /* RHS i
1f170 73 20 72 65 61 6c 20 2a 2f 0a 20 20 20 20 65 6c  s real */.    el
1f180 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61  se if( pRhs->fla
1f190 67 73 20 26 20 4d 45 4d 5f 52 65 61 6c 20 29 7b  gs & MEM_Real ){
1f1a0 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74 79  .      serial_ty
1f1b0 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d  pe = aKey1[idx1]
1f1c0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1f1d0 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1f1e0 20 20 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c         /* Serial
1f1f0 20 74 79 70 65 73 20 31 32 20 6f 72 20 67 72 65   types 12 or gre
1f200 61 74 65 72 20 61 72 65 20 73 74 72 69 6e 67 73  ater are strings
1f210 20 61 6e 64 20 62 6c 6f 62 73 20 28 67 72 65 61   and blobs (grea
1f220 74 65 72 20 74 68 61 6e 0a 20 20 20 20 20 20 20  ter than.       
1f230 20 2a 2a 20 6e 75 6d 62 65 72 73 29 2e 20 54 79   ** numbers). Ty
1f240 70 65 73 20 31 30 20 61 6e 64 20 31 31 20 61 72  pes 10 and 11 ar
1f250 65 20 63 75 72 72 65 6e 74 6c 79 20 22 72 65 73  e currently "res
1f260 65 72 76 65 64 20 66 6f 72 20 66 75 74 75 72 65  erved for future
1f270 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 75 73 65   .        ** use
1f280 22 2c 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74  ", so it doesn't
1f290 20 72 65 61 6c 6c 79 20 6d 61 74 74 65 72 20 77   really matter w
1f2a0 68 61 74 20 74 68 65 20 72 65 73 75 6c 74 73 20  hat the results 
1f2b0 6f 66 20 63 6f 6d 70 61 72 69 6e 67 0a 20 20 20  of comparing.   
1f2c0 20 20 20 20 20 2a 2a 20 74 68 65 6d 20 74 6f 20       ** them to 
1f2d0 6e 75 6d 62 65 72 69 63 20 76 61 6c 75 65 73 20  numberic values 
1f2e0 61 72 65 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  are.  */.       
1f2f0 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20   rc = +1;.      
1f300 7d 65 6c 73 65 20 69 66 28 20 73 65 72 69 61 6c  }else if( serial
1f310 5f 74 79 70 65 3d 3d 30 20 29 7b 0a 20 20 20 20  _type==0 ){.    
1f320 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20      rc = -1;.   
1f330 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f340 20 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 72    sqlite3VdbeSer
1f350 69 61 6c 47 65 74 28 26 61 4b 65 79 31 5b 64 31  ialGet(&aKey1[d1
1f360 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c 20  ], serial_type, 
1f370 26 6d 65 6d 31 29 3b 0a 20 20 20 20 20 20 20 20  &mem1);.        
1f380 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
1f390 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =7 ){.          
1f3a0 69 66 28 20 6d 65 6d 31 2e 75 2e 72 3c 70 52 68  if( mem1.u.r<pRh
1f3b0 73 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20  s->u.r ){.      
1f3c0 20 20 20 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20        rc = -1;. 
1f3d0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
1f3e0 66 28 20 6d 65 6d 31 2e 75 2e 72 3e 70 52 68 73  f( mem1.u.r>pRhs
1f3f0 2d 3e 75 2e 72 20 29 7b 0a 20 20 20 20 20 20 20  ->u.r ){.       
1f400 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20       rc = +1;.  
1f410 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1f430 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49     rc = sqlite3I
1f440 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72 65 28 6d  ntFloatCompare(m
1f450 65 6d 31 2e 75 2e 69 2c 20 70 52 68 73 2d 3e 75  em1.u.i, pRhs->u
1f460 2e 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  .r);.        }. 
1f470 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1f480 20 20 2f 2a 20 52 48 53 20 69 73 20 61 20 73 74    /* RHS is a st
1f490 72 69 6e 67 20 2a 2f 0a 20 20 20 20 65 6c 73 65  ring */.    else
1f4a0 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1f4b0 20 26 20 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20   & MEM_Str ){.  
1f4c0 20 20 20 20 67 65 74 56 61 72 69 6e 74 33 32 28      getVarint32(
1f4d0 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20 73 65  &aKey1[idx1], se
1f4e0 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20 20  rial_type);.    
1f4f0 20 20 74 65 73 74 63 61 73 65 28 20 73 65 72 69    testcase( seri
1f500 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b 0a 20  al_type==12 );. 
1f510 20 20 20 20 20 69 66 28 20 73 65 72 69 61 6c 5f       if( serial_
1f520 74 79 70 65 3c 31 32 20 29 7b 0a 20 20 20 20 20  type<12 ){.     
1f530 20 20 20 72 63 20 3d 20 2d 31 3b 0a 20 20 20 20     rc = -1;.    
1f540 20 20 7d 65 6c 73 65 20 69 66 28 20 21 28 73 65    }else if( !(se
1f550 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1f560 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1f570 3d 20 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = +1;.      }els
1f580 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 31 2e  e{.        mem1.
1f590 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65  n = (serial_type
1f5a0 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20 20 20   - 12) / 2;.    
1f5b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28 64      testcase( (d
1f5c0 31 2b 6d 65 6d 31 2e 6e 29 3d 3d 28 75 6e 73 69  1+mem1.n)==(unsi
1f5d0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f5e0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f5f0 28 64 31 2b 6d 65 6d 31 2e 6e 2b 31 29 3d 3d 28  (d1+mem1.n+1)==(
1f600 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1f620 31 2b 6d 65 6d 31 2e 6e 29 20 3e 20 28 75 6e 73  1+mem1.n) > (uns
1f630 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20  igned)nKey1 ){. 
1f640 20 20 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d           pPKey2-
1f650 3e 65 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53  >errCode = (u8)S
1f660 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f670 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  PT;.          re
1f680 74 75 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20  turn 0;         
1f690 20 20 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70         /* Corrup
1f6a0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1f6b0 7d 65 6c 73 65 20 69 66 28 20 70 4b 65 79 49 6e  }else if( pKeyIn
1f6c0 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 20 29 7b 0a  fo->aColl[i] ){.
1f6d0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 31 2e 65            mem1.e
1f6e0 6e 63 20 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65  nc = pKeyInfo->e
1f6f0 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  nc;.          me
1f700 6d 31 2e 64 62 20 3d 20 70 4b 65 79 49 6e 66 6f  m1.db = pKeyInfo
1f710 2d 3e 64 62 3b 0a 20 20 20 20 20 20 20 20 20 20  ->db;.          
1f720 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 4d 45 4d  mem1.flags = MEM
1f730 5f 53 74 72 3b 0a 20 20 20 20 20 20 20 20 20 20  _Str;.          
1f740 6d 65 6d 31 2e 7a 20 3d 20 28 63 68 61 72 2a 29  mem1.z = (char*)
1f750 26 61 4b 65 79 31 5b 64 31 5d 3b 0a 20 20 20 20  &aKey1[d1];.    
1f760 20 20 20 20 20 20 72 63 20 3d 20 76 64 62 65 43        rc = vdbeC
1f770 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e 67 28  ompareMemString(
1f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26  .              &
1f790 6d 65 6d 31 2c 20 70 52 68 73 2c 20 70 4b 65 79  mem1, pRhs, pKey
1f7a0 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 69 5d 2c 20  Info->aColl[i], 
1f7b0 26 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65  &pPKey2->errCode
1f7c0 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
1f7d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1f7e0 20 20 20 20 20 20 20 69 6e 74 20 6e 43 6d 70 20         int nCmp 
1f7f0 3d 20 4d 49 4e 28 6d 65 6d 31 2e 6e 2c 20 70 52  = MIN(mem1.n, pR
1f800 68 73 2d 3e 6e 29 3b 0a 20 20 20 20 20 20 20 20  hs->n);.        
1f810 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 26 61    rc = memcmp(&a
1f820 4b 65 79 31 5b 64 31 5d 2c 20 70 52 68 73 2d 3e  Key1[d1], pRhs->
1f830 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20 20 20 20 20  z, nCmp);.      
1f840 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20 29 20      if( rc==0 ) 
1f850 72 63 20 3d 20 6d 65 6d 31 2e 6e 20 2d 20 70 52  rc = mem1.n - pR
1f860 68 73 2d 3e 6e 3b 20 0a 20 20 20 20 20 20 20 20  hs->n; .        
1f870 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1f880 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1f890 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 65 6c 73   blob */.    els
1f8a0 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67  e if( pRhs->flag
1f8b0 73 20 26 20 4d 45 4d 5f 42 6c 6f 62 20 29 7b 0a  s & MEM_Blob ){.
1f8c0 20 20 20 20 20 20 67 65 74 56 61 72 69 6e 74 33        getVarint3
1f8d0 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d 2c 20  2(&aKey1[idx1], 
1f8e0 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20  serial_type);.  
1f8f0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73 65      testcase( se
1f900 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29 3b  rial_type==12 );
1f910 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61  .      if( seria
1f920 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28 73 65  l_type<12 || (se
1f930 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78 30 31  rial_type & 0x01
1f940 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
1f950 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  = -1;.      }els
1f960 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  e{.        int n
1f970 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f 74 79  Str = (serial_ty
1f980 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a 20 20  pe - 12) / 2;.  
1f990 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f9a0 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e 73 69  (d1+nStr)==(unsi
1f9b0 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a 20 20  gned)nKey1 );.  
1f9c0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f9d0 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28 75 6e  (d1+nStr+1)==(un
1f9e0 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f9f0 20 20 20 20 20 20 20 20 69 66 28 20 28 64 31 2b          if( (d1+
1fa00 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67 6e 65  nStr) > (unsigne
1fa10 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  d)nKey1 ){.     
1fa20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1fa30 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1fa40 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1fa50 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1fa60 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1fa70 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e     /* Corruption
1fa80 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   */.        }els
1fa90 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1faa0 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72   nCmp = MIN(nStr
1fab0 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1fac0 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1fad0 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1fae0 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1faf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fb00 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20  0 ) rc = nStr - 
1fb10 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pRhs->n;.       
1fb20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fb30 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1fb40 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  null */.    else
1fb50 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1fb60 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1fb70 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ];.      rc = (s
1fb80 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a  erial_type!=0);.
1fb90 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1fba0 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c!=0 ){.      if
1fbb0 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1fbc0 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1fbd0 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
1fbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1fbf0 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1fc00 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1fc10 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fc20 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
1fc30 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1fc40 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1fc50 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1fc60 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1fc70 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1fc80 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1fc90 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1fca0 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1fcb0 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1fcc0 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1fcd0 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1fce0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1fcf0 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
1fd00 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
1fd10 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1fd20 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
1fd30 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
1fd40 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1fd50 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1fd60 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1fd70 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1fd80 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1fd90 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1fda0 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1fdb0 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1fdc0 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1fdd0 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1fde0 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1fdf0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1fe00 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
1fe10 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1fe20 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1fe30 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1fe40 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
1fe50 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1fe60 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1fe70 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1fe80 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1fe90 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1fea0 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1feb0 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1fec0 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1fed0 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
1fee0 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
1fef0 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1ff00 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1ff10 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
1ff20 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
1ff30 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
1ff40 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1ff50 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
1ff60 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
1ff70 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1ff80 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
1ff90 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ffa0 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
1ffb0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1ffc0 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1ffd0 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1ffe0 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1fff0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
20000 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
20010 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
20020 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
20030 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
20040 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
20050 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
20060 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
20070 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
20080 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
20090 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
200a0 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
200b0 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
200c0 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
200d0 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
200e0 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
200f0 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
20100 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20110 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
20120 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
20130 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
20140 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
20150 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
20160 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
20170 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
20180 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
20190 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
201a0 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
201b0 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
201c0 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
201d0 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
201e0 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
201f0 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
20200 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20210 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
20220 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
20230 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
20240 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
20250 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
20260 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
20270 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
20280 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
20290 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
202a0 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
202b0 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
202c0 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
202d0 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
202e0 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
202f0 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a   v;.  i64 lhs;..
20300 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
20310 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
20320 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
20330 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
20340 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
20350 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
20360 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
20370 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
20380 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
20390 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
203a0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
203b0 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
203c0 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
203d0 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
203e0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
203f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20400 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
20410 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
20420 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20430 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
20440 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
20450 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
20460 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
20470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
20480 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
20490 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
204a0 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
204b0 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
204c0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
204d0 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
204e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
204f0 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
20500 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
20510 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20520 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
20530 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20540 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
20550 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
20560 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20570 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20580 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
20590 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
205a0 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
205b0 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
205c0 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
205d0 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
205e0 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
205f0 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20600 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20620 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
20630 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
20640 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20650 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
20660 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
20670 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
20680 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
20690 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
206a0 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
206b0 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
206c0 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
206d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
206e0 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
206f0 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
20700 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
20710 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
20720 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
20730 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
20740 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
20750 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
20760 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
20770 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
20780 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
20790 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
207a0 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
207b0 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
207c0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
207d0 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
207e0 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
207f0 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
20800 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
20810 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
20820 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
20830 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
20840 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
20850 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
20860 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
20870 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
20880 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
20890 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
208a0 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
208b0 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
208c0 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
208d0 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
208e0 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
208f0 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
20900 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20910 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
20920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20930 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
20940 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
20950 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
20960 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d  }..  v = pPKey2-
20970 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
20980 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
20990 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
209a0 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
209b0 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
209c0 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
209d0 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
209e0 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
209f0 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
20a00 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
20a10 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
20a20 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
20a30 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
20a40 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
20a50 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
20a60 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
20a70 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
20a80 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
20a90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
20aa0 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
20ab0 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
20ac0 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
20ad0 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
20ae0 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
20af0 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
20b00 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
20b10 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
20b20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20b30 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
20b40 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
20b50 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
20b60 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
20b70 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
20b80 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20b90 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
20ba0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
20bb0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20bc0 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
20bd0 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
20be0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20bf0 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
20c00 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
20c10 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
20c20 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
20c30 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
20c40 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
20c50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
20c60 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
20c70 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
20c80 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
20c90 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20ca0 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
20cb0 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20cc0 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
20cd0 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
20ce0 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
20cf0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
20d00 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
20d10 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20d20 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20d30 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
20d40 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20d50 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
20d60 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
20d70 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
20d80 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
20d90 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
20da0 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c  Key2->aMem[0].fl
20db0 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
20dc0 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
20dd0 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
20de0 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
20df0 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
20e00 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
20e10 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
20e20 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
20e30 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
20e40 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
20e50 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
20e60 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
20e70 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
20e80 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
20e90 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
20ea0 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
20eb0 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20ec0 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
20ed0 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
20ee0 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
20ef0 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
20f00 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
20f10 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
20f20 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
20f30 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
20f40 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
20f50 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
20f60 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
20f70 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
20f80 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
20f90 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20fa0 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
20fb0 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
20fc0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
20fd0 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
20fe0 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
20ff0 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
21000 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
21010 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21020 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
21030 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
21040 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
21050 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
21060 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
21070 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
21080 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
21090 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
210a0 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
210b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
210c0 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
210d0 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
210e0 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
210f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
21100 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
21110 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t_rc;.          
21120 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
21130 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
21140 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
21150 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
21160 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
21170 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
21180 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
21190 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
211a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
211b0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
211c0 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
211d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
211e0 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
211f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
21200 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
21210 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
21220 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21230 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
21240 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
21250 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
21260 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
21270 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
21280 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
21290 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
212a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
212b0 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
212c0 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
212d0 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
212e0 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
212f0 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
21300 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
21310 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
21320 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
21330 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
21340 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
21350 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
21360 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
21370 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
21380 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
21390 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
213a0 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
213b0 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
213c0 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
213d0 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
213e0 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
213f0 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
21400 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
21410 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
21420 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
21430 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
21440 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
21450 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
21460 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
21470 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
21480 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
21490 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
214a0 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
214b0 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
214c0 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
214d0 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
214e0 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
214f0 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
21500 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
21510 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
21520 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
21530 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
21540 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
21550 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
21560 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
21570 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
21580 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
21590 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
215a0 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
215b0 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
215c0 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
215d0 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
215e0 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
215f0 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
21600 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
21610 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
21620 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
21630 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
21640 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
21650 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
21660 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
21670 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
21680 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
21690 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
216a0 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
216b0 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b   */.  if( (p->pK
216c0 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
216d0 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58   p->pKeyInfo->nX
216e0 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20  Field)<=13 ){.  
216f0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
21700 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
21710 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
21720 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
21730 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
21740 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
21750 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
21760 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
21770 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
21780 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
21790 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
217a0 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
217b0 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
217c0 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
217d0 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
217e0 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
217f0 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
21800 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
21810 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
21820 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
21830 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
21840 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
21850 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
21860 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
21870 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
21880 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
21890 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
218a0 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
218b0 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
218c0 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
218d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
218e0 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
218f0 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
21900 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
21910 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
21920 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
21930 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
21940 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
21950 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
21960 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
21970 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
21980 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
21990 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
219a0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
219b0 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
219c0 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
219d0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
219e0 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
219f0 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
21a00 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
21a10 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
21a20 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
21a30 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
21a40 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
21a50 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
21a60 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
21a70 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
21a80 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
21a90 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
21aa0 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
21ab0 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
21ac0 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
21ad0 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
21ae0 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
21af0 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
21b00 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
21b10 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
21b20 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
21b30 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
21b40 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
21b50 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
21b60 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
21b70 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
21b80 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
21b90 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
21ba0 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
21bb0 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
21bc0 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
21bd0 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
21be0 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
21bf0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
21c00 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
21c10 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
21c20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21c30 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
21c40 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
21c50 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
21c60 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
21c70 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
21c80 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
21c90 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
21ca0 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
21cb0 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
21cc0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
21cd0 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
21ce0 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
21cf0 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
21d00 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
21d10 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
21d20 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
21d30 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
21d40 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
21d50 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
21d60 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
21d70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21d80 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
21d90 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
21da0 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
21db0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
21dc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21dd0 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
21de0 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
21df0 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
21e00 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
21e10 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
21e20 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
21e30 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
21e40 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
21e50 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
21e60 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
21e70 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
21e80 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
21e90 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
21ea0 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
21eb0 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
21ec0 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
21ed0 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
21ee0 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
21ef0 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
21f00 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
21f10 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
21f20 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
21f30 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
21f40 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
21f50 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
21f60 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21f70 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
21f80 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21f90 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
21fa0 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21fb0 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
21fc0 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
21fd0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21fe0 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
21ff0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
22000 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
22010 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
22020 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
22030 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
22040 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
22050 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
22060 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
22070 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
22080 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
22090 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
220a0 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
220b0 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
220c0 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b  izes[typeRowid];
220d0 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
220e0 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
220f0 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
22100 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
22110 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
22120 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
22130 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
22140 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
22150 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
22160 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
22170 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
22180 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
22190 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
221a0 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
221b0 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
221c0 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
221d0 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
221e0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
221f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22200 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
22210 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
22220 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
22230 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
22240 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
22250 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
22260 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
22270 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
22280 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
22290 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
222a0 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a    testcase( m.sz
222b0 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
222c0 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
222d0 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
222e0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
222f0 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
22300 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
22310 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
22320 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
22330 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
22340 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
22350 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
22360 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
22370 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
22380 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
22390 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
223a0 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
223b0 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
223c0 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
223d0 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
223e0 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
223f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22400 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
22410 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
22420 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
22430 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
22440 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
22450 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
22460 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
22470 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
22480 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
22490 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
224a0 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
224b0 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
224c0 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
224d0 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
224e0 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
224f0 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
22500 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
22510 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
22520 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
22530 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
22540 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
22550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22560 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
22570 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
22580 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20  VdbeCursor *pC, 
22590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
225a0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
225b0 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
225c0 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
225d0 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
225e0 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63  ,       /* Unpac
225f0 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
22600 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  ey */.  int *res
22610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22620 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
22630 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
22640 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
22650 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
22660 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
22670 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
22680 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
22690 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
226a0 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
226b0 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  EE );.  pCur = p
226c0 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
226d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
226e0 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
226f0 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43  id(pCur) );.  nC
22700 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
22710 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
22720 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65  (pCur);.  /* nCe
22730 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
22740 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
22750 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
22760 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
22770 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
22780 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
22790 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
227a0 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
227b0 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
227c0 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
227d0 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
227e0 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
227f0 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
22800 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22810 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
22820 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
22830 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
22840 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
22850 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
22860 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
22870 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
22880 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
22890 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
228a0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
228b0 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
228c0 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
228d0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
228e0 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
228f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
22910 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
22920 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
22930 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
22940 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
22950 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
22960 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22970 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
22980 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
22990 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
229a0 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
229b0 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
229c0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
229d0 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
229e0 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
229f0 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
22a00 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
22a10 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
22a20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
22a30 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
22a40 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
22a50 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
22a60 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
22a70 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
22a80 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
22a90 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
22aa0 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
22ab0 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
22ac0 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
22ad0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22ae0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22af0 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
22b00 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
22b10 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
22b20 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
22b30 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
22b40 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
22b50 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
22b60 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
22b70 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
22b80 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
22b90 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
22ba0 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
22bb0 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
22bc0 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
22bd0 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
22be0 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
22bf0 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
22c00 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
22c10 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
22c20 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
22c30 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
22c40 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
22c50 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
22c60 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
22c70 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
22c80 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
22c90 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
22ca0 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
22cb0 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
22cc0 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
22cd0 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
22ce0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22cf0 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
22d00 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
22d10 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
22d20 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
22d30 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
22d40 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
22d50 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22d60 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
22d70 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
22d80 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
22d90 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
22da0 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
22db0 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
22dc0 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
22dd0 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
22de0 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22df0 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
22e00 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
22e10 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
22e20 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
22e30 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
22e40 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
22e50 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22e60 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22e70 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
22e80 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
22e90 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
22ea0 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
22eb0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
22ec0 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
22ed0 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
22ee0 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
22ef0 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
22f00 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
22f10 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
22f20 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
22f30 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
22f40 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
22f50 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
22f60 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22f70 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
22f80 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
22f90 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
22fa0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22fb0 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
22fc0 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
22fd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22fe0 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
22ff0 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
23000 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
23010 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
23020 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
23030 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
23040 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
23050 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
23060 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
23070 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
23080 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
23090 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
230a0 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
230b0 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
230c0 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
230d0 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
230e0 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
230f0 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
23100 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
23110 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
23120 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23130 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
23140 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
23150 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
23160 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
23170 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
23180 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
23190 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
231a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
231b0 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
231c0 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
231d0 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
231e0 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
231f0 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
23200 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
23210 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
23220 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
23230 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
23240 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
23250 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
23260 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
23270 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
23280 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
23290 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
232a0 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
232b0 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
232c0 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
232d0 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
232e0 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
232f0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23300 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
23310 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
23320 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
23330 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
23340 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
23350 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
23360 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
23370 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
23380 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
23390 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
233a0 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
233b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
233c0 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
233d0 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
233e0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
233f0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
23400 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
23410 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
23420 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
23430 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
23440 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
23450 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
23460 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
23470 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
23480 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
23490 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
234a0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
234b0 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
234c0 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
234d0 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
234e0 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
234f0 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
23500 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
23510 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
23520 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
23530 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
23540 6c 69 74 65 33 20 2a 64 62 2c 20 55 6e 70 61 63  lite3 *db, Unpac
23550 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
23560 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
23570 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23580 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69  ; i<p->nField; i
23590 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  ++){.      Mem *
235a0 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
235b0 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  i];.      if( pM
235c0 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  em->zMalloc ) sq
235d0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
235e0 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ase(pMem);.    }
235f0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23600 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
23610 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23620 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
23630 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64  TE_HOOK */..#ifd
23640 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
23650 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
23660 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
23670 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
23680 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
23690 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
236a0 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c   pre-update call
236b0 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72  ,.** then cursor
236c0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
236d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
236e0 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74  hould point to t
236f0 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20  he row about.** 
23700 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20  to be update or 
23710 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20  deleted. If the 
23720 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c  application call
23730 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  s sqlite3_preupd
23740 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68  ate_old(),.** th
23750 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65  e required value
23760 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
23770 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  om the row the c
23780 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e  ursor points to.
23790 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
237a0 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f  VdbePreUpdateHoo
237b0 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  k(.  Vdbe *v,   
237c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237d0 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65       /* Vdbe pre
237e0 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20  -update hook is 
237f0 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20  invoked by */.  
23800 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72  VdbeCursor *pCsr
23810 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23820 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61  /* Cursor to gra
23830 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66  b old.* values f
23840 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  rom */.  int op,
23850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23860 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
23870 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54  TE_INSERT, UPDAT
23880 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20  E or DELETE */. 
23890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
238a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
238b0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
238c0 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
238d0 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
238e0 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69         /* Modifi
238f0 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36  ed table */.  i6
23900 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20  4 iKey1,        
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23920 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c   Initial key val
23930 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  ue */.  int iReg
23940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23950 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
23960 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65  ter for new.* re
23970 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  cord */.){.  sql
23980 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62  ite3 *db = v->db
23990 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20  ;.  i64 iKey2;. 
239a0 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70   PreUpdate preup
239b0 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  date;.  const ch
239c0 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d  ar *zTbl = pTab-
239d0 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63  >zName;.  static
239e0 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f   const u8 fakeSo
239f0 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20  rtOrder = 0;..  
23a00 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65  assert( db->pPre
23a10 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d  Update==0 );.  m
23a20 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65  emset(&preupdate
23a30 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55  , 0, sizeof(PreU
23a40 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 6f  pdate));.  if( o
23a50 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
23a60 20 29 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20   ){.    iKey2 = 
23a70 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e  v->aMem[iReg].u.
23a80 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
23a90 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
23aa0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43   }..  assert( pC
23ab0 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62  sr->nField==pTab
23ac0 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c  ->nCol .       |
23ad0 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  | (pCsr->nField=
23ae0 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26  =pTab->nCol+1 &&
23af0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
23b00 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a  TE && iReg==-1).
23b10 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74    );..  preupdat
23b20 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70  e.v = v;.  preup
23b30 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72  date.pCsr = pCsr
23b40 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70  ;.  preupdate.op
23b50 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61   = op;.  preupda
23b60 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65  te.iNewReg = iRe
23b70 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  g;.  preupdate.k
23b80 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a  eyinfo.db = db;.
23b90 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
23ba0 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62  nfo.enc = ENC(db
23bb0 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  );.  preupdate.k
23bc0 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyinfo.nField = 
23bd0 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72  pTab->nCol;.  pr
23be0 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
23bf0 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
23c00 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  *)&fakeSortOrder
23c10 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
23c20 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70  ey1 = iKey1;.  p
23c30 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d  reupdate.iKey2 =
23c40 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64   iKey2;.  preupd
23c50 61 74 65 2e 69 50 4b 65 79 20 3d 20 70 54 61 62  ate.iPKey = pTab
23c60 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e  ->iPKey;..  db->
23c70 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70 72  pPreUpdate = &pr
23c80 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78  eupdate;.  db->x
23c90 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
23ca0 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  k(db->pPreUpdate
23cb0 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62  Arg, db, op, zDb
23cc0 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69  , zTbl, iKey1, i
23cd0 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72  Key2);.  db->pPr
23ce0 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73  eUpdate = 0;.  s
23cf0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23d00 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f   preupdate.aReco
23d10 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55  rd);.  vdbeFreeU
23d20 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75  npacked(db, preu
23d30 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
23d40 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
23d50 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
23d60 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29  te.pNewUnpacked)
23d70 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74  ;.  if( preupdat
23d80 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  e.aNew ){.    in
23d90 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23da0 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64  ; i<pCsr->nField
23db0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
23dc0 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
23dd0 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61  ase(&preupdate.a
23de0 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[i]);.    }. 
23df0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23e00 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
23e10 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  New);.  }.}.#end
23e20 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
23e30 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23e40 4f 4b 20 2a 2f 0a                                OK */.