/ Hex Artifact Content
Login

Artifact b9772e4134a17f5b42d32761f5119467815c2458:


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 3b 20 20 20 20 20 20 20  .  int n;       
deb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dec0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
ded0: 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 52 65  r */.  struct Re
dee0: 75 73 61 62 6c 65 53 70 61 63 65 20 78 3b 20 20  usableSpace x;  
def0: 20 20 20 20 20 20 2f 2a 20 52 65 75 73 61 62 6c        /* Reusabl
df00: 65 20 62 75 6c 6b 20 6d 65 6d 6f 72 79 20 2a 2f  e bulk memory */
df10: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d 30  ..  assert( p!=0
df20: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
df30: 3e 6e 4f 70 3e 30 20 29 3b 0a 20 20 61 73 73 65  >nOp>0 );.  asse
df40: 72 74 28 20 70 50 61 72 73 65 21 3d 30 20 29 3b  rt( pParse!=0 );
df50: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6d 61  .  assert( p->ma
df60: 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
df70: 49 4e 49 54 20 29 3b 0a 20 20 61 73 73 65 72 74  INIT );.  assert
df80: 28 20 70 50 61 72 73 65 3d 3d 70 2d 3e 70 50 61  ( pParse==p->pPa
df90: 72 73 65 20 29 3b 0a 20 20 64 62 20 3d 20 70 2d  rse );.  db = p-
dfa0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 64  >db;.  assert( d
dfb0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 3d  b->mallocFailed=
dfc0: 3d 30 20 29 3b 0a 20 20 6e 56 61 72 20 3d 20 70  =0 );.  nVar = p
dfd0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 6e  Parse->nVar;.  n
dfe0: 4d 65 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  Mem = pParse->nM
dff0: 65 6d 3b 0a 20 20 6e 43 75 72 73 6f 72 20 3d 20  em;.  nCursor = 
e000: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
e010: 6e 41 72 67 20 3d 20 70 50 61 72 73 65 2d 3e 6e  nArg = pParse->n
e020: 4d 61 78 41 72 67 3b 0a 20 20 0a 20 20 2f 2a 20  MaxArg;.  .  /* 
e030: 45 61 63 68 20 63 75 72 73 6f 72 20 75 73 65 73  Each cursor uses
e040: 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 20   a memory cell. 
e050: 20 54 68 65 20 66 69 72 73 74 20 63 75 72 73 6f   The first curso
e060: 72 20 28 63 75 72 73 6f 72 20 30 29 20 63 61 6e  r (cursor 0) can
e070: 0a 20 20 2a 2a 20 75 73 65 20 61 4d 65 6d 5b 30  .  ** use aMem[0
e080: 5d 20 77 68 69 63 68 20 69 73 20 6e 6f 74 20 6f  ] which is not o
e090: 74 68 65 72 77 69 73 65 20 75 73 65 64 20 62 79  therwise used by
e0a0: 20 74 68 65 20 56 44 42 45 20 70 72 6f 67 72 61   the VDBE progra
e0b0: 6d 2e 20 20 41 6c 6c 6f 63 61 74 65 0a 20 20 2a  m.  Allocate.  *
e0c0: 2a 20 73 70 61 63 65 20 61 74 20 74 68 65 20 65  * space at the e
e0d0: 6e 64 20 6f 66 20 61 4d 65 6d 5b 5d 20 66 6f 72  nd of aMem[] for
e0e0: 20 63 75 72 73 6f 72 73 20 31 20 61 6e 64 20 67   cursors 1 and g
e0f0: 72 65 61 74 65 72 2e 0a 20 20 2a 2a 20 53 65 65  reater..  ** See
e100: 20 61 6c 73 6f 3a 20 61 6c 6c 6f 63 61 74 65 43   also: allocateC
e110: 75 72 73 6f 72 28 29 2e 0a 20 20 2a 2f 0a 20 20  ursor()..  */.  
e120: 6e 4d 65 6d 20 2b 3d 20 6e 43 75 72 73 6f 72 3b  nMem += nCursor;
e130: 0a 20 20 69 66 28 20 6e 43 75 72 73 6f 72 3d 3d  .  if( nCursor==
e140: 30 20 26 26 20 6e 4d 65 6d 3e 30 20 29 20 6e 4d  0 && nMem>0 ) nM
e150: 65 6d 2b 2b 3b 20 20 2f 2a 20 53 70 61 63 65 20  em++;  /* Space 
e160: 66 6f 72 20 61 4d 65 6d 5b 30 5d 20 65 76 65 6e  for aMem[0] even
e170: 20 69 66 20 6e 6f 74 20 75 73 65 64 20 2a 2f 0a   if not used */.
e180: 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
e190: 20 68 6f 77 20 6d 75 63 68 20 72 65 75 73 61 62   how much reusab
e1a0: 6c 65 20 6d 65 6d 6f 72 79 20 69 73 20 61 76 61  le memory is ava
e1b0: 69 6c 61 62 6c 65 20 61 74 20 74 68 65 20 65 6e  ilable at the en
e1c0: 64 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6f 70  d of the.  ** op
e1d0: 63 6f 64 65 20 61 72 72 61 79 2e 20 20 54 68 69  code array.  Thi
e1e0: 73 20 65 78 74 72 61 20 6d 65 6d 6f 72 79 20 77  s extra memory w
e1f0: 69 6c 6c 20 62 65 20 72 65 61 6c 6c 6f 63 61 74  ill be reallocat
e200: 65 64 20 66 6f 72 20 6f 74 68 65 72 20 65 6c 65  ed for other ele
e210: 6d 65 6e 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68  ments.  ** of th
e220: 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  e prepared state
e230: 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 20 3d  ment..  */.  n =
e240: 20 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4f   ROUND8(sizeof(O
e250: 70 29 2a 70 2d 3e 6e 4f 70 29 3b 20 20 20 20 20  p)*p->nOp);     
e260: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
e270: 73 20 6f 66 20 6f 70 63 6f 64 65 20 6d 65 6d 6f  s of opcode memo
e280: 72 79 20 75 73 65 64 20 2a 2f 0a 20 20 78 2e 70  ry used */.  x.p
e290: 53 70 61 63 65 20 3d 20 26 28 28 75 38 2a 29 70  Space = &((u8*)p
e2a0: 2d 3e 61 4f 70 29 5b 6e 5d 3b 20 20 20 20 20 20  ->aOp)[n];      
e2b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 75 73           /* Unus
e2c0: 65 64 20 6f 70 63 6f 64 65 20 6d 65 6d 6f 72 79  ed opcode memory
e2d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 45 49   */.  assert( EI
e2e0: 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d 45  GHT_BYTE_ALIGNME
e2f0: 4e 54 28 78 2e 70 53 70 61 63 65 29 20 29 3b 0a  NT(x.pSpace) );.
e300: 20 20 78 2e 6e 46 72 65 65 20 3d 20 52 4f 55 4e    x.nFree = ROUN
e310: 44 44 4f 57 4e 38 28 70 50 61 72 73 65 2d 3e 73  DDOWN8(pParse->s
e320: 7a 4f 70 41 6c 6c 6f 63 20 2d 20 6e 29 3b 20 20  zOpAlloc - n);  
e330: 2f 2a 20 42 79 74 65 73 20 6f 66 20 75 6e 75 73  /* Bytes of unus
e340: 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 61  ed memory */.  a
e350: 73 73 65 72 74 28 20 78 2e 6e 46 72 65 65 3e 3d  ssert( x.nFree>=
e360: 30 20 29 3b 0a 20 20 69 66 28 20 78 2e 6e 46 72  0 );.  if( x.nFr
e370: 65 65 3e 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73  ee>0 ){.    mems
e380: 65 74 28 78 2e 70 53 70 61 63 65 2c 20 30 2c 20  et(x.pSpace, 0, 
e390: 78 2e 6e 46 72 65 65 29 3b 0a 20 20 20 20 61 73  x.nFree);.    as
e3a0: 73 65 72 74 28 20 45 49 47 48 54 5f 42 59 54 45  sert( EIGHT_BYTE
e3b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 26 78 2e 70 53  _ALIGNMENT(&x.pS
e3c0: 70 61 63 65 5b 78 2e 6e 46 72 65 65 5d 29 20 29  pace[x.nFree]) )
e3d0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 6f 6c 76 65  ;.  }..  resolve
e3e0: 50 32 56 61 6c 75 65 73 28 70 2c 20 26 6e 41 72  P2Values(p, &nAr
e3f0: 67 29 3b 0a 20 20 70 2d 3e 75 73 65 73 53 74 6d  g);.  p->usesStm
e400: 74 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 28  tJournal = (u8)(
e410: 70 50 61 72 73 65 2d 3e 69 73 4d 75 6c 74 69 57  pParse->isMultiW
e420: 72 69 74 65 20 26 26 20 70 50 61 72 73 65 2d 3e  rite && pParse->
e430: 6d 61 79 41 62 6f 72 74 29 3b 0a 20 20 69 66 28  mayAbort);.  if(
e440: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
e450: 20 26 26 20 6e 4d 65 6d 3c 31 30 20 29 7b 0a 20   && nMem<10 ){. 
e460: 20 20 20 6e 4d 65 6d 20 3d 20 31 30 3b 0a 20 20     nMem = 10;.  
e470: 7d 0a 20 20 70 2d 3e 65 78 70 69 72 65 64 20 3d  }.  p->expired =
e480: 20 30 3b 0a 0a 20 20 2f 2a 20 4d 65 6d 6f 72 79   0;..  /* Memory
e490: 20 66 6f 72 20 72 65 67 69 73 74 65 72 73 2c 20   for registers, 
e4a0: 70 61 72 61 6d 65 74 65 72 73 2c 20 63 75 72 73  parameters, curs
e4b0: 6f 72 2c 20 65 74 63 2c 20 69 73 20 61 6c 6c 6f  or, etc, is allo
e4c0: 63 61 74 65 64 20 69 6e 20 6f 6e 65 20 6f 72 20  cated in one or 
e4d0: 74 77 6f 0a 20 20 2a 2a 20 70 61 73 73 65 73 2e  two.  ** passes.
e4e0: 20 20 4f 6e 20 74 68 65 20 66 69 72 73 74 20 70    On the first p
e4f0: 61 73 73 2c 20 77 65 20 74 72 79 20 74 6f 20 72  ass, we try to r
e500: 65 75 73 65 20 75 6e 75 73 65 64 20 6d 65 6d 6f  euse unused memo
e510: 72 79 20 61 74 20 74 68 65 20 0a 20 20 2a 2a 20  ry at the .  ** 
e520: 65 6e 64 20 6f 66 20 74 68 65 20 6f 70 63 6f 64  end of the opcod
e530: 65 20 61 72 72 61 79 2e 20 20 49 66 20 77 65 20  e array.  If we 
e540: 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 73 61  are unable to sa
e550: 74 69 73 66 79 20 61 6c 6c 20 6d 65 6d 6f 72 79  tisfy all memory
e560: 0a 20 20 2a 2a 20 72 65 71 75 69 72 65 6d 65 6e  .  ** requiremen
e570: 74 73 20 62 79 20 72 65 75 73 69 6e 67 20 74 68  ts by reusing th
e580: 65 20 6f 70 63 6f 64 65 20 61 72 72 61 79 20 74  e opcode array t
e590: 61 69 6c 2c 20 74 68 65 6e 20 74 68 65 20 73 65  ail, then the se
e5a0: 63 6f 6e 64 0a 20 20 2a 2a 20 70 61 73 73 20 77  cond.  ** pass w
e5b0: 69 6c 6c 20 66 69 6c 6c 20 69 6e 20 74 68 65 20  ill fill in the 
e5c0: 72 65 6d 61 69 6e 64 65 72 20 75 73 69 6e 67 20  remainder using 
e5d0: 61 20 66 72 65 73 68 20 6d 65 6d 6f 72 79 20 61  a fresh memory a
e5e0: 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20 0a 20 20 2a  llocation.  .  *
e5f0: 2a 0a 20 20 2a 2a 20 54 68 69 73 20 74 77 6f 2d  *.  ** This two-
e600: 70 61 73 73 20 61 70 70 72 6f 61 63 68 20 74 68  pass approach th
e610: 61 74 20 72 65 75 73 65 73 20 61 73 20 6d 75 63  at reuses as muc
e620: 68 20 6d 65 6d 6f 72 79 20 61 73 20 70 6f 73 73  h memory as poss
e630: 69 62 6c 65 20 66 72 6f 6d 0a 20 20 2a 2a 20 74  ible from.  ** t
e640: 68 65 20 6c 65 66 74 6f 76 65 72 20 6d 65 6d 6f  he leftover memo
e650: 72 79 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ry at the end of
e660: 20 74 68 65 20 6f 70 63 6f 64 65 20 61 72 72 61   the opcode arra
e670: 79 2e 20 20 54 68 69 73 20 63 61 6e 20 73 69 67  y.  This can sig
e680: 6e 69 66 69 63 61 6e 74 6c 79 0a 20 20 2a 2a 20  nificantly.  ** 
e690: 72 65 64 75 63 65 20 74 68 65 20 61 6d 6f 75 6e  reduce the amoun
e6a0: 74 20 6f 66 20 6d 65 6d 6f 72 79 20 68 65 6c 64  t of memory held
e6b0: 20 62 79 20 61 20 70 72 65 70 61 72 65 64 20 73   by a prepared s
e6c0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20  tatement..  */. 
e6d0: 20 64 6f 20 7b 0a 20 20 20 20 78 2e 6e 4e 65 65   do {.    x.nNee
e6e0: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ded = 0;.    p->
e6f0: 61 4d 65 6d 20 3d 20 61 6c 6c 6f 63 53 70 61 63  aMem = allocSpac
e700: 65 28 26 78 2c 20 70 2d 3e 61 4d 65 6d 2c 20 6e  e(&x, p->aMem, n
e710: 4d 65 6d 2a 73 69 7a 65 6f 66 28 4d 65 6d 29 29  Mem*sizeof(Mem))
e720: 3b 0a 20 20 20 20 70 2d 3e 61 56 61 72 20 3d 20  ;.    p->aVar = 
e730: 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c 20 70  allocSpace(&x, p
e740: 2d 3e 61 56 61 72 2c 20 6e 56 61 72 2a 73 69 7a  ->aVar, nVar*siz
e750: 65 6f 66 28 4d 65 6d 29 29 3b 0a 20 20 20 20 70  eof(Mem));.    p
e760: 2d 3e 61 70 41 72 67 20 3d 20 61 6c 6c 6f 63 53  ->apArg = allocS
e770: 70 61 63 65 28 26 78 2c 20 70 2d 3e 61 70 41 72  pace(&x, p->apAr
e780: 67 2c 20 6e 41 72 67 2a 73 69 7a 65 6f 66 28 4d  g, nArg*sizeof(M
e790: 65 6d 2a 29 29 3b 0a 20 20 20 20 70 2d 3e 61 70  em*));.    p->ap
e7a0: 43 73 72 20 3d 20 61 6c 6c 6f 63 53 70 61 63 65  Csr = allocSpace
e7b0: 28 26 78 2c 20 70 2d 3e 61 70 43 73 72 2c 20 6e  (&x, p->apCsr, n
e7c0: 43 75 72 73 6f 72 2a 73 69 7a 65 6f 66 28 56 64  Cursor*sizeof(Vd
e7d0: 62 65 43 75 72 73 6f 72 2a 29 29 3b 0a 23 69 66  beCursor*));.#if
e7e0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
e7f0: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
e800: 53 0a 20 20 20 20 70 2d 3e 61 6e 45 78 65 63 20  S.    p->anExec 
e810: 3d 20 61 6c 6c 6f 63 53 70 61 63 65 28 26 78 2c  = allocSpace(&x,
e820: 20 70 2d 3e 61 6e 45 78 65 63 2c 20 70 2d 3e 6e   p->anExec, p->n
e830: 4f 70 2a 73 69 7a 65 6f 66 28 69 36 34 29 29 3b  Op*sizeof(i64));
e840: 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
e850: 78 2e 6e 4e 65 65 64 65 64 3d 3d 30 20 29 20 62  x.nNeeded==0 ) b
e860: 72 65 61 6b 3b 0a 20 20 20 20 78 2e 70 53 70 61  reak;.    x.pSpa
e870: 63 65 20 3d 20 70 2d 3e 70 46 72 65 65 20 3d 20  ce = p->pFree = 
e880: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
e890: 65 72 6f 28 64 62 2c 20 78 2e 6e 4e 65 65 64 65  ero(db, x.nNeede
e8a0: 64 29 3b 0a 20 20 20 20 78 2e 6e 46 72 65 65 20  d);.    x.nFree 
e8b0: 3d 20 78 2e 6e 4e 65 65 64 65 64 3b 0a 20 20 7d  = x.nNeeded;.  }
e8c0: 77 68 69 6c 65 28 20 21 64 62 2d 3e 6d 61 6c 6c  while( !db->mall
e8d0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 0a 20 20 70  ocFailed );..  p
e8e0: 2d 3e 6e 43 75 72 73 6f 72 20 3d 20 6e 43 75 72  ->nCursor = nCur
e8f0: 73 6f 72 3b 0a 20 20 69 66 28 20 70 2d 3e 61 56  sor;.  if( p->aV
e900: 61 72 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 56 61  ar ){.    p->nVa
e910: 72 20 3d 20 28 79 6e 56 61 72 29 6e 56 61 72 3b  r = (ynVar)nVar;
e920: 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 6e 3c  .    for(n=0; n<
e930: 6e 56 61 72 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20  nVar; n++){.    
e940: 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e 66 6c 61    p->aVar[n].fla
e950: 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20  gs = MEM_Null;. 
e960: 20 20 20 20 20 70 2d 3e 61 56 61 72 5b 6e 5d 2e       p->aVar[n].
e970: 64 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20  db = db;.    }. 
e980: 20 7d 0a 20 20 70 2d 3e 6e 7a 56 61 72 20 3d 20   }.  p->nzVar = 
e990: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 3b 0a 20  pParse->nzVar;. 
e9a0: 20 70 2d 3e 61 7a 56 61 72 20 3d 20 70 50 61 72   p->azVar = pPar
e9b0: 73 65 2d 3e 61 7a 56 61 72 3b 0a 20 20 70 50 61  se->azVar;.  pPa
e9c0: 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20 20 30 3b  rse->nzVar =  0;
e9d0: 0a 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72  .  pParse->azVar
e9e0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 61   = 0;.  if( p->a
e9f0: 4d 65 6d 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4d  Mem ){.    p->nM
ea00: 65 6d 20 3d 20 6e 4d 65 6d 3b 0a 20 20 20 20 66  em = nMem;.    f
ea10: 6f 72 28 6e 3d 30 3b 20 6e 3c 6e 4d 65 6d 3b 20  or(n=0; n<nMem; 
ea20: 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 70 2d 3e 61  n++){.      p->a
ea30: 4d 65 6d 5b 6e 5d 2e 66 6c 61 67 73 20 3d 20 4d  Mem[n].flags = M
ea40: 45 4d 5f 55 6e 64 65 66 69 6e 65 64 3b 0a 20 20  EM_Undefined;.  
ea50: 20 20 20 20 70 2d 3e 61 4d 65 6d 5b 6e 5d 2e 64      p->aMem[n].d
ea60: 62 20 3d 20 64 62 3b 0a 20 20 20 20 7d 0a 20 20  b = db;.    }.  
ea70: 7d 0a 20 20 70 2d 3e 65 78 70 6c 61 69 6e 20 3d  }.  p->explain =
ea80: 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e   pParse->explain
ea90: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 52  ;.  sqlite3VdbeR
eaa0: 65 77 69 6e 64 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a  ewind(p);.}../*.
eab0: 2a 2a 20 43 6c 6f 73 65 20 61 20 56 44 42 45 20  ** Close a VDBE 
eac0: 63 75 72 73 6f 72 20 61 6e 64 20 72 65 6c 65 61  cursor and relea
ead0: 73 65 20 61 6c 6c 20 74 68 65 20 72 65 73 6f 75  se all the resou
eae0: 72 63 65 73 20 74 68 61 74 20 63 75 72 73 6f 72  rces that cursor
eaf0: 20 0a 2a 2a 20 68 61 70 70 65 6e 73 20 74 6f 20   .** happens to 
eb00: 68 6f 6c 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  hold..*/.void sq
eb10: 6c 69 74 65 33 56 64 62 65 46 72 65 65 43 75 72  lite3VdbeFreeCur
eb20: 73 6f 72 28 56 64 62 65 20 2a 70 2c 20 56 64 62  sor(Vdbe *p, Vdb
eb30: 65 43 75 72 73 6f 72 20 2a 70 43 78 29 7b 0a 20  eCursor *pCx){. 
eb40: 20 69 66 28 20 70 43 78 3d 3d 30 20 29 7b 0a 20   if( pCx==0 ){. 
eb50: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
eb60: 20 61 73 73 65 72 74 28 20 70 43 78 2d 3e 70 42   assert( pCx->pB
eb70: 74 3d 3d 30 20 7c 7c 20 70 43 78 2d 3e 65 43 75  t==0 || pCx->eCu
eb80: 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42  rType==CURTYPE_B
eb90: 54 52 45 45 20 29 3b 0a 20 20 73 77 69 74 63 68  TREE );.  switch
eba0: 28 20 70 43 78 2d 3e 65 43 75 72 54 79 70 65 20  ( pCx->eCurType 
ebb0: 29 7b 0a 20 20 20 20 63 61 73 65 20 43 55 52 54  ){.    case CURT
ebc0: 59 50 45 5f 53 4f 52 54 45 52 3a 20 7b 0a 20 20  YPE_SORTER: {.  
ebd0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 53      sqlite3VdbeS
ebe0: 6f 72 74 65 72 43 6c 6f 73 65 28 70 2d 3e 64 62  orterClose(p->db
ebf0: 2c 20 70 43 78 29 3b 0a 20 20 20 20 20 20 62 72  , pCx);.      br
ec00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ec10: 61 73 65 20 43 55 52 54 59 50 45 5f 42 54 52 45  ase CURTYPE_BTRE
ec20: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  E: {.      if( p
ec30: 43 78 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20  Cx->pBt ){.     
ec40: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ec50: 6c 6f 73 65 28 70 43 78 2d 3e 70 42 74 29 3b 0a  lose(pCx->pBt);.
ec60: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
ec70: 43 78 2d 3e 70 43 75 72 73 6f 72 20 77 69 6c 6c  Cx->pCursor will
ec80: 20 62 65 20 63 6c 6f 73 65 20 61 75 74 6f 6d 61   be close automa
ec90: 74 69 63 61 6c 6c 79 2c 20 69 66 20 69 74 20 65  tically, if it e
eca0: 78 69 73 74 73 2c 20 62 79 0a 20 20 20 20 20 20  xists, by.      
ecb0: 20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 61 62    ** the call ab
ecc0: 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 7d 65  ove. */.      }e
ecd0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73  lse{.        ass
ece0: 65 72 74 28 20 70 43 78 2d 3e 75 63 2e 70 43 75  ert( pCx->uc.pCu
ecf0: 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 20 20 20  rsor!=0 );.     
ed00: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
ed10: 6c 6f 73 65 43 75 72 73 6f 72 28 70 43 78 2d 3e  loseCursor(pCx->
ed20: 75 63 2e 70 43 75 72 73 6f 72 29 3b 0a 20 20 20  uc.pCursor);.   
ed30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ed40: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
ed50: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
ed60: 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 63 61 73  UALTABLE.    cas
ed70: 65 20 43 55 52 54 59 50 45 5f 56 54 41 42 3a 20  e CURTYPE_VTAB: 
ed80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
ed90: 76 74 61 62 5f 63 75 72 73 6f 72 20 2a 70 56 43  vtab_cursor *pVC
eda0: 75 72 20 3d 20 70 43 78 2d 3e 75 63 2e 70 56 43  ur = pCx->uc.pVC
edb0: 75 72 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ur;.      const 
edc0: 73 71 6c 69 74 65 33 5f 6d 6f 64 75 6c 65 20 2a  sqlite3_module *
edd0: 70 4d 6f 64 75 6c 65 20 3d 20 70 56 43 75 72 2d  pModule = pVCur-
ede0: 3e 70 56 74 61 62 2d 3e 70 4d 6f 64 75 6c 65 3b  >pVtab->pModule;
edf0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ee00: 56 43 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65  VCur->pVtab->nRe
ee10: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 70 56 43  f>0 );.      pVC
ee20: 75 72 2d 3e 70 56 74 61 62 2d 3e 6e 52 65 66 2d  ur->pVtab->nRef-
ee30: 2d 3b 0a 20 20 20 20 20 20 70 4d 6f 64 75 6c 65  -;.      pModule
ee40: 2d 3e 78 43 6c 6f 73 65 28 70 56 43 75 72 29 3b  ->xClose(pVCur);
ee50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ee60: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d    }.#endif.  }.}
ee70: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
ee80: 6c 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  l cursors in the
ee90: 20 63 75 72 72 65 6e 74 20 66 72 61 6d 65 2e 0a   current frame..
eea0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
eeb0: 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e 46 72 61  loseCursorsInFra
eec0: 6d 65 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69  me(Vdbe *p){.  i
eed0: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 7b 0a 20  f( p->apCsr ){. 
eee0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
eef0: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
ef00: 73 6f 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  sor; i++){.     
ef10: 20 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 20   VdbeCursor *pC 
ef20: 3d 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3b 0a 20  = p->apCsr[i];. 
ef30: 20 20 20 20 20 69 66 28 20 70 43 20 29 7b 0a 20       if( pC ){. 
ef40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ef50: 62 65 46 72 65 65 43 75 72 73 6f 72 28 70 2c 20  beFreeCursor(p, 
ef60: 70 43 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  pC);.        p->
ef70: 61 70 43 73 72 5b 69 5d 20 3d 20 30 3b 0a 20 20  apCsr[i] = 0;.  
ef80: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
ef90: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  }../*.** Copy th
efa0: 65 20 76 61 6c 75 65 73 20 73 74 6f 72 65 64 20  e values stored 
efb0: 69 6e 20 74 68 65 20 56 64 62 65 46 72 61 6d 65  in the VdbeFrame
efc0: 20 73 74 72 75 63 74 75 72 65 20 74 6f 20 69 74   structure to it
efd0: 73 20 56 64 62 65 2e 20 54 68 69 73 0a 2a 2a 20  s Vdbe. This.** 
efe0: 69 73 20 75 73 65 64 2c 20 66 6f 72 20 65 78 61  is used, for exa
eff0: 6d 70 6c 65 2c 20 77 68 65 6e 20 61 20 74 72 69  mple, when a tri
f000: 67 67 65 72 20 73 75 62 2d 70 72 6f 67 72 61 6d  gger sub-program
f010: 20 69 73 20 68 61 6c 74 65 64 20 74 6f 20 72 65   is halted to re
f020: 73 74 6f 72 65 0a 2a 2a 20 63 6f 6e 74 72 6f 6c  store.** control
f030: 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 70 72 6f   to the main pro
f040: 67 72 61 6d 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  gram..*/.int sql
f050: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
f060: 74 6f 72 65 28 56 64 62 65 46 72 61 6d 65 20 2a  tore(VdbeFrame *
f070: 70 46 72 61 6d 65 29 7b 0a 20 20 56 64 62 65 20  pFrame){.  Vdbe 
f080: 2a 76 20 3d 20 70 46 72 61 6d 65 2d 3e 76 3b 0a  *v = pFrame->v;.
f090: 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73 49 6e    closeCursorsIn
f0a0: 46 72 61 6d 65 28 76 29 3b 0a 23 69 66 64 65 66  Frame(v);.#ifdef
f0b0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
f0c0: 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
f0d0: 20 76 2d 3e 61 6e 45 78 65 63 20 3d 20 70 46 72   v->anExec = pFr
f0e0: 61 6d 65 2d 3e 61 6e 45 78 65 63 3b 0a 23 65 6e  ame->anExec;.#en
f0f0: 64 69 66 0a 20 20 76 2d 3e 61 4f 70 20 3d 20 70  dif.  v->aOp = p
f100: 46 72 61 6d 65 2d 3e 61 4f 70 3b 0a 20 20 76 2d  Frame->aOp;.  v-
f110: 3e 6e 4f 70 20 3d 20 70 46 72 61 6d 65 2d 3e 6e  >nOp = pFrame->n
f120: 4f 70 3b 0a 20 20 76 2d 3e 61 4d 65 6d 20 3d 20  Op;.  v->aMem = 
f130: 70 46 72 61 6d 65 2d 3e 61 4d 65 6d 3b 0a 20 20  pFrame->aMem;.  
f140: 76 2d 3e 6e 4d 65 6d 20 3d 20 70 46 72 61 6d 65  v->nMem = pFrame
f150: 2d 3e 6e 4d 65 6d 3b 0a 20 20 76 2d 3e 61 70 43  ->nMem;.  v->apC
f160: 73 72 20 3d 20 70 46 72 61 6d 65 2d 3e 61 70 43  sr = pFrame->apC
f170: 73 72 3b 0a 20 20 76 2d 3e 6e 43 75 72 73 6f 72  sr;.  v->nCursor
f180: 20 3d 20 70 46 72 61 6d 65 2d 3e 6e 43 75 72 73   = pFrame->nCurs
f190: 6f 72 3b 0a 20 20 76 2d 3e 64 62 2d 3e 6c 61 73  or;.  v->db->las
f1a0: 74 52 6f 77 69 64 20 3d 20 70 46 72 61 6d 65 2d  tRowid = pFrame-
f1b0: 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 20 20 76 2d  >lastRowid;.  v-
f1c0: 3e 6e 43 68 61 6e 67 65 20 3d 20 70 46 72 61 6d  >nChange = pFram
f1d0: 65 2d 3e 6e 43 68 61 6e 67 65 3b 0a 20 20 76 2d  e->nChange;.  v-
f1e0: 3e 64 62 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 70  >db->nChange = p
f1f0: 46 72 61 6d 65 2d 3e 6e 44 62 43 68 61 6e 67 65  Frame->nDbChange
f200: 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ;.  sqlite3VdbeD
f210: 65 6c 65 74 65 41 75 78 44 61 74 61 28 76 2d 3e  eleteAuxData(v->
f220: 64 62 2c 20 26 76 2d 3e 70 41 75 78 44 61 74 61  db, &v->pAuxData
f230: 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 76 2d 3e 70  , -1, 0);.  v->p
f240: 41 75 78 44 61 74 61 20 3d 20 70 46 72 61 6d 65  AuxData = pFrame
f250: 2d 3e 70 41 75 78 44 61 74 61 3b 0a 20 20 70 46  ->pAuxData;.  pF
f260: 72 61 6d 65 2d 3e 70 41 75 78 44 61 74 61 20 3d  rame->pAuxData =
f270: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 72   0;.  return pFr
f280: 61 6d 65 2d 3e 70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  ame->pc;.}../*.*
f290: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73  * Close all curs
f2a0: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  ors..**.** Also 
f2b0: 72 65 6c 65 61 73 65 20 61 6e 79 20 64 79 6e 61  release any dyna
f2c0: 6d 69 63 20 6d 65 6d 6f 72 79 20 68 65 6c 64 20  mic memory held 
f2d0: 62 79 20 74 68 65 20 56 4d 20 69 6e 20 74 68 65  by the VM in the
f2e0: 20 56 64 62 65 2e 61 4d 65 6d 20 6d 65 6d 6f 72   Vdbe.aMem memor
f2f0: 79 20 0a 2a 2a 20 63 65 6c 6c 20 61 72 72 61 79  y .** cell array
f300: 2e 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73  . This is necess
f310: 61 72 79 20 61 73 20 74 68 65 20 6d 65 6d 6f 72  ary as the memor
f320: 79 20 63 65 6c 6c 20 61 72 72 61 79 20 6d 61 79  y cell array may
f330: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 70 6f 69 6e   contain.** poin
f340: 74 65 72 73 20 74 6f 20 56 64 62 65 46 72 61 6d  ters to VdbeFram
f350: 65 20 6f 62 6a 65 63 74 73 2c 20 77 68 69 63 68  e objects, which
f360: 20 6d 61 79 20 69 6e 20 74 75 72 6e 20 63 6f 6e   may in turn con
f370: 74 61 69 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f  tain pointers to
f380: 0a 2a 2a 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  .** open cursors
f390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
f3a0: 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
f3b0: 28 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 66 28  (Vdbe *p){.  if(
f3c0: 20 70 2d 3e 70 46 72 61 6d 65 20 29 7b 0a 20 20   p->pFrame ){.  
f3d0: 20 20 56 64 62 65 46 72 61 6d 65 20 2a 70 46 72    VdbeFrame *pFr
f3e0: 61 6d 65 3b 0a 20 20 20 20 66 6f 72 28 70 46 72  ame;.    for(pFr
f3f0: 61 6d 65 3d 70 2d 3e 70 46 72 61 6d 65 3b 20 70  ame=p->pFrame; p
f400: 46 72 61 6d 65 2d 3e 70 50 61 72 65 6e 74 3b 20  Frame->pParent; 
f410: 70 46 72 61 6d 65 3d 70 46 72 61 6d 65 2d 3e 70  pFrame=pFrame->p
f420: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 73 71 6c  Parent);.    sql
f430: 69 74 65 33 56 64 62 65 46 72 61 6d 65 52 65 73  ite3VdbeFrameRes
f440: 74 6f 72 65 28 70 46 72 61 6d 65 29 3b 0a 20 20  tore(pFrame);.  
f450: 20 20 70 2d 3e 70 46 72 61 6d 65 20 3d 20 30 3b    p->pFrame = 0;
f460: 0a 20 20 20 20 70 2d 3e 6e 46 72 61 6d 65 20 3d  .    p->nFrame =
f470: 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   0;.  }.  assert
f480: 28 20 70 2d 3e 6e 46 72 61 6d 65 3d 3d 30 20 29  ( p->nFrame==0 )
f490: 3b 0a 20 20 63 6c 6f 73 65 43 75 72 73 6f 72 73  ;.  closeCursors
f4a0: 49 6e 46 72 61 6d 65 28 70 29 3b 0a 20 20 69 66  InFrame(p);.  if
f4b0: 28 20 70 2d 3e 61 4d 65 6d 20 29 7b 0a 20 20 20  ( p->aMem ){.   
f4c0: 20 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79   releaseMemArray
f4d0: 28 70 2d 3e 61 4d 65 6d 2c 20 70 2d 3e 6e 4d 65  (p->aMem, p->nMe
f4e0: 6d 29 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  m);.  }.  while(
f4f0: 20 70 2d 3e 70 44 65 6c 46 72 61 6d 65 20 29 7b   p->pDelFrame ){
f500: 0a 20 20 20 20 56 64 62 65 46 72 61 6d 65 20 2a  .    VdbeFrame *
f510: 70 44 65 6c 20 3d 20 70 2d 3e 70 44 65 6c 46 72  pDel = p->pDelFr
f520: 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 70 44 65 6c  ame;.    p->pDel
f530: 46 72 61 6d 65 20 3d 20 70 44 65 6c 2d 3e 70 50  Frame = pDel->pP
f540: 61 72 65 6e 74 3b 0a 20 20 20 20 73 71 6c 69 74  arent;.    sqlit
f550: 65 33 56 64 62 65 46 72 61 6d 65 44 65 6c 65 74  e3VdbeFrameDelet
f560: 65 28 70 44 65 6c 29 3b 0a 20 20 7d 0a 0a 20 20  e(pDel);.  }..  
f570: 2f 2a 20 44 65 6c 65 74 65 20 61 6e 79 20 61 75  /* Delete any au
f580: 78 64 61 74 61 20 61 6c 6c 6f 63 61 74 69 6f 6e  xdata allocation
f590: 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 56 4d  s made by the VM
f5a0: 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 41 75   */.  if( p->pAu
f5b0: 78 44 61 74 61 20 29 20 73 71 6c 69 74 65 33 56  xData ) sqlite3V
f5c0: 64 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61  dbeDeleteAuxData
f5d0: 28 70 2d 3e 64 62 2c 20 26 70 2d 3e 70 41 75 78  (p->db, &p->pAux
f5e0: 44 61 74 61 2c 20 2d 31 2c 20 30 29 3b 0a 20 20  Data, -1, 0);.  
f5f0: 61 73 73 65 72 74 28 20 70 2d 3e 70 41 75 78 44  assert( p->pAuxD
f600: 61 74 61 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a  ata==0 );.}../*.
f610: 2a 2a 20 43 6c 65 61 6e 20 75 70 20 74 68 65 20  ** Clean up the 
f620: 56 4d 20 61 66 74 65 72 20 61 20 73 69 6e 67 6c  VM after a singl
f630: 65 20 72 75 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  e run..*/.static
f640: 20 76 6f 69 64 20 43 6c 65 61 6e 75 70 28 56 64   void Cleanup(Vd
f650: 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  be *p){.  sqlite
f660: 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a  3 *db = p->db;..
f670: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
f680: 42 55 47 0a 20 20 2f 2a 20 45 78 65 63 75 74 65  BUG.  /* Execute
f690: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
f6a0: 65 6e 74 73 20 74 6f 20 65 6e 73 75 72 65 20 74  ents to ensure t
f6b0: 68 61 74 20 74 68 65 20 56 64 62 65 2e 61 70 43  hat the Vdbe.apC
f6c0: 73 72 5b 5d 20 61 6e 64 20 0a 20 20 2a 2a 20 56  sr[] and .  ** V
f6d0: 64 62 65 2e 61 4d 65 6d 5b 5d 20 61 72 72 61 79  dbe.aMem[] array
f6e0: 73 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  s have already b
f6f0: 65 65 6e 20 63 6c 65 61 6e 65 64 20 75 70 2e 20  een cleaned up. 
f700: 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   */.  int i;.  i
f710: 66 28 20 70 2d 3e 61 70 43 73 72 20 29 20 66 6f  f( p->apCsr ) fo
f720: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 43 75 72  r(i=0; i<p->nCur
f730: 73 6f 72 3b 20 69 2b 2b 29 20 61 73 73 65 72 74  sor; i++) assert
f740: 28 20 70 2d 3e 61 70 43 73 72 5b 69 5d 3d 3d 30  ( p->apCsr[i]==0
f750: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 4d 65   );.  if( p->aMe
f760: 6d 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  m ){.    for(i=0
f770: 3b 20 69 3c 70 2d 3e 6e 4d 65 6d 3b 20 69 2b 2b  ; i<p->nMem; i++
f780: 29 20 61 73 73 65 72 74 28 20 70 2d 3e 61 4d 65  ) assert( p->aMe
f790: 6d 5b 69 5d 2e 66 6c 61 67 73 3d 3d 4d 45 4d 5f  m[i].flags==MEM_
f7a0: 55 6e 64 65 66 69 6e 65 64 20 29 3b 0a 20 20 7d  Undefined );.  }
f7b0: 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74  .#endif..  sqlit
f7c0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
f7d0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 70 2d 3e 7a  zErrMsg);.  p->z
f7e0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 2d  ErrMsg = 0;.  p-
f7f0: 3e 70 52 65 73 75 6c 74 53 65 74 20 3d 20 30 3b  >pResultSet = 0;
f800: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
f810: 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 75  e number of resu
f820: 6c 74 20 63 6f 6c 75 6d 6e 73 20 74 68 61 74 20  lt columns that 
f830: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
f840: 20 62 79 20 74 68 69 73 20 53 51 4c 0a 2a 2a 20   by this SQL.** 
f850: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
f860: 69 73 20 6e 6f 77 20 73 65 74 20 61 74 20 63 6f  is now set at co
f870: 6d 70 69 6c 65 20 74 69 6d 65 2c 20 72 61 74 68  mpile time, rath
f880: 65 72 20 74 68 61 6e 20 64 75 72 69 6e 67 0a 2a  er than during.*
f890: 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 74  * execution of t
f8a0: 68 65 20 76 64 62 65 20 70 72 6f 67 72 61 6d 20  he vdbe program 
f8b0: 73 6f 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f  so that sqlite3_
f8c0: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 29 20 63  column_count() c
f8d0: 61 6e 0a 2a 2a 20 62 65 20 63 61 6c 6c 65 64 20  an.** be called 
f8e0: 6f 6e 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  on an SQL statem
f8f0: 65 6e 74 20 62 65 66 6f 72 65 20 73 71 6c 69 74  ent before sqlit
f900: 65 33 5f 73 74 65 70 28 29 2e 0a 2a 2f 0a 76 6f  e3_step()..*/.vo
f910: 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  id sqlite3VdbeSe
f920: 74 4e 75 6d 43 6f 6c 73 28 56 64 62 65 20 2a 70  tNumCols(Vdbe *p
f930: 2c 20 69 6e 74 20 6e 52 65 73 43 6f 6c 75 6d 6e  , int nResColumn
f940: 29 7b 0a 20 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61  ){.  Mem *pColNa
f950: 6d 65 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  me;.  int n;.  s
f960: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 2d 3e  qlite3 *db = p->
f970: 64 62 3b 0a 0a 20 20 72 65 6c 65 61 73 65 4d 65  db;..  releaseMe
f980: 6d 41 72 72 61 79 28 70 2d 3e 61 43 6f 6c 4e 61  mArray(p->aColNa
f990: 6d 65 2c 20 70 2d 3e 6e 52 65 73 43 6f 6c 75 6d  me, p->nResColum
f9a0: 6e 2a 43 4f 4c 4e 41 4d 45 5f 4e 29 3b 0a 20 20  n*COLNAME_N);.  
f9b0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
f9c0: 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29 3b 0a  , p->aColName);.
f9d0: 20 20 6e 20 3d 20 6e 52 65 73 43 6f 6c 75 6d 6e    n = nResColumn
f9e0: 2a 43 4f 4c 4e 41 4d 45 5f 4e 3b 0a 20 20 70 2d  *COLNAME_N;.  p-
f9f0: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 3d 20 28 75  >nResColumn = (u
fa00: 31 36 29 6e 52 65 73 43 6f 6c 75 6d 6e 3b 0a 20  16)nResColumn;. 
fa10: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 20 3d 20 70   p->aColName = p
fa20: 43 6f 6c 4e 61 6d 65 20 3d 20 28 4d 65 6d 2a 29  ColName = (Mem*)
fa30: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a  sqlite3DbMallocZ
fa40: 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 4d  ero(db, sizeof(M
fa50: 65 6d 29 2a 6e 20 29 3b 0a 20 20 69 66 28 20 70  em)*n );.  if( p
fa60: 2d 3e 61 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 20  ->aColName==0 ) 
fa70: 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28  return;.  while(
fa80: 20 6e 2d 2d 20 3e 20 30 20 29 7b 0a 20 20 20 20   n-- > 0 ){.    
fa90: 70 43 6f 6c 4e 61 6d 65 2d 3e 66 6c 61 67 73 20  pColName->flags 
faa0: 3d 20 4d 45 4d 5f 4e 75 6c 6c 3b 0a 20 20 20 20  = MEM_Null;.    
fab0: 70 43 6f 6c 4e 61 6d 65 2d 3e 64 62 20 3d 20 70  pColName->db = p
fac0: 2d 3e 64 62 3b 0a 20 20 20 20 70 43 6f 6c 4e 61  ->db;.    pColNa
fad0: 6d 65 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  me++;.  }.}../*.
fae0: 2a 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65 20  ** Set the name 
faf0: 6f 66 20 74 68 65 20 69 64 78 27 74 68 20 63 6f  of the idx'th co
fb00: 6c 75 6d 6e 20 74 6f 20 62 65 20 72 65 74 75 72  lumn to be retur
fb10: 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 20 73  ned by the SQL s
fb20: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 7a 4e 61  tatement..** zNa
fb30: 6d 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  me must be a poi
fb40: 6e 74 65 72 20 74 6f 20 61 20 6e 75 6c 20 74 65  nter to a nul te
fb50: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
fb60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
fb70: 20 6d 75 73 74 20 62 65 20 6d 61 64 65 20 61 66   must be made af
fb80: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
fb90: 6c 69 74 65 33 56 64 62 65 53 65 74 4e 75 6d 43  lite3VdbeSetNumC
fba0: 6f 6c 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ols()..**.** The
fbb0: 20 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72   final parameter
fbc0: 2c 20 78 44 65 6c 2c 20 6d 75 73 74 20 62 65 20  , xDel, must be 
fbd0: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 44 59  one of SQLITE_DY
fbe0: 4e 41 4d 49 43 2c 20 53 51 4c 49 54 45 5f 53 54  NAMIC, SQLITE_ST
fbf0: 41 54 49 43 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  ATIC.** or SQLIT
fc00: 45 5f 54 52 41 4e 53 49 45 4e 54 2e 20 49 66 20  E_TRANSIENT. If 
fc10: 69 74 20 69 73 20 53 51 4c 49 54 45 5f 44 59 4e  it is SQLITE_DYN
fc20: 41 4d 49 43 2c 20 74 68 65 6e 20 74 68 65 20 62  AMIC, then the b
fc30: 75 66 66 65 72 20 70 6f 69 6e 74 65 64 0a 2a 2a  uffer pointed.**
fc40: 20 74 6f 20 62 79 20 7a 4e 61 6d 65 20 77 69 6c   to by zName wil
fc50: 6c 20 62 65 20 66 72 65 65 64 20 62 79 20 73 71  l be freed by sq
fc60: 6c 69 74 65 33 44 62 46 72 65 65 28 29 20 77 68  lite3DbFree() wh
fc70: 65 6e 20 74 68 65 20 76 64 62 65 20 69 73 20 64  en the vdbe is d
fc80: 65 73 74 72 6f 79 65 64 2e 0a 2a 2f 0a 69 6e 74  estroyed..*/.int
fc90: 20 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 43   sqlite3VdbeSetC
fca0: 6f 6c 4e 61 6d 65 28 0a 20 20 56 64 62 65 20 2a  olName(.  Vdbe *
fcb0: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
fcc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 64             /* Vd
fcd0: 62 65 20 62 65 69 6e 67 20 63 6f 6e 66 69 67 75  be being configu
fce0: 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  red */.  int idx
fcf0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
fd10: 65 78 20 6f 66 20 63 6f 6c 75 6d 6e 20 7a 4e 61  ex of column zNa
fd20: 6d 65 20 61 70 70 6c 69 65 73 20 74 6f 20 2a 2f  me applies to */
fd30: 0a 20 20 69 6e 74 20 76 61 72 2c 20 20 20 20 20  .  int var,     
fd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd50: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
fd60: 65 20 43 4f 4c 4e 41 4d 45 5f 2a 20 63 6f 6e 73  e COLNAME_* cons
fd70: 74 61 6e 74 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  tants */.  const
fd80: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
fd90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fda0: 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72  ointer to buffer
fdb0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6e 61 6d 65   containing name
fdc0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 44 65   */.  void (*xDe
fdd0: 6c 29 28 76 6f 69 64 2a 29 20 20 20 20 20 20 20  l)(void*)       
fde0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79         /* Memory
fdf0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 74 72 61   management stra
fe00: 74 65 67 79 20 66 6f 72 20 7a 4e 61 6d 65 20 2a  tegy for zName *
fe10: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
fe20: 20 4d 65 6d 20 2a 70 43 6f 6c 4e 61 6d 65 3b 0a   Mem *pColName;.
fe30: 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70 2d    assert( idx<p-
fe40: 3e 6e 52 65 73 43 6f 6c 75 6d 6e 20 29 3b 0a 20  >nResColumn );. 
fe50: 20 61 73 73 65 72 74 28 20 76 61 72 3c 43 4f 4c   assert( var<COL
fe60: 4e 41 4d 45 5f 4e 20 29 3b 0a 20 20 69 66 28 20  NAME_N );.  if( 
fe70: 70 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  p->db->mallocFai
fe80: 6c 65 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72  led ){.    asser
fe90: 74 28 20 21 7a 4e 61 6d 65 20 7c 7c 20 78 44 65  t( !zName || xDe
fea0: 6c 21 3d 53 51 4c 49 54 45 5f 44 59 4e 41 4d 49  l!=SQLITE_DYNAMI
feb0: 43 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C );.    return 
fec0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50  SQLITE_NOMEM_BKP
fed0: 54 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  T;.  }.  assert(
fee0: 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 21 3d 30 20   p->aColName!=0 
fef0: 29 3b 0a 20 20 70 43 6f 6c 4e 61 6d 65 20 3d 20  );.  pColName = 
ff00: 26 28 70 2d 3e 61 43 6f 6c 4e 61 6d 65 5b 69 64  &(p->aColName[id
ff10: 78 2b 76 61 72 2a 70 2d 3e 6e 52 65 73 43 6f 6c  x+var*p->nResCol
ff20: 75 6d 6e 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  umn]);.  rc = sq
ff30: 6c 69 74 65 33 56 64 62 65 4d 65 6d 53 65 74 53  lite3VdbeMemSetS
ff40: 74 72 28 70 43 6f 6c 4e 61 6d 65 2c 20 7a 4e 61  tr(pColName, zNa
ff50: 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
ff60: 54 46 38 2c 20 78 44 65 6c 29 3b 0a 20 20 61 73  TF8, xDel);.  as
ff70: 73 65 72 74 28 20 72 63 21 3d 30 20 7c 7c 20 21  sert( rc!=0 || !
ff80: 7a 4e 61 6d 65 20 7c 7c 20 28 70 43 6f 6c 4e 61  zName || (pColNa
ff90: 6d 65 2d 3e 66 6c 61 67 73 26 4d 45 4d 5f 54 65  me->flags&MEM_Te
ffa0: 72 6d 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  rm)!=0 );.  retu
ffb0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ffc0: 41 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20  A read or write 
ffd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
ffe0: 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 63  or may not be ac
fff0: 74 69 76 65 20 6f 6e 20 64 61 74 61 62 61 73 65  tive on database
10000 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 49   handle.** db. I
10010 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
10020 69 73 20 61 63 74 69 76 65 2c 20 63 6f 6d 6d 69  is active, commi
10030 74 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 69  t it. If there i
10040 73 20 61 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61  s a.** write-tra
10050 6e 73 61 63 74 69 6f 6e 20 73 70 61 6e 6e 69 6e  nsaction spannin
10060 67 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  g more than one 
10070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
10080 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 74  his routine.** t
10090 61 6b 65 73 20 63 61 72 65 20 6f 66 20 74 68 65  akes care of the
100a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
100b0 74 72 69 63 6b 65 72 79 2e 0a 2a 2f 0a 73 74 61  trickery..*/.sta
100c0 74 69 63 20 69 6e 74 20 76 64 62 65 43 6f 6d 6d  tic int vdbeComm
100d0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
100e0 56 64 62 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  Vdbe *p){.  int 
100f0 69 3b 0a 20 20 69 6e 74 20 6e 54 72 61 6e 73 20  i;.  int nTrans 
10100 3d 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20  = 0;  /* Number 
10110 6f 66 20 64 61 74 61 62 61 73 65 73 20 77 69 74  of databases wit
10120 68 20 61 6e 20 61 63 74 69 76 65 20 77 72 69 74  h an active writ
10130 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e-transaction.  
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10150 20 2a 2a 20 74 68 61 74 20 61 72 65 20 63 61 6e   ** that are can
10160 64 69 64 61 74 65 73 20 66 6f 72 20 61 20 74 77  didates for a tw
10170 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 20 75  o-phase commit u
10180 73 69 6e 67 20 61 0a 20 20 20 20 20 20 20 20 20  sing a.         
10190 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 73            ** mas
101a0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ter-journal */. 
101b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
101c0 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 65 65 64 58  _OK;.  int needX
101d0 63 6f 6d 6d 69 74 20 3d 20 30 3b 0a 0a 23 69 66  commit = 0;..#if
101e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
101f0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 2f  VIRTUALTABLE.  /
10200 2a 20 57 69 74 68 20 74 68 69 73 20 6f 70 74 69  * With this opti
10210 6f 6e 2c 20 73 71 6c 69 74 65 33 56 74 61 62 53  on, sqlite3VtabS
10220 79 6e 63 28 29 20 69 73 20 64 65 66 69 6e 65 64  ync() is defined
10230 20 74 6f 20 62 65 20 73 69 6d 70 6c 79 20 0a 20   to be simply . 
10240 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 73 6f   ** SQLITE_OK so
10250 20 70 20 69 73 20 6e 6f 74 20 75 73 65 64 2e 20   p is not used. 
10260 0a 20 20 2a 2f 0a 20 20 55 4e 55 53 45 44 5f 50  .  */.  UNUSED_P
10270 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 23 65 6e  ARAMETER(p);.#en
10280 64 69 66 0a 0a 20 20 2f 2a 20 42 65 66 6f 72 65  dif..  /* Before
10290 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20   doing anything 
102a0 65 6c 73 65 2c 20 63 61 6c 6c 20 74 68 65 20 78  else, call the x
102b0 53 79 6e 63 28 29 20 63 61 6c 6c 62 61 63 6b 20  Sync() callback 
102c0 66 6f 72 20 61 6e 79 0a 20 20 2a 2a 20 76 69 72  for any.  ** vir
102d0 74 75 61 6c 20 6d 6f 64 75 6c 65 20 74 61 62 6c  tual module tabl
102e0 65 73 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  es written in th
102f0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  is transaction. 
10300 54 68 69 73 20 68 61 73 20 74 6f 0a 20 20 2a 2a  This has to.  **
10310 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72 65 20   be done before 
10320 64 65 74 65 72 6d 69 6e 69 6e 67 20 77 68 65 74  determining whet
10330 68 65 72 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  her a master jou
10340 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 0a 20 20  rnal file is .  
10350 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 61 73 20  ** required, as 
10360 61 6e 20 78 53 79 6e 63 28 29 20 63 61 6c 6c 62  an xSync() callb
10370 61 63 6b 20 6d 61 79 20 61 64 64 20 61 6e 20 61  ack may add an a
10380 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
10390 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 74 72 61  .  ** to the tra
103a0 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
103b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
103c0 62 53 79 6e 63 28 64 62 2c 20 70 29 3b 0a 0a 20  bSync(db, p);.. 
103d0 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 64 65   /* This loop de
103e0 74 65 72 6d 69 6e 65 73 20 28 61 29 20 69 66 20  termines (a) if 
103f0 74 68 65 20 63 6f 6d 6d 69 74 20 68 6f 6f 6b 20  the commit hook 
10400 73 68 6f 75 6c 64 20 62 65 20 69 6e 76 6f 6b 65  should be invoke
10410 64 20 61 6e 64 0a 20 20 2a 2a 20 28 62 29 20 68  d and.  ** (b) h
10420 6f 77 20 6d 61 6e 79 20 64 61 74 61 62 61 73 65  ow many database
10430 20 66 69 6c 65 73 20 68 61 76 65 20 6f 70 65 6e   files have open
10440 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10450 6f 6e 73 2c 20 6e 6f 74 20 0a 20 20 2a 2a 20 69  ons, not .  ** i
10460 6e 63 6c 75 64 69 6e 67 20 74 68 65 20 74 65 6d  ncluding the tem
10470 70 20 64 61 74 61 62 61 73 65 2e 20 28 62 29 20  p database. (b) 
10480 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 62 65 63  is important bec
10490 61 75 73 65 20 69 66 20 6d 6f 72 65 20 74 68 61  ause if more tha
104a0 6e 20 0a 20 20 2a 2a 20 6f 6e 65 20 64 61 74 61  n .  ** one data
104b0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 61 6e  base file has an
104c0 20 6f 70 65 6e 20 77 72 69 74 65 20 74 72 61 6e   open write tran
104d0 73 61 63 74 69 6f 6e 2c 20 61 20 6d 61 73 74 65  saction, a maste
104e0 72 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  r journal.  ** f
104f0 69 6c 65 20 69 73 20 72 65 71 75 69 72 65 64 20  ile is required 
10500 66 6f 72 20 61 6e 20 61 74 6f 6d 69 63 20 63 6f  for an atomic co
10510 6d 6d 69 74 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f  mmit..  */ .  fo
10520 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10530 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10540 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20 42 74  b; i++){ .    Bt
10550 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
10560 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[i].pBt;.    i
10570 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
10580 73 49 6e 54 72 61 6e 73 28 70 42 74 29 20 29 7b  sInTrans(pBt) ){
10590 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
105a0 72 20 6f 72 20 6e 6f 74 20 61 20 64 61 74 61 62  r or not a datab
105b0 61 73 65 20 6d 69 67 68 74 20 6e 65 65 64 20 61  ase might need a
105c0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
105d0 64 65 70 65 6e 64 73 20 75 70 6f 6e 0a 20 20 20  depends upon.   
105e0 20 20 20 2a 2a 20 69 74 73 20 6a 6f 75 72 6e 61     ** its journa
105f0 6c 20 6d 6f 64 65 20 28 61 6d 6f 6e 67 20 6f 74  l mode (among ot
10600 68 65 72 20 74 68 69 6e 67 73 29 2e 20 20 54 68  her things).  Th
10610 69 73 20 6d 61 74 72 69 78 20 64 65 74 65 72 6d  is matrix determ
10620 69 6e 65 73 20 77 68 69 63 68 0a 20 20 20 20 20  ines which.     
10630 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65   ** journal mode
10640 73 20 75 73 65 20 61 20 6d 61 73 74 65 72 20 6a  s use a master j
10650 6f 75 72 6e 61 6c 20 61 6e 64 20 77 68 69 63 68  ournal and which
10660 20 64 6f 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20   do not */.     
10670 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
10680 20 61 4d 4a 4e 65 65 64 65 64 5b 5d 20 3d 20 7b   aMJNeeded[] = {
10690 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 45 4c 45  .        /* DELE
106a0 54 45 20 20 20 2a 2f 20 20 31 2c 0a 20 20 20 20  TE   */  1,.    
106b0 20 20 20 20 2f 2a 20 50 45 52 53 49 53 54 20 20      /* PERSIST  
106c0 20 2a 2f 20 31 2c 0a 20 20 20 20 20 20 20 20 2f   */ 1,.        /
106d0 2a 20 4f 46 46 20 20 20 20 20 20 20 2a 2f 20 30  * OFF       */ 0
106e0 2c 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55  ,.        /* TRU
106f0 4e 43 41 54 45 20 20 2a 2f 20 31 2c 0a 20 20 20  NCATE  */ 1,.   
10700 20 20 20 20 20 2f 2a 20 4d 45 4d 4f 52 59 20 20       /* MEMORY  
10710 20 20 2a 2f 20 30 2c 0a 20 20 20 20 20 20 20 20    */ 0,.        
10720 2f 2a 20 57 41 4c 20 20 20 20 20 20 20 2a 2f 20  /* WAL       */ 
10730 30 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  0.      };.     
10740 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 20   Pager *pPager; 
10750 20 20 2f 2a 20 50 61 67 65 72 20 61 73 73 6f 63    /* Pager assoc
10760 69 61 74 65 64 20 77 69 74 68 20 70 42 74 20 2a  iated with pBt *
10770 2f 0a 20 20 20 20 20 20 6e 65 65 64 58 63 6f 6d  /.      needXcom
10780 6d 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  mit = 1;.      s
10790 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
107a0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 70 50 61  (pBt);.      pPa
107b0 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72  ger = sqlite3Btr
107c0 65 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20  eePager(pBt);.  
107d0 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
107e0 69 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 21  i].safety_level!
107f0 3d 50 41 47 45 52 5f 53 59 4e 43 48 52 4f 4e 4f  =PAGER_SYNCHRONO
10800 55 53 5f 4f 46 46 0a 20 20 20 20 20 20 20 26 26  US_OFF.       &&
10810 20 61 4d 4a 4e 65 65 64 65 64 5b 73 71 6c 69 74   aMJNeeded[sqlit
10820 65 33 50 61 67 65 72 47 65 74 4a 6f 75 72 6e 61  e3PagerGetJourna
10830 6c 4d 6f 64 65 28 70 50 61 67 65 72 29 5d 0a 20  lMode(pPager)]. 
10840 20 20 20 20 20 29 7b 20 0a 20 20 20 20 20 20 20       ){ .       
10850 20 61 73 73 65 72 74 28 20 69 21 3d 31 20 29 3b   assert( i!=1 );
10860 0a 20 20 20 20 20 20 20 20 6e 54 72 61 6e 73 2b  .        nTrans+
10870 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
10880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
10890 65 72 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28  erExclusiveLock(
108a0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
108b0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
108c0 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pBt);.    }.  }
108d0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
108e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
108f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
10900 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
10910 79 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  y write-transact
10920 69 6f 6e 73 20 61 74 20 61 6c 6c 2c 20 69 6e 76  ions at all, inv
10930 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 69 74 20 68  oke the commit h
10940 6f 6f 6b 20 2a 2f 0a 20 20 69 66 28 20 6e 65 65  ook */.  if( nee
10950 64 58 63 6f 6d 6d 69 74 20 26 26 20 64 62 2d 3e  dXcommit && db->
10960 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
10970 29 7b 0a 20 20 20 20 72 63 20 3d 20 64 62 2d 3e  ){.    rc = db->
10980 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 28  xCommitCallback(
10990 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 29 3b  db->pCommitArg);
109a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
109b0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
109c0 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
109d0 4d 4d 49 54 48 4f 4f 4b 3b 0a 20 20 20 20 7d 0a  MMITHOOK;.    }.
109e0 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 73 69    }..  /* The si
109f0 6d 70 6c 65 20 63 61 73 65 20 2d 20 6e 6f 20 6d  mple case - no m
10a00 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 64 61 74  ore than one dat
10a10 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20  abase file (not 
10a20 63 6f 75 6e 74 69 6e 67 20 74 68 65 0a 20 20 2a  counting the.  *
10a30 2a 20 54 45 4d 50 20 64 61 74 61 62 61 73 65 29  * TEMP database)
10a40 20 68 61 73 20 61 20 74 72 61 6e 73 61 63 74 69   has a transacti
10a50 6f 6e 20 61 63 74 69 76 65 2e 20 20 20 54 68 65  on active.   The
10a60 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 66 6f  re is no need fo
10a70 72 20 74 68 65 0a 20 20 2a 2a 20 6d 61 73 74 65  r the.  ** maste
10a80 72 2d 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 0a  r-journal..  **.
10a90 20 20 2a 2a 20 49 66 20 74 68 65 20 72 65 74 75    ** If the retu
10aa0 72 6e 20 76 61 6c 75 65 20 6f 66 20 73 71 6c 69  rn value of sqli
10ab0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
10ac0 61 6d 65 28 29 20 69 73 20 61 20 7a 65 72 6f 20  ame() is a zero 
10ad0 6c 65 6e 67 74 68 0a 20 20 2a 2a 20 73 74 72 69  length.  ** stri
10ae0 6e 67 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  ng, it means the
10af0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69   main database i
10b00 73 20 3a 6d 65 6d 6f 72 79 3a 20 6f 72 20 61 20  s :memory: or a 
10b10 74 65 6d 70 20 66 69 6c 65 2e 20 20 49 6e 20 0a  temp file.  In .
10b20 20 20 2a 2a 20 74 68 61 74 20 63 61 73 65 20 77    ** that case w
10b30 65 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  e do not support
10b40 20 61 74 6f 6d 69 63 20 6d 75 6c 74 69 2d 66 69   atomic multi-fi
10b50 6c 65 20 63 6f 6d 6d 69 74 73 2c 20 73 6f 20 75  le commits, so u
10b60 73 65 20 74 68 65 20 0a 20 20 2a 2a 20 73 69 6d  se the .  ** sim
10b70 70 6c 65 20 63 61 73 65 20 74 68 65 6e 20 74 6f  ple case then to
10b80 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  o..  */.  if( 0=
10b90 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
10ba0 28 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74  (sqlite3BtreeGet
10bb0 46 69 6c 65 6e 61 6d 65 28 64 62 2d 3e 61 44 62  Filename(db->aDb
10bc0 5b 30 5d 2e 70 42 74 29 29 0a 20 20 20 7c 7c 20  [0].pBt)).   || 
10bd0 6e 54 72 61 6e 73 3c 3d 31 0a 20 20 29 7b 0a 20  nTrans<=1.  ){. 
10be0 20 20 20 66 6f 72 28 69 3d 30 3b 20 72 63 3d 3d     for(i=0; rc==
10bf0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 64  SQLITE_OK && i<d
10c00 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
10c10 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d      Btree *pBt =
10c20 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
10c30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29  .      if( pBt )
10c40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
10c50 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
10c60 74 50 68 61 73 65 4f 6e 65 28 70 42 74 2c 20 30  tPhaseOne(pBt, 0
10c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
10c80 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68 65 20  ..    /* Do the 
10c90 63 6f 6d 6d 69 74 20 6f 6e 6c 79 20 69 66 20 61  commit only if a
10ca0 6c 6c 20 64 61 74 61 62 61 73 65 73 20 73 75 63  ll databases suc
10cb0 63 65 73 73 66 75 6c 6c 79 20 63 6f 6d 70 6c 65  cessfully comple
10cc0 74 65 20 70 68 61 73 65 20 31 2e 20 0a 20 20 20  te phase 1. .   
10cd0 20 2a 2a 20 49 66 20 6f 6e 65 20 6f 66 20 74 68   ** If one of th
10ce0 65 20 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e BtreeCommitPha
10cf0 73 65 4f 6e 65 28 29 20 63 61 6c 6c 73 20 66 61  seOne() calls fa
10d00 69 6c 73 2c 20 74 68 69 73 20 69 6e 64 69 63 61  ils, this indica
10d10 74 65 73 20 61 6e 0a 20 20 20 20 2a 2a 20 49 4f  tes an.    ** IO
10d20 20 65 72 72 6f 72 20 77 68 69 6c 65 20 64 65 6c   error while del
10d30 65 74 69 6e 67 20 6f 72 20 74 72 75 6e 63 61 74  eting or truncat
10d40 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
10d50 6c 65 2e 20 49 74 20 69 73 20 75 6e 6c 69 6b 65  le. It is unlike
10d60 6c 79 2c 0a 20 20 20 20 2a 2a 20 62 75 74 20 63  ly,.    ** but c
10d70 6f 75 6c 64 20 68 61 70 70 65 6e 2e 20 49 6e 20  ould happen. In 
10d80 74 68 69 73 20 63 61 73 65 20 61 62 61 6e 64 6f  this case abando
10d90 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e 64  n processing and
10da0 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
10db0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  r..    */.    fo
10dc0 72 28 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  r(i=0; rc==SQLIT
10dd0 45 5f 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44  E_OK && i<db->nD
10de0 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 42  b; i++){.      B
10df0 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
10e00 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
10e10 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20    if( pBt ){.   
10e20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10e30 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
10e40 65 54 77 6f 28 70 42 74 2c 20 30 29 3b 0a 20 20  eTwo(pBt, 0);.  
10e50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
10e60 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
10e70 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
10e80 65 33 56 74 61 62 43 6f 6d 6d 69 74 28 64 62 29  e3VtabCommit(db)
10e90 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
10ea0 2a 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 63 61  * The complex ca
10eb0 73 65 20 2d 20 54 68 65 72 65 20 69 73 20 61 20  se - There is a 
10ec0 6d 75 6c 74 69 2d 66 69 6c 65 20 77 72 69 74 65  multi-file write
10ed0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 63 74  -transaction act
10ee0 69 76 65 2e 0a 20 20 2a 2a 20 54 68 69 73 20 72  ive..  ** This r
10ef0 65 71 75 69 72 65 73 20 61 20 6d 61 73 74 65 72  equires a master
10f00 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
10f10 20 65 6e 73 75 72 65 20 74 68 65 20 74 72 61 6e   ensure the tran
10f20 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20  saction is.  ** 
10f30 63 6f 6d 6d 69 74 74 65 64 20 61 74 6f 6d 69 63  committed atomic
10f40 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  ally..  */.#ifnd
10f50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
10f60 49 53 4b 49 4f 0a 20 20 65 6c 73 65 7b 0a 20 20  ISKIO.  else{.  
10f70 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
10f80 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b 0a  Vfs = db->pVfs;.
10f90 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
10fa0 72 20 3d 20 30 3b 20 20 20 2f 2a 20 46 69 6c 65  r = 0;   /* File
10fb0 2d 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 6d 61  -name for the ma
10fc0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  ster journal */.
10fd0 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
10fe0 7a 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c 69  zMainFile = sqli
10ff0 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
11000 61 6d 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ame(db->aDb[0].p
11010 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
11020 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65 72 20 3d  _file *pMaster =
11030 20 30 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73   0;.    i64 offs
11040 65 74 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  et = 0;.    int 
11050 72 65 73 3b 0a 20 20 20 20 69 6e 74 20 72 65 74  res;.    int ret
11060 72 79 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20  ryCount = 0;.   
11070 20 69 6e 74 20 6e 4d 61 69 6e 46 69 6c 65 3b 0a   int nMainFile;.
11080 0a 20 20 20 20 2f 2a 20 53 65 6c 65 63 74 20 61  .    /* Select a
11090 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
110a0 66 69 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  file name */.   
110b0 20 6e 4d 61 69 6e 46 69 6c 65 20 3d 20 73 71 6c   nMainFile = sql
110c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61  ite3Strlen30(zMa
110d0 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 7a 4d 61  inFile);.    zMa
110e0 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 50  ster = sqlite3MP
110f0 72 69 6e 74 66 28 64 62 2c 20 22 25 73 2d 6d 6a  rintf(db, "%s-mj
11100 58 58 58 58 58 58 39 58 58 7a 22 2c 20 7a 4d 61  XXXXXX9XXz", zMa
11110 69 6e 46 69 6c 65 29 3b 0a 20 20 20 20 69 66 28  inFile);.    if(
11120 20 7a 4d 61 73 74 65 72 3d 3d 30 20 29 20 72 65   zMaster==0 ) re
11130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
11140 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 64 6f 20 7b  M_BKPT;.    do {
11150 0a 20 20 20 20 20 20 75 33 32 20 69 52 61 6e 64  .      u32 iRand
11160 6f 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  om;.      if( re
11170 74 72 79 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  tryCount ){.    
11180 20 20 20 20 69 66 28 20 72 65 74 72 79 43 6f 75      if( retryCou
11190 6e 74 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  nt>100 ){.      
111a0 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
111b0 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a  SQLITE_FULL, "MJ
111c0 20 64 65 6c 65 74 65 3a 20 25 73 22 2c 20 7a 4d   delete: %s", zM
111d0 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
111e0 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
111f0 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c  e(pVfs, zMaster,
11200 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62   0);.          b
11210 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
11220 6c 73 65 20 69 66 28 20 72 65 74 72 79 43 6f 75  lse if( retryCou
11230 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  nt==1 ){.       
11240 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53     sqlite3_log(S
11250 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 22 4d 4a 20  QLITE_FULL, "MJ 
11260 63 6f 6c 6c 69 64 65 3a 20 25 73 22 2c 20 7a 4d  collide: %s", zM
11270 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  aster);.        
11280 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
11290 72 65 74 72 79 43 6f 75 6e 74 2b 2b 3b 0a 20 20  retryCount++;.  
112a0 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
112b0 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 69 52  omness(sizeof(iR
112c0 61 6e 64 6f 6d 29 2c 20 26 69 52 61 6e 64 6f 6d  andom), &iRandom
112d0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
112e0 5f 73 6e 70 72 69 6e 74 66 28 31 33 2c 20 26 7a  _snprintf(13, &z
112f0 4d 61 73 74 65 72 5b 6e 4d 61 69 6e 46 69 6c 65  Master[nMainFile
11300 5d 2c 20 22 2d 6d 6a 25 30 36 58 39 25 30 32 58  ], "-mj%06X9%02X
11310 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 28 69 52 61 6e 64 6f 6d 3e 3e 38 29 26 30    (iRandom>>8)&0
11340 78 66 66 66 66 66 66 2c 20 69 52 61 6e 64 6f 6d  xffffff, iRandom
11350 26 30 78 66 66 29 3b 0a 20 20 20 20 20 20 2f 2a  &0xff);.      /*
11360 20 54 68 65 20 61 6e 74 69 70 65 6e 75 6c 74 69   The antipenulti
11370 6d 61 74 65 20 63 68 61 72 61 63 74 65 72 20 6f  mate character o
11380 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
11390 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 0a 20  rnal name must. 
113a0 20 20 20 20 20 2a 2a 20 62 65 20 22 39 22 20 74       ** be "9" t
113b0 6f 20 61 76 6f 69 64 20 6e 61 6d 65 20 63 6f 6c  o avoid name col
113c0 6c 69 73 69 6f 6e 73 20 77 68 65 6e 20 75 73 69  lisions when usi
113d0 6e 67 20 38 2b 33 20 66 69 6c 65 6e 61 6d 65 73  ng 8+3 filenames
113e0 2e 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  . */.      asser
113f0 74 28 20 7a 4d 61 73 74 65 72 5b 73 71 6c 69 74  t( zMaster[sqlit
11400 65 33 53 74 72 6c 65 6e 33 30 28 7a 4d 61 73 74  e3Strlen30(zMast
11410 65 72 29 2d 33 5d 3d 3d 27 39 27 20 29 3b 0a 20  er)-3]=='9' );. 
11420 20 20 20 20 20 73 71 6c 69 74 65 33 46 69 6c 65       sqlite3File
11430 53 75 66 66 69 78 33 28 7a 4d 61 69 6e 46 69 6c  Suffix3(zMainFil
11440 65 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  e, zMaster);.   
11450 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11460 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
11470 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
11480 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72 65  CESS_EXISTS, &re
11490 73 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  s);.    }while( 
114a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
114b0 20 72 65 73 20 29 3b 0a 20 20 20 20 69 66 28 20   res );.    if( 
114c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
114d0 0a 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74  .      /* Open t
114e0 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
114f0 6c 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  l. */.      rc =
11500 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 4d 61   sqlite3OsOpenMa
11510 6c 6c 6f 63 28 70 56 66 73 2c 20 7a 4d 61 73 74  lloc(pVfs, zMast
11520 65 72 2c 20 26 70 4d 61 73 74 65 72 2c 20 0a 20  er, &pMaster, . 
11530 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11540 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
11550 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
11560 45 7c 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c  E|.          SQL
11570 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
11580 56 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  VE|SQLITE_OPEN_M
11590 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 2c 20 30  ASTER_JOURNAL, 0
115a0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
115b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
115c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
115d0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
115e0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
115f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
11600 7d 0a 20 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  }. .    /* Write
11610 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 65 61 63   the name of eac
11620 68 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  h database file 
11630 69 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  in the transacti
11640 6f 6e 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 0a  on into the new.
11650 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 20 6a 6f      ** master jo
11660 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61  urnal file. If a
11670 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61  n error occurs a
11680 74 20 74 68 69 73 20 70 6f 69 6e 74 20 63 6c 6f  t this point clo
11690 73 65 0a 20 20 20 20 2a 2a 20 61 6e 64 20 64 65  se.    ** and de
116a0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
116b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 6c  journal file. Al
116c0 6c 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c  l the individual
116d0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 0a 20   journal files. 
116e0 20 20 20 2a 2a 20 73 74 69 6c 6c 20 68 61 76 65     ** still have
116f0 20 27 6e 75 6c 6c 27 20 61 73 20 74 68 65 20 6d   'null' as the m
11700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
11710 69 6e 74 65 72 2c 20 73 6f 20 74 68 65 79 20 77  inter, so they w
11720 69 6c 6c 20 72 6f 6c 6c 0a 20 20 20 20 2a 2a 20  ill roll.    ** 
11730 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
11740 6c 79 20 69 66 20 61 20 66 61 69 6c 75 72 65 20  ly if a failure 
11750 6f 63 63 75 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  occurs..    */. 
11760 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
11770 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
11780 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
11790 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
117a0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
117b0 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28  3BtreeIsInTrans(
117c0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
117d0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c  char const *zFil
117e0 65 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  e = sqlite3Btree
117f0 47 65 74 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  GetJournalname(p
11800 42 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Bt);.        if(
11810 20 7a 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20   zFile==0 ){.   
11820 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
11830 20 20 2f 2a 20 49 67 6e 6f 72 65 20 54 45 4d 50    /* Ignore TEMP
11840 20 61 6e 64 20 3a 6d 65 6d 6f 72 79 3a 20 64 61   and :memory: da
11850 74 61 62 61 73 65 73 20 2a 2f 0a 20 20 20 20 20  tabases */.     
11860 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
11870 65 72 74 28 20 7a 46 69 6c 65 5b 30 5d 21 3d 30  ert( zFile[0]!=0
11880 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
11890 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
118a0 70 4d 61 73 74 65 72 2c 20 7a 46 69 6c 65 2c 20  pMaster, zFile, 
118b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
118c0 7a 46 69 6c 65 29 2b 31 2c 20 6f 66 66 73 65 74  zFile)+1, offset
118d0 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65  );.        offse
118e0 74 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  t += sqlite3Strl
118f0 65 6e 33 30 28 7a 46 69 6c 65 29 2b 31 3b 0a 20  en30(zFile)+1;. 
11900 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
11910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11920 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
11930 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72  loseFree(pMaster
11940 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
11950 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
11960 73 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a  s, zMaster, 0);.
11970 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
11980 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4d 61 73  3DbFree(db, zMas
11990 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
119a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
119b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
119c0 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20   }..    /* Sync 
119d0 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
119e0 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20  al file. If the 
119f0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
11a00 20 64 65 76 69 63 65 0a 20 20 20 20 2a 2a 20 66   device.    ** f
11a10 6c 61 67 20 69 73 20 73 65 74 20 74 68 69 73 20  lag is set this 
11a20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e  is not required.
11a30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
11a40 30 3d 3d 28 73 71 6c 69 74 65 33 4f 73 44 65 76  0==(sqlite3OsDev
11a50 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
11a60 63 73 28 70 4d 61 73 74 65 72 29 26 53 51 4c 49  cs(pMaster)&SQLI
11a70 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  TE_IOCAP_SEQUENT
11a80 49 41 4c 29 0a 20 20 20 20 20 26 26 20 53 51 4c  IAL).     && SQL
11a90 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
11aa0 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 4d 61 73  lite3OsSync(pMas
11ab0 74 65 72 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  ter, SQLITE_SYNC
11ac0 5f 4e 4f 52 4d 41 4c 29 29 0a 20 20 20 20 29 7b  _NORMAL)).    ){
11ad0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  .      sqlite3Os
11ae0 43 6c 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65  CloseFree(pMaste
11af0 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
11b00 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
11b10 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 20 20 20  zMaster, 0);.   
11b20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
11b30 28 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  (db, zMaster);. 
11b40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11b50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 79      }..    /* Sy
11b60 6e 63 20 61 6c 6c 20 74 68 65 20 64 62 20 66 69  nc all the db fi
11b70 6c 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  les involved in 
11b80 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
11b90 20 54 68 65 20 73 61 6d 65 20 63 61 6c 6c 0a 20   The same call. 
11ba0 20 20 20 2a 2a 20 73 65 74 73 20 74 68 65 20 6d     ** sets the m
11bb0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 6f  aster journal po
11bc0 69 6e 74 65 72 20 69 6e 20 65 61 63 68 20 69 6e  inter in each in
11bd0 64 69 76 69 64 75 61 6c 20 6a 6f 75 72 6e 61 6c  dividual journal
11be0 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 6e 20 65  . If.    ** an e
11bf0 72 72 6f 72 20 6f 63 63 75 72 73 20 68 65 72 65  rror occurs here
11c00 2c 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20  , do not delete 
11c10 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
11c20 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a  al file..    **.
11c30 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 65 72      ** If the er
11c40 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
11c50 67 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c  g the first call
11c60 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
11c70 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
11c80 73 65 4f 6e 65 28 29 2c 20 74 68 65 6e 20 74 68  seOne(), then th
11c90 65 72 65 20 69 73 20 61 20 63 68 61 6e 63 65 20  ere is a chance 
11ca0 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20  that the.    ** 
11cb0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11cc0 69 6c 65 20 77 69 6c 6c 20 62 65 20 6f 72 70 68  ile will be orph
11cd0 61 6e 65 64 2e 20 42 75 74 20 77 65 20 63 61 6e  aned. But we can
11ce0 6e 6f 74 20 64 65 6c 65 74 65 20 69 74 2c 0a 20  not delete it,. 
11cf0 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68     ** in case th
11d00 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11d10 20 66 69 6c 65 20 6e 61 6d 65 20 77 61 73 20 77   file name was w
11d20 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
11d30 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66  journal.    ** f
11d40 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 66  ile before the f
11d50 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64 2e  ailure occurred.
11d60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
11d70 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
11d80 4f 4b 20 26 26 20 69 3c 64 62 2d 3e 6e 44 62 3b  OK && i<db->nDb;
11d90 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 42 74   i++){ .      Bt
11da0 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
11db0 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 20  Db[i].pBt;.     
11dc0 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20   if( pBt ){.    
11dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11de0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
11df0 4f 6e 65 28 70 42 74 2c 20 7a 4d 61 73 74 65 72  One(pBt, zMaster
11e00 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
11e10 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
11e20 6f 73 65 46 72 65 65 28 70 4d 61 73 74 65 72 29  oseFree(pMaster)
11e30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  ;.    assert( rc
11e40 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 3b  !=SQLITE_BUSY );
11e50 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11e60 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11e70 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
11e80 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
11e90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11ea0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   }..    /* Delet
11eb0 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
11ec0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
11ed0 63 6f 6d 6d 69 74 73 20 74 68 65 20 74 72 61 6e  commits the tran
11ee0 73 61 63 74 69 6f 6e 2e 20 41 66 74 65 72 0a 20  saction. After. 
11ef0 20 20 20 2a 2a 20 64 6f 69 6e 67 20 74 68 69 73     ** doing this
11f00 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 69   the directory i
11f10 73 20 73 79 6e 63 65 64 20 61 67 61 69 6e 20 62  s synced again b
11f20 65 66 6f 72 65 20 61 6e 79 20 69 6e 64 69 76 69  efore any indivi
11f30 64 75 61 6c 0a 20 20 20 20 2a 2a 20 74 72 61 6e  dual.    ** tran
11f40 73 61 63 74 69 6f 6e 20 66 69 6c 65 73 20 61 72  saction files ar
11f50 65 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  e deleted..    *
11f60 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
11f70 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
11f80 20 7a 4d 61 73 74 65 72 2c 20 31 29 3b 0a 20 20   zMaster, 1);.  
11f90 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
11fa0 64 62 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  db, zMaster);.  
11fb0 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
11fc0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
11fd0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11fe0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 20    }..    /* All 
11ff0 66 69 6c 65 73 20 61 6e 64 20 64 69 72 65 63 74  files and direct
12000 6f 72 69 65 73 20 68 61 76 65 20 61 6c 72 65 61  ories have alrea
12010 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2c 20  dy been synced, 
12020 73 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  so the following
12030 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  .    ** calls to
12040 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12050 6d 69 74 50 68 61 73 65 54 77 6f 28 29 20 61 72  mitPhaseTwo() ar
12060 65 20 6f 6e 6c 79 20 63 6c 6f 73 69 6e 67 20 66  e only closing f
12070 69 6c 65 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  iles and.    ** 
12080 64 65 6c 65 74 69 6e 67 20 6f 72 20 74 72 75 6e  deleting or trun
12090 63 61 74 69 6e 67 20 6a 6f 75 72 6e 61 6c 73 2e  cating journals.
120a0 20 49 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   If something go
120b0 65 73 20 77 72 6f 6e 67 20 77 68 69 6c 65 0a 20  es wrong while. 
120c0 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61     ** this is ha
120d0 70 70 65 6e 69 6e 67 20 77 65 20 64 6f 6e 27 74  ppening we don't
120e0 20 72 65 61 6c 6c 79 20 63 61 72 65 2e 20 54 68   really care. Th
120f0 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74  e integrity of t
12100 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
12110 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
12120 20 67 75 61 72 61 6e 74 65 65 64 2c 20 62 75 74   guaranteed, but
12130 20 73 6f 6d 65 20 73 74 72 61 79 20 27 63 6f 6c   some stray 'col
12140 64 27 20 6a 6f 75 72 6e 61 6c 73 0a 20 20 20 20  d' journals.    
12150 2a 2a 20 6d 61 79 20 62 65 20 6c 79 69 6e 67 20  ** may be lying 
12160 61 72 6f 75 6e 64 2e 20 52 65 74 75 72 6e 69 6e  around. Returnin
12170 67 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  g an error code 
12180 77 6f 6e 27 74 20 68 65 6c 70 20 6d 61 74 74 65  won't help matte
12190 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  rs..    */.    d
121a0 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64  isable_simulated
121b0 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20  _io_errors();.  
121c0 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
121d0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
121e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
121f0 3e 6e 44 62 3b 20 69 2b 2b 29 7b 20 0a 20 20 20  >nDb; i++){ .   
12200 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
12210 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
12220 20 20 20 20 20 20 69 66 28 20 70 42 74 20 29 7b        if( pBt ){
12230 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12240 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12250 54 77 6f 28 70 42 74 2c 20 31 29 3b 0a 20 20 20  Two(pBt, 1);.   
12260 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
12270 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
12280 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 65 6e 61  alloc();.    ena
12290 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
122a0 5f 65 72 72 6f 72 73 28 29 3b 0a 0a 20 20 20 20  _errors();..    
122b0 73 71 6c 69 74 65 33 56 74 61 62 43 6f 6d 6d 69  sqlite3VtabCommi
122c0 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
122d0 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
122e0 7d 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 72  }../* .** This r
122f0 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 74 68  outine checks th
12300 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2e 6e  at the sqlite3.n
12310 56 64 62 65 41 63 74 69 76 65 20 63 6f 75 6e 74  VdbeActive count
12320 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 6d 61 74   variable.** mat
12330 63 68 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ches the number 
12340 6f 66 20 76 64 62 65 27 73 20 69 6e 20 74 68 65  of vdbe's in the
12350 20 6c 69 73 74 20 73 71 6c 69 74 65 33 2e 70 56   list sqlite3.pV
12360 64 62 65 20 74 68 61 74 20 61 72 65 0a 2a 2a 20  dbe that are.** 
12370 63 75 72 72 65 6e 74 6c 79 20 61 63 74 69 76 65  currently active
12380 2e 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66  . An assertion f
12390 61 69 6c 73 20 69 66 20 74 68 65 20 74 77 6f 20  ails if the two 
123a0 63 6f 75 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61  counts do not ma
123b0 74 63 68 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  tch..** This is 
123c0 61 6e 20 69 6e 74 65 72 6e 61 6c 20 73 65 6c 66  an internal self
123d0 2d 63 68 65 63 6b 20 6f 6e 6c 79 20 2d 20 69 74  -check only - it
123e0 20 69 73 20 6e 6f 74 20 61 6e 20 65 73 73 65 6e   is not an essen
123f0 74 69 61 6c 20 70 72 6f 63 65 73 73 69 6e 67 0a  tial processing.
12400 2a 2a 20 73 74 65 70 2e 0a 2a 2a 0a 2a 2a 20 54  ** step..**.** T
12410 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
12420 66 20 4e 44 45 42 55 47 20 69 73 20 64 65 66 69  f NDEBUG is defi
12430 6e 65 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ned..*/.#ifndef 
12440 4e 44 45 42 55 47 0a 73 74 61 74 69 63 20 76 6f  NDEBUG.static vo
12450 69 64 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  id checkActiveVd
12460 62 65 43 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  beCnt(sqlite3 *d
12470 62 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20  b){.  Vdbe *p;. 
12480 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20   int cnt = 0;.  
12490 69 6e 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 0a  int nWrite = 0;.
124a0 20 20 69 6e 74 20 6e 52 65 61 64 20 3d 20 30 3b    int nRead = 0;
124b0 0a 20 20 70 20 3d 20 64 62 2d 3e 70 56 64 62 65  .  p = db->pVdbe
124c0 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a  ;.  while( p ){.
124d0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
124e0 73 74 6d 74 5f 62 75 73 79 28 28 73 71 6c 69 74  stmt_busy((sqlit
124f0 65 33 5f 73 74 6d 74 2a 29 70 29 20 29 7b 0a 20  e3_stmt*)p) ){. 
12500 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
12510 20 20 69 66 28 20 70 2d 3e 72 65 61 64 4f 6e 6c    if( p->readOnl
12520 79 3d 3d 30 20 29 20 6e 57 72 69 74 65 2b 2b 3b  y==0 ) nWrite++;
12530 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 62 49  .      if( p->bI
12540 73 52 65 61 64 65 72 20 29 20 6e 52 65 61 64 2b  sReader ) nRead+
12550 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d  +;.    }.    p =
12560 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20   p->pNext;.  }. 
12570 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 64 62   assert( cnt==db
12580 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 3b  ->nVdbeActive );
12590 0a 20 20 61 73 73 65 72 74 28 20 6e 57 72 69 74  .  assert( nWrit
125a0 65 3d 3d 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  e==db->nVdbeWrit
125b0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
125c0 52 65 61 64 3d 3d 64 62 2d 3e 6e 56 64 62 65 52  Read==db->nVdbeR
125d0 65 61 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  ead );.}.#else.#
125e0 64 65 66 69 6e 65 20 63 68 65 63 6b 41 63 74 69  define checkActi
125f0 76 65 56 64 62 65 43 6e 74 28 78 29 0a 23 65 6e  veVdbeCnt(x).#en
12600 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68  dif../*.** If th
12610 65 20 56 64 62 65 20 70 61 73 73 65 64 20 61 73  e Vdbe passed as
12620 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
12630 65 6e 74 20 6f 70 65 6e 65 64 20 61 20 73 74 61  ent opened a sta
12640 74 65 6d 65 6e 74 2d 74 72 61 6e 73 61 63 74 69  tement-transacti
12650 6f 6e 2c 0a 2a 2a 20 63 6c 6f 73 65 20 69 74 20  on,.** close it 
12660 6e 6f 77 2e 20 41 72 67 75 6d 65 6e 74 20 65 4f  now. Argument eO
12670 70 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  p must be either
12680 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42   SAVEPOINT_ROLLB
12690 41 43 4b 20 6f 72 0a 2a 2a 20 53 41 56 45 50 4f  ACK or.** SAVEPO
126a0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 20 49 66 20  INT_RELEASE. If 
126b0 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
126c0 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 74  ROLLBACK, then t
126d0 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  he statement.** 
126e0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
126f0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 49 66 20 65  olled back. If e
12700 4f 70 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  Op is SAVEPOINT_
12710 52 45 4c 45 41 53 45 2c 20 74 68 65 6e 20 74 68  RELEASE, then th
12720 65 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20  e .** statement 
12730 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
12740 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  ommitted..**.** 
12750 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
12760 63 63 75 72 73 2c 20 61 6e 20 53 51 4c 49 54 45  ccurs, an SQLITE
12770 5f 49 4f 45 52 52 5f 58 58 58 20 65 72 72 6f 72  _IOERR_XXX error
12780 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
12790 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  d. .** Otherwise
127a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69   SQLITE_OK..*/.i
127b0 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  nt sqlite3VdbeCl
127c0 6f 73 65 53 74 61 74 65 6d 65 6e 74 28 56 64 62  oseStatement(Vdb
127d0 65 20 2a 70 2c 20 69 6e 74 20 65 4f 70 29 7b 0a  e *p, int eOp){.
127e0 20 20 73 71 6c 69 74 65 33 20 2a 63 6f 6e 73 74    sqlite3 *const
127f0 20 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69   db = p->db;.  i
12800 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12810 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 2d 3e 69  K;..  /* If p->i
12820 53 74 61 74 65 6d 65 6e 74 20 69 73 20 67 72 65  Statement is gre
12830 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
12840 74 68 65 6e 20 74 68 69 73 20 56 64 62 65 20 6f  then this Vdbe o
12850 70 65 6e 65 64 20 61 20 0a 20 20 2a 2a 20 73 74  pened a .  ** st
12860 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74  atement transact
12870 69 6f 6e 20 74 68 61 74 20 73 68 6f 75 6c 64 20  ion that should 
12880 62 65 20 63 6c 6f 73 65 64 20 68 65 72 65 2e 20  be closed here. 
12890 54 68 65 20 6f 6e 6c 79 20 65 78 63 65 70 74 69  The only excepti
128a0 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 68 61 74 20  on.  ** is that 
128b0 61 6e 20 49 4f 20 65 72 72 6f 72 20 6d 61 79 20  an IO error may 
128c0 68 61 76 65 20 6f 63 63 75 72 72 65 64 2c 20 63  have occurred, c
128d0 61 75 73 69 6e 67 20 61 6e 20 65 6d 65 72 67 65  ausing an emerge
128e0 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20  ncy rollback..  
128f0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
12900 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 3d  (db->nStatement=
12910 3d 30 29 2c 20 61 6e 64 20 74 68 65 72 65 20 69  =0), and there i
12920 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 2e  s nothing to do.
12930 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
12940 6e 53 74 61 74 65 6d 65 6e 74 20 26 26 20 70 2d  nStatement && p-
12950 3e 69 53 74 61 74 65 6d 65 6e 74 20 29 7b 0a 20  >iStatement ){. 
12960 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 63 6f     int i;.    co
12970 6e 73 74 20 69 6e 74 20 69 53 61 76 65 70 6f 69  nst int iSavepoi
12980 6e 74 20 3d 20 70 2d 3e 69 53 74 61 74 65 6d 65  nt = p->iStateme
12990 6e 74 2d 31 3b 0a 0a 20 20 20 20 61 73 73 65 72  nt-1;..    asser
129a0 74 28 20 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e  t( eOp==SAVEPOIN
129b0 54 5f 52 4f 4c 4c 42 41 43 4b 20 7c 7c 20 65 4f  T_ROLLBACK || eO
129c0 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  p==SAVEPOINT_REL
129d0 45 41 53 45 29 3b 0a 20 20 20 20 61 73 73 65 72  EASE);.    asser
129e0 74 28 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  t( db->nStatemen
129f0 74 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  t>0 );.    asser
12a00 74 28 20 70 2d 3e 69 53 74 61 74 65 6d 65 6e 74  t( p->iStatement
12a10 3d 3d 28 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e  ==(db->nStatemen
12a20 74 2b 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  t+db->nSavepoint
12a30 29 20 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 3d  ) );..    for(i=
12a40 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
12a50 2b 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 72  +){ .      int r
12a60 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  c2 = SQLITE_OK;.
12a70 20 20 20 20 20 20 42 74 72 65 65 20 2a 70 42 74        Btree *pBt
12a80 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
12a90 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  t;.      if( pBt
12aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
12ab0 65 4f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52  eOp==SAVEPOINT_R
12ac0 4f 4c 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20  OLLBACK ){.     
12ad0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
12ae0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
12af0 28 70 42 74 2c 20 53 41 56 45 50 4f 49 4e 54 5f  (pBt, SAVEPOINT_
12b00 52 4f 4c 4c 42 41 43 4b 2c 20 69 53 61 76 65 70  ROLLBACK, iSavep
12b10 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 7d  oint);.        }
12b20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 32  .        if( rc2
12b30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
12b40 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
12b50 71 6c 69 74 65 33 42 74 72 65 65 53 61 76 65 70  qlite3BtreeSavep
12b60 6f 69 6e 74 28 70 42 74 2c 20 53 41 56 45 50 4f  oint(pBt, SAVEPO
12b70 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61  INT_RELEASE, iSa
12b80 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20  vepoint);.      
12b90 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12ba0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12bb0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12bc0 72 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc2;.        }. 
12bd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12be0 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 2d   db->nStatement-
12bf0 2d 3b 0a 20 20 20 20 70 2d 3e 69 53 74 61 74 65  -;.    p->iState
12c00 6d 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69  ment = 0;..    i
12c10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12c20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 4f   ){.      if( eO
12c30 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c  p==SAVEPOINT_ROL
12c40 4c 42 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20  LBACK ){.       
12c50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 56 74 61   rc = sqlite3Vta
12c60 62 53 61 76 65 70 6f 69 6e 74 28 64 62 2c 20 53  bSavepoint(db, S
12c70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
12c80 4b 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a  K, iSavepoint);.
12c90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
12ca0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12cb0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12cc0 73 71 6c 69 74 65 33 56 74 61 62 53 61 76 65 70  sqlite3VtabSavep
12cd0 6f 69 6e 74 28 64 62 2c 20 53 41 56 45 50 4f 49  oint(db, SAVEPOI
12ce0 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69 53 61 76  NT_RELEASE, iSav
12cf0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20 20 7d  epoint);.      }
12d00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
12d10 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
12d20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 62  transaction is b
12d30 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b  eing rolled back
12d40 2c 20 61 6c 73 6f 20 72 65 73 74 6f 72 65 20 74  , also restore t
12d50 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  he .    ** datab
12d60 61 73 65 20 68 61 6e 64 6c 65 73 20 64 65 66 65  ase handles defe
12d70 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
12d80 63 6f 75 6e 74 65 72 20 74 6f 20 74 68 65 20 76  counter to the v
12d90 61 6c 75 65 20 69 74 20 68 61 64 20 77 68 65 6e  alue it had when
12da0 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61   .    ** the sta
12db0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
12dc0 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e 20 20  on was opened.  
12dd0 2a 2f 0a 20 20 20 20 69 66 28 20 65 4f 70 3d 3d  */.    if( eOp==
12de0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
12df0 43 4b 20 29 7b 0a 20 20 20 20 20 20 64 62 2d 3e  CK ){.      db->
12e00 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
12e10 70 2d 3e 6e 53 74 6d 74 44 65 66 43 6f 6e 73 3b  p->nStmtDefCons;
12e20 0a 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65  .      db->nDefe
12e30 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 70 2d  rredImmCons = p-
12e40 3e 6e 53 74 6d 74 44 65 66 49 6d 6d 43 6f 6e 73  >nStmtDefImmCons
12e50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
12e60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12e70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
12e80 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
12e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
12ea0 6e 65 64 20 62 79 20 74 68 65 20 64 61 74 61 62  ned by the datab
12eb0 61 73 65 20 0a 2a 2a 20 68 61 6e 64 6c 65 20 61  ase .** handle a
12ec0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
12ed0 68 65 20 56 4d 20 70 61 73 73 65 64 20 61 73 20  he VM passed as 
12ee0 61 6e 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  an argument is a
12ef0 62 6f 75 74 20 74 6f 20 62 65 20 0a 2a 2a 20 63  bout to be .** c
12f00 6f 6d 6d 69 74 74 65 64 2e 20 49 66 20 74 68 65  ommitted. If the
12f10 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69  re are outstandi
12f20 6e 67 20 64 65 66 65 72 72 65 64 20 66 6f 72 65  ng deferred fore
12f30 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign key constrai
12f40 6e 74 0a 2a 2a 20 76 69 6f 6c 61 74 69 6f 6e 73  nt.** violations
12f50 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
12f60 45 52 52 4f 52 2e 20 4f 74 68 65 72 77 69 73 65  ERROR. Otherwise
12f70 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
12f80 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
12f90 6f 75 74 73 74 61 6e 64 69 6e 67 20 46 4b 20 76  outstanding FK v
12fa0 69 6f 6c 61 74 69 6f 6e 73 20 61 6e 64 20 74 68  iolations and th
12fb0 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
12fc0 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45  rns .** SQLITE_E
12fd0 52 52 4f 52 2c 20 73 65 74 20 74 68 65 20 72 65  RROR, set the re
12fe0 73 75 6c 74 20 6f 66 20 74 68 65 20 56 4d 20 74  sult of the VM t
12ff0 6f 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  o SQLITE_CONSTRA
13000 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 0a 2a  INT_FOREIGNKEY.*
13010 2a 20 61 6e 64 20 77 72 69 74 65 20 61 6e 20 65  * and write an e
13020 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20  rror message to 
13030 69 74 2e 20 54 68 65 6e 20 72 65 74 75 72 6e 20  it. Then return 
13040 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
13050 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13060 4f 4d 49 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  OMIT_FOREIGN_KEY
13070 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65  .int sqlite3Vdbe
13080 43 68 65 63 6b 46 6b 28 56 64 62 65 20 2a 70 2c  CheckFk(Vdbe *p,
13090 20 69 6e 74 20 64 65 66 65 72 72 65 64 29 7b 0a   int deferred){.
130a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
130b0 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28 64 65  p->db;.  if( (de
130c0 66 65 72 72 65 64 20 26 26 20 28 64 62 2d 3e 6e  ferred && (db->n
130d0 44 65 66 65 72 72 65 64 43 6f 6e 73 2b 64 62 2d  DeferredCons+db-
130e0 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
130f0 73 29 3e 30 29 20 0a 20 20 20 7c 7c 20 28 21 64  s)>0) .   || (!d
13100 65 66 65 72 72 65 64 20 26 26 20 70 2d 3e 6e 46  eferred && p->nF
13110 6b 43 6f 6e 73 74 72 61 69 6e 74 3e 30 29 20 0a  kConstraint>0) .
13120 20 20 29 7b 0a 20 20 20 20 70 2d 3e 72 63 20 3d    ){.    p->rc =
13130 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
13140 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b 0a 20  NT_FOREIGNKEY;. 
13150 20 20 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f     p->errorActio
13160 6e 20 3d 20 4f 45 5f 41 62 6f 72 74 3b 0a 20 20  n = OE_Abort;.  
13170 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 72 72    sqlite3VdbeErr
13180 6f 72 28 70 2c 20 22 46 4f 52 45 49 47 4e 20 4b  or(p, "FOREIGN K
13190 45 59 20 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  EY constraint fa
131a0 69 6c 65 64 22 29 3b 0a 20 20 20 20 72 65 74 75  iled");.    retu
131b0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
131c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
131d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
131e0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
131f0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
13200 74 68 65 20 77 68 65 6e 20 61 20 56 44 42 45 20  the when a VDBE 
13210 74 72 69 65 73 20 74 6f 20 68 61 6c 74 2e 20 20  tries to halt.  
13220 49 66 20 74 68 65 20 56 44 42 45 0a 2a 2a 20 68  If the VDBE.** h
13230 61 73 20 6d 61 64 65 20 63 68 61 6e 67 65 73 20  as made changes 
13240 61 6e 64 20 69 73 20 69 6e 20 61 75 74 6f 63 6f  and is in autoco
13250 6d 6d 69 74 20 6d 6f 64 65 2c 20 74 68 65 6e 20  mmit mode, then 
13260 63 6f 6d 6d 69 74 20 74 68 6f 73 65 0a 2a 2a 20  commit those.** 
13270 63 68 61 6e 67 65 73 2e 20 20 49 66 20 61 20 72  changes.  If a r
13280 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 65 64 65  ollback is neede
13290 64 2c 20 74 68 65 6e 20 64 6f 20 74 68 65 20 72  d, then do the r
132a0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ollback..**.** T
132b0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
132c0 68 65 20 6f 6e 6c 79 20 77 61 79 20 74 6f 20 6d  he only way to m
132d0 6f 76 65 20 74 68 65 20 73 74 61 74 65 20 6f 66  ove the state of
132e0 20 61 20 56 4d 20 66 72 6f 6d 0a 2a 2a 20 53 51   a VM from.** SQ
132f0 4c 49 54 45 5f 4d 41 47 49 43 5f 52 55 4e 20 74  LITE_MAGIC_RUN t
13300 6f 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 48  o SQLITE_MAGIC_H
13310 41 4c 54 2e 20 20 49 74 20 69 73 20 68 61 72 6d  ALT.  It is harm
13320 6c 65 73 73 20 74 6f 0a 2a 2a 20 63 61 6c 6c 20  less to.** call 
13330 74 68 69 73 20 6f 6e 20 61 20 56 4d 20 74 68 61  this on a VM tha
13340 74 20 69 73 20 69 6e 20 74 68 65 20 53 51 4c 49  t is in the SQLI
13350 54 45 5f 4d 41 47 49 43 5f 48 41 4c 54 20 73 74  TE_MAGIC_HALT st
13360 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ate..**.** Retur
13370 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e  n an error code.
13380 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20    If the commit 
13390 63 6f 75 6c 64 20 6e 6f 74 20 63 6f 6d 70 6c 65  could not comple
133a0 74 65 20 62 65 63 61 75 73 65 20 6f 66 0a 2a 2a  te because of.**
133b0 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
133c0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
133d0 42 55 53 59 2e 20 20 49 66 20 53 51 4c 49 54 45  BUSY.  If SQLITE
133e0 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65  _BUSY is returne
133f0 64 2c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74  d, it.** means t
13400 68 65 20 63 6c 6f 73 65 20 64 69 64 20 6e 6f 74  he close did not
13410 20 68 61 70 70 65 6e 20 61 6e 64 20 6e 65 65 64   happen and need
13420 73 20 74 6f 20 62 65 20 72 65 70 65 61 74 65 64  s to be repeated
13430 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13440 56 64 62 65 48 61 6c 74 28 56 64 62 65 20 2a 70  VdbeHalt(Vdbe *p
13450 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
13460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13470 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
13480 73 74 6f 72 65 20 74 72 61 6e 73 69 65 6e 74 20  store transient 
13490 72 65 74 75 72 6e 20 63 6f 64 65 73 20 2a 2f 0a  return codes */.
134a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
134b0 70 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 54 68 69  p->db;..  /* Thi
134c0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6e 74 61  s function conta
134d0 69 6e 73 20 74 68 65 20 6c 6f 67 69 63 20 74 68  ins the logic th
134e0 61 74 20 64 65 74 65 72 6d 69 6e 65 73 20 69 66  at determines if
134f0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 0a   a statement or.
13500 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
13510 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74   will be committ
13520 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63  ed or rolled bac
13530 6b 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  k as a result of
13540 20 74 68 65 0a 20 20 2a 2a 20 65 78 65 63 75 74   the.  ** execut
13550 69 6f 6e 20 6f 66 20 74 68 69 73 20 76 69 72 74  ion of this virt
13560 75 61 6c 20 6d 61 63 68 69 6e 65 2e 20 0a 20 20  ual machine. .  
13570 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6e 79 20 6f  **.  ** If any o
13580 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
13590 65 72 72 6f 72 73 20 6f 63 63 75 72 3a 0a 20 20  errors occur:.  
135a0 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c 49  **.  **     SQLI
135b0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 2a 2a 20 20 20  TE_NOMEM.  **   
135c0 20 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20    SQLITE_IOERR. 
135d0 20 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 46   **     SQLITE_F
135e0 55 4c 4c 0a 20 20 2a 2a 20 20 20 20 20 53 51 4c  ULL.  **     SQL
135f0 49 54 45 5f 49 4e 54 45 52 52 55 50 54 0a 20 20  ITE_INTERRUPT.  
13600 2a 2a 0a 20 20 2a 2a 20 54 68 65 6e 20 74 68 65  **.  ** Then the
13610 20 69 6e 74 65 72 6e 61 6c 20 63 61 63 68 65 20   internal cache 
13620 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
13630 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
13640 73 69 73 74 65 6e 74 0a 20 20 2a 2a 20 73 74 61  sistent.  ** sta
13650 74 65 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  te.  We need to 
13660 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 73 74 61  rollback the sta
13670 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
13680 6f 6e 2c 20 69 66 20 74 68 65 72 65 20 69 73 0a  on, if there is.
13690 20 20 2a 2a 20 6f 6e 65 2c 20 6f 72 20 74 68 65    ** one, or the
136a0 20 63 6f 6d 70 6c 65 74 65 20 74 72 61 6e 73 61   complete transa
136b0 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 69  ction if there i
136c0 73 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  s no statement t
136d0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f  ransaction..  */
136e0 0a 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ..  if( db->mall
136f0 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
13700 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e  p->rc = SQLITE_N
13710 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  OMEM_BKPT;.  }. 
13720 20 63 6c 6f 73 65 41 6c 6c 43 75 72 73 6f 72 73   closeAllCursors
13730 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  (p);.  if( p->ma
13740 67 69 63 21 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic!=VDBE_MAGIC_
13750 52 55 4e 20 29 7b 0a 20 20 20 20 72 65 74 75 72  RUN ){.    retur
13760 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
13770 0a 20 20 63 68 65 63 6b 41 63 74 69 76 65 56 64  .  checkActiveVd
13780 62 65 43 6e 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  beCnt(db);..  /*
13790 20 4e 6f 20 63 6f 6d 6d 69 74 20 6f 72 20 72 6f   No commit or ro
137a0 6c 6c 62 61 63 6b 20 6e 65 65 64 65 64 20 69 66  llback needed if
137b0 20 74 68 65 20 70 72 6f 67 72 61 6d 20 6e 65 76   the program nev
137c0 65 72 20 73 74 61 72 74 65 64 20 6f 72 20 69 66  er started or if
137d0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74   the.  ** SQL st
137e0 61 74 65 6d 65 6e 74 20 64 6f 65 73 20 6e 6f 74  atement does not
137f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 61   read or write a
13800 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
13810 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e   */.  if( p->pc>
13820 3d 30 20 26 26 20 70 2d 3e 62 49 73 52 65 61 64  =0 && p->bIsRead
13830 65 72 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 72  er ){.    int mr
13840 63 3b 20 20 20 2f 2a 20 50 72 69 6d 61 72 79 20  c;   /* Primary 
13850 65 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  error code from 
13860 70 2d 3e 72 63 20 2a 2f 0a 20 20 20 20 69 6e 74  p->rc */.    int
13870 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 3d 20   eStatementOp = 
13880 30 3b 0a 20 20 20 20 69 6e 74 20 69 73 53 70 65  0;.    int isSpe
13890 63 69 61 6c 45 72 72 6f 72 3b 20 20 20 20 20 20  cialError;      
138a0 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 6f 20        /* Set to 
138b0 74 72 75 65 20 69 66 20 61 20 27 73 70 65 63 69  true if a 'speci
138c0 61 6c 27 20 65 72 72 6f 72 20 2a 2f 0a 0a 20 20  al' error */..  
138d0 20 20 2f 2a 20 4c 6f 63 6b 20 61 6c 6c 20 62 74    /* Lock all bt
138e0 72 65 65 73 20 75 73 65 64 20 62 79 20 74 68 65  rees used by the
138f0 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
13900 20 20 73 71 6c 69 74 65 33 56 64 62 65 45 6e 74    sqlite3VdbeEnt
13910 65 72 28 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  er(p);..    /* C
13920 68 65 63 6b 20 66 6f 72 20 6f 6e 65 20 6f 66 20  heck for one of 
13930 74 68 65 20 73 70 65 63 69 61 6c 20 65 72 72 6f  the special erro
13940 72 73 20 2a 2f 0a 20 20 20 20 6d 72 63 20 3d 20  rs */.    mrc = 
13950 70 2d 3e 72 63 20 26 20 30 78 66 66 3b 0a 20 20  p->rc & 0xff;.  
13960 20 20 69 73 53 70 65 63 69 61 6c 45 72 72 6f 72    isSpecialError
13970 20 3d 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   = mrc==SQLITE_N
13980 4f 4d 45 4d 20 7c 7c 20 6d 72 63 3d 3d 53 51 4c  OMEM || mrc==SQL
13990 49 54 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  ITE_IOERR.      
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
139b0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4e  | mrc==SQLITE_IN
139c0 54 45 52 52 55 50 54 20 7c 7c 20 6d 72 63 3d 3d  TERRUPT || mrc==
139d0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
139e0 20 69 66 28 20 69 73 53 70 65 63 69 61 6c 45 72   if( isSpecialEr
139f0 72 6f 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ror ){.      /* 
13a00 49 66 20 74 68 65 20 71 75 65 72 79 20 77 61 73  If the query was
13a10 20 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 74   read-only and t
13a20 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
13a30 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
13a40 54 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 20  T, .      ** no 
13a50 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6e 65 63 65  rollback is nece
13a60 73 73 61 72 79 2e 20 4f 74 68 65 72 77 69 73 65  ssary. Otherwise
13a70 2c 20 61 74 20 6c 65 61 73 74 20 61 20 73 61 76  , at least a sav
13a80 65 70 6f 69 6e 74 20 0a 20 20 20 20 20 20 2a 2a  epoint .      **
13a90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
13aa0 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t be rolled back
13ab0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
13ac0 64 61 74 61 62 61 73 65 20 74 6f 20 61 20 0a 20  database to a . 
13ad0 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74 65       ** consiste
13ae0 6e 74 20 73 74 61 74 65 2e 0a 20 20 20 20 20 20  nt state..      
13af0 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 45 76 65 6e  **.      ** Even
13b00 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
13b10 74 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  t is read-only, 
13b20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20  it is important 
13b30 74 6f 20 70 65 72 66 6f 72 6d 0a 20 20 20 20 20  to perform.     
13b40 20 2a 2a 20 61 20 73 74 61 74 65 6d 65 6e 74 20   ** a statement 
13b50 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  or transaction r
13b60 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
13b70 6e 2e 20 49 66 20 74 68 65 20 65 72 72 6f 72 20  n. If the error 
13b80 0a 20 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 72  .      ** occurr
13b90 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
13ba0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c   to the journal,
13bb0 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20   sub-journal or 
13bc0 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a  database.      *
13bd0 2a 20 66 69 6c 65 20 61 73 20 70 61 72 74 20 6f  * file as part o
13be0 66 20 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 66  f an effort to f
13bf0 72 65 65 20 75 70 20 63 61 63 68 65 20 73 70 61  ree up cache spa
13c00 63 65 20 28 73 65 65 20 66 75 6e 63 74 69 6f 6e  ce (see function
13c10 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 72 53  .      ** pagerS
13c20 74 72 65 73 73 28 29 20 69 6e 20 70 61 67 65 72  tress() in pager
13c30 2e 63 29 2c 20 74 68 65 20 72 6f 6c 6c 62 61 63  .c), the rollbac
13c40 6b 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f  k is required to
13c50 20 72 65 73 74 6f 72 65 20 0a 20 20 20 20 20 20   restore .      
13c60 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f 20  ** the pager to 
13c70 61 20 63 6f 6e 73 69 73 74 65 6e 74 20 73 74 61  a consistent sta
13c80 74 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  te..      */.   
13c90 20 20 20 69 66 28 20 21 70 2d 3e 72 65 61 64 4f     if( !p->readO
13ca0 6e 6c 79 20 7c 7c 20 6d 72 63 21 3d 53 51 4c 49  nly || mrc!=SQLI
13cb0 54 45 5f 49 4e 54 45 52 52 55 50 54 20 29 7b 0a  TE_INTERRUPT ){.
13cc0 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 72 63          if( (mrc
13cd0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 7c  ==SQLITE_NOMEM |
13ce0 7c 20 6d 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55  | mrc==SQLITE_FU
13cf0 4c 4c 29 20 26 26 20 70 2d 3e 75 73 65 73 53 74  LL) && p->usesSt
13d00 6d 74 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  mtJournal ){.   
13d10 20 20 20 20 20 20 20 65 53 74 61 74 65 6d 65 6e         eStatemen
13d20 74 4f 70 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f  tOp = SAVEPOINT_
13d30 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20 20 20 20  ROLLBACK;.      
13d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
13d50 20 20 20 2f 2a 20 57 65 20 61 72 65 20 66 6f 72     /* We are for
13d60 63 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  ced to roll back
13d70 20 74 68 65 20 61 63 74 69 76 65 20 74 72 61 6e   the active tran
13d80 73 61 63 74 69 6f 6e 2e 20 42 65 66 6f 72 65 20  saction. Before 
13d90 64 6f 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  doing.          
13da0 2a 2a 20 73 6f 2c 20 61 62 6f 72 74 20 61 6e 79  ** so, abort any
13db0 20 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74   other statement
13dc0 73 20 74 68 69 73 20 68 61 6e 64 6c 65 20 63 75  s this handle cu
13dd0 72 72 65 6e 74 6c 79 20 68 61 73 20 61 63 74 69  rrently has acti
13de0 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ve..          */
13df0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
13e00 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62  e3RollbackAll(db
13e10 2c 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  , SQLITE_ABORT_R
13e20 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20 20 20 20 20  OLLBACK);.      
13e30 20 20 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65      sqlite3Close
13e40 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a  Savepoints(db);.
13e50 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 61 75            db->au
13e60 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20  toCommit = 1;.  
13e70 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e          p->nChan
13e80 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ge = 0;.        
13e90 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
13ea0 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  .    /* Check fo
13eb0 72 20 69 6d 6d 65 64 69 61 74 65 20 66 6f 72 65  r immediate fore
13ec0 69 67 6e 20 6b 65 79 20 76 69 6f 6c 61 74 69 6f  ign key violatio
13ed0 6e 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ns. */.    if( p
13ee0 2d 3e 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ->rc==SQLITE_OK 
13ef0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13f00 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c 20 30  VdbeCheckFk(p, 0
13f10 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
13f20 2f 2a 20 49 66 20 74 68 65 20 61 75 74 6f 2d 63  /* If the auto-c
13f30 6f 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65  ommit flag is se
13f40 74 20 61 6e 64 20 74 68 69 73 20 69 73 20 74 68  t and this is th
13f50 65 20 6f 6e 6c 79 20 61 63 74 69 76 65 20 77 72  e only active wr
13f60 69 74 65 72 20 0a 20 20 20 20 2a 2a 20 56 4d 2c  iter .    ** VM,
13f70 20 74 68 65 6e 20 77 65 20 64 6f 20 65 69 74 68   then we do eith
13f80 65 72 20 61 20 63 6f 6d 6d 69 74 20 6f 72 20 72  er a commit or r
13f90 6f 6c 6c 62 61 63 6b 20 6f 66 20 74 68 65 20 63  ollback of the c
13fa0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
13fb0 6f 6e 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  on. .    **.    
13fc0 2a 2a 20 4e 6f 74 65 3a 20 54 68 69 73 20 62 6c  ** Note: This bl
13fd0 6f 63 6b 20 61 6c 73 6f 20 72 75 6e 73 20 69 66  ock also runs if
13fe0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63   one of the spec
13ff0 69 61 6c 20 65 72 72 6f 72 73 20 68 61 6e 64 6c  ial errors handl
14000 65 64 20 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  ed .    ** above
14010 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e 20 0a   has occurred. .
14020 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
14030 73 71 6c 69 74 65 33 56 74 61 62 49 6e 53 79 6e  sqlite3VtabInSyn
14040 63 28 64 62 29 20 0a 20 20 20 20 20 26 26 20 64  c(db) .     && d
14050 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 0a 20  b->autoCommit . 
14060 20 20 20 20 26 26 20 64 62 2d 3e 6e 56 64 62 65      && db->nVdbe
14070 57 72 69 74 65 3d 3d 28 70 2d 3e 72 65 61 64 4f  Write==(p->readO
14080 6e 6c 79 3d 3d 30 29 20 0a 20 20 20 20 29 7b 0a  nly==0) .    ){.
14090 20 20 20 20 20 20 69 66 28 20 70 2d 3e 72 63 3d        if( p->rc=
140a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 70  =SQLITE_OK || (p
140b0 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d 3d 4f  ->errorAction==O
140c0 45 5f 46 61 69 6c 20 26 26 20 21 69 73 53 70 65  E_Fail && !isSpe
140d0 63 69 61 6c 45 72 72 6f 72 29 20 29 7b 0a 20 20  cialError) ){.  
140e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
140f0 65 33 56 64 62 65 43 68 65 63 6b 46 6b 28 70 2c  e3VdbeCheckFk(p,
14100 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
14110 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14120 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
14130 4e 45 56 45 52 28 70 2d 3e 72 65 61 64 4f 6e 6c  NEVER(p->readOnl
14140 79 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y) ){.          
14150 20 20 73 71 6c 69 74 65 33 56 64 62 65 4c 65 61    sqlite3VdbeLea
14160 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 20  ve(p);.         
14170 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14180 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
14190 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63    }.          rc
141a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52   = SQLITE_CONSTR
141b0 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3b  AINT_FOREIGNKEY;
141c0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 20  .        }else{ 
141d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  .          /* Th
141e0 65 20 61 75 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c  e auto-commit fl
141f0 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 20  ag is true, the 
14200 76 64 62 65 20 70 72 6f 67 72 61 6d 20 77 61 73  vdbe program was
14210 20 73 75 63 63 65 73 73 66 75 6c 20 0a 20 20 20   successful .   
14220 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 68 69 74         ** or hit
14230 20 61 6e 20 27 4f 52 20 46 41 49 4c 27 20 63 6f   an 'OR FAIL' co
14240 6e 73 74 72 61 69 6e 74 20 61 6e 64 20 74 68 65  nstraint and the
14250 72 65 20 61 72 65 20 6e 6f 20 64 65 66 65 72 72  re are no deferr
14260 65 64 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20  ed foreign.     
14270 20 20 20 20 20 2a 2a 20 6b 65 79 20 63 6f 6e 73       ** key cons
14280 74 72 61 69 6e 74 73 20 74 6f 20 68 6f 6c 64 20  traints to hold 
14290 75 70 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  up the transacti
142a0 6f 6e 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 61  on. This means a
142b0 20 63 6f 6d 6d 69 74 20 0a 20 20 20 20 20 20 20   commit .       
142c0 20 20 20 2a 2a 20 69 73 20 72 65 71 75 69 72 65     ** is require
142d0 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
142e0 72 63 20 3d 20 76 64 62 65 43 6f 6d 6d 69 74 28  rc = vdbeCommit(
142f0 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
14300 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
14310 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
14320 20 70 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a   p->readOnly ){.
14330 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
14340 33 56 64 62 65 4c 65 61 76 65 28 70 29 3b 0a 20  3VdbeLeave(p);. 
14350 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
14360 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
14370 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72       }else if( r
14380 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14390 20 20 20 20 20 20 20 20 20 20 70 2d 3e 72 63 20            p->rc 
143a0 3d 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  = rc;.          
143b0 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41  sqlite3RollbackA
143c0 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  ll(db, SQLITE_OK
143d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e  );.          p->
143e0 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  nChange = 0;.   
143f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
14400 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65 72        db->nDefer
14410 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 20  redCons = 0;.   
14420 20 20 20 20 20 20 20 64 62 2d 3e 6e 44 65 66 65         db->nDefe
14430 72 72 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b  rredImmCons = 0;
14440 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66  .          db->f
14450 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
14460 44 65 66 65 72 46 4b 73 3b 0a 20 20 20 20 20 20  DeferFKs;.      
14470 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6d 6d 69      sqlite3Commi
14480 74 49 6e 74 65 72 6e 61 6c 43 68 61 6e 67 65 73  tInternalChanges
14490 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  (db);.        }.
144a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
144b0 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c       sqlite3Roll
144c0 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49  backAll(db, SQLI
144d0 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 20 20 20 20  TE_OK);.        
144e0 70 2d 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a  p->nChange = 0;.
144f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
14500 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
14510 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
14520 65 53 74 61 74 65 6d 65 6e 74 4f 70 3d 3d 30 20  eStatementOp==0 
14530 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
14540 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
14550 20 70 2d 3e 65 72 72 6f 72 41 63 74 69 6f 6e 3d   p->errorAction=
14560 3d 4f 45 5f 46 61 69 6c 20 29 7b 0a 20 20 20 20  =OE_Fail ){.    
14570 20 20 20 20 65 53 74 61 74 65 6d 65 6e 74 4f 70      eStatementOp
14580 20 3d 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c   = SAVEPOINT_REL
14590 45 41 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73  EASE;.      }els
145a0 65 20 69 66 28 20 70 2d 3e 65 72 72 6f 72 41 63  e if( p->errorAc
145b0 74 69 6f 6e 3d 3d 4f 45 5f 41 62 6f 72 74 20 29  tion==OE_Abort )
145c0 7b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  {.        eState
145d0 6d 65 6e 74 4f 70 20 3d 20 53 41 56 45 50 4f 49  mentOp = SAVEPOI
145e0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 3b 0a 20 20 20  NT_ROLLBACK;.   
145f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14600 20 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63    sqlite3Rollbac
14610 6b 41 6c 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f  kAll(db, SQLITE_
14620 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b  ABORT_ROLLBACK);
14630 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
14640 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28  CloseSavepoints(
14650 64 62 29 3b 0a 20 20 20 20 20 20 20 20 64 62 2d  db);.        db-
14660 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b  >autoCommit = 1;
14670 0a 20 20 20 20 20 20 20 20 70 2d 3e 6e 43 68 61  .        p->nCha
14680 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nge = 0;.      }
14690 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
146a0 20 49 66 20 65 53 74 61 74 65 6d 65 6e 74 4f 70   If eStatementOp
146b0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
146c0 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  en a statement t
146d0 72 61 6e 73 61 63 74 69 6f 6e 20 6e 65 65 64 73  ransaction needs
146e0 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6f   to.    ** be co
146f0 6d 6d 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65  mmitted or rolle
14700 64 20 62 61 63 6b 2e 20 43 61 6c 6c 20 73 71 6c  d back. Call sql
14710 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
14720 74 65 6d 65 6e 74 28 29 20 74 6f 0a 20 20 20 20  tement() to.    
14730 2a 2a 20 64 6f 20 73 6f 2e 20 49 66 20 74 68 69  ** do so. If thi
14740 73 20 6f 70 65 72 61 74 69 6f 6e 20 72 65 74 75  s operation retu
14750 72 6e 73 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e  rns an error, an
14760 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  d the current st
14770 61 74 65 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 65  atement.    ** e
14780 72 72 6f 72 20 63 6f 64 65 20 69 73 20 53 51 4c  rror code is SQL
14790 49 54 45 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45  ITE_OK or SQLITE
147a0 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 74 68 65  _CONSTRAINT, the
147b0 6e 20 70 72 6f 6d 6f 74 65 20 74 68 65 0a 20 20  n promote the.  
147c0 20 20 2a 2a 20 63 75 72 72 65 6e 74 20 73 74 61    ** current sta
147d0 74 65 6d 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  tement error cod
147e0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
147f0 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 20 29  ( eStatementOp )
14800 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
14810 69 74 65 33 56 64 62 65 43 6c 6f 73 65 53 74 61  ite3VdbeCloseSta
14820 74 65 6d 65 6e 74 28 70 2c 20 65 53 74 61 74 65  tement(p, eState
14830 6d 65 6e 74 4f 70 29 3b 0a 20 20 20 20 20 20 69  mentOp);.      i
14840 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
14850 20 69 66 28 20 70 2d 3e 72 63 3d 3d 53 51 4c 49   if( p->rc==SQLI
14860 54 45 5f 4f 4b 20 7c 7c 20 28 70 2d 3e 72 63 26  TE_OK || (p->rc&
14870 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 43 4f  0xff)==SQLITE_CO
14880 4e 53 54 52 41 49 4e 54 20 29 7b 0a 20 20 20 20  NSTRAINT ){.    
14890 20 20 20 20 20 20 70 2d 3e 72 63 20 3d 20 72 63        p->rc = rc
148a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
148b0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
148c0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  >zErrMsg);.     
148d0 20 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20       p->zErrMsg 
148e0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
148f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 6f         sqlite3Ro
14900 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
14910 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
14920 41 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ACK);.        sq
14930 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f  lite3CloseSavepo
14940 69 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ints(db);.      
14950 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14960 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 2d   = 1;.        p-
14970 3e 6e 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  >nChange = 0;.  
14980 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
14990 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61     /* If this wa
149a0 73 20 61 6e 20 49 4e 53 45 52 54 2c 20 55 50 44  s an INSERT, UPD
149b0 41 54 45 20 6f 72 20 44 45 4c 45 54 45 20 61 6e  ATE or DELETE an
149c0 64 20 6e 6f 20 73 74 61 74 65 6d 65 6e 74 20 74  d no statement t
149d0 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 2a  ransaction.    *
149e0 2a 20 68 61 73 20 62 65 65 6e 20 72 6f 6c 6c 65  * has been rolle
149f0 64 20 62 61 63 6b 2c 20 75 70 64 61 74 65 20 74  d back, update t
14a00 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
14a10 65 63 74 69 6f 6e 20 63 68 61 6e 67 65 2d 63 6f  ection change-co
14a20 75 6e 74 65 72 2e 20 0a 20 20 20 20 2a 2f 0a 20  unter. .    */. 
14a30 20 20 20 69 66 28 20 70 2d 3e 63 68 61 6e 67 65     if( p->change
14a40 43 6e 74 4f 6e 20 29 7b 0a 20 20 20 20 20 20 69  CntOn ){.      i
14a50 66 28 20 65 53 74 61 74 65 6d 65 6e 74 4f 70 21  f( eStatementOp!
14a60 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
14a70 41 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ACK ){.        s
14a80 71 6c 69 74 65 33 56 64 62 65 53 65 74 43 68 61  qlite3VdbeSetCha
14a90 6e 67 65 73 28 64 62 2c 20 70 2d 3e 6e 43 68 61  nges(db, p->nCha
14aa0 6e 67 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  nge);.      }els
14ab0 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
14ac0 65 33 56 64 62 65 53 65 74 43 68 61 6e 67 65 73  e3VdbeSetChanges
14ad0 28 64 62 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  (db, 0);.      }
14ae0 0a 20 20 20 20 20 20 70 2d 3e 6e 43 68 61 6e 67  .      p->nChang
14af0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  e = 0;.    }..  
14b00 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
14b10 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 73 71   locks */.    sq
14b20 6c 69 74 65 33 56 64 62 65 4c 65 61 76 65 28 70  lite3VdbeLeave(p
14b30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 57 65 20  );.  }..  /* We 
14b40 68 61 76 65 20 73 75 63 63 65 73 73 66 75 6c 6c  have successfull
14b50 79 20 68 61 6c 74 65 64 20 61 6e 64 20 63 6c 6f  y halted and clo
14b60 73 65 64 20 74 68 65 20 56 4d 2e 20 20 52 65 63  sed the VM.  Rec
14b70 6f 72 64 20 74 68 69 73 20 66 61 63 74 2e 20 2a  ord this fact. *
14b80 2f 0a 20 20 69 66 28 20 70 2d 3e 70 63 3e 3d 30  /.  if( p->pc>=0
14b90 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6e 56 64 62   ){.    db->nVdb
14ba0 65 41 63 74 69 76 65 2d 2d 3b 0a 20 20 20 20 69  eActive--;.    i
14bb0 66 28 20 21 70 2d 3e 72 65 61 64 4f 6e 6c 79 20  f( !p->readOnly 
14bc0 29 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74 65  ) db->nVdbeWrite
14bd0 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 62  --;.    if( p->b
14be0 49 73 52 65 61 64 65 72 20 29 20 64 62 2d 3e 6e  IsReader ) db->n
14bf0 56 64 62 65 52 65 61 64 2d 2d 3b 0a 20 20 20 20  VdbeRead--;.    
14c00 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62  assert( db->nVdb
14c10 65 41 63 74 69 76 65 3e 3d 64 62 2d 3e 6e 56 64  eActive>=db->nVd
14c20 62 65 52 65 61 64 20 29 3b 0a 20 20 20 20 61 73  beRead );.    as
14c30 73 65 72 74 28 20 64 62 2d 3e 6e 56 64 62 65 52  sert( db->nVdbeR
14c40 65 61 64 3e 3d 64 62 2d 3e 6e 56 64 62 65 57 72  ead>=db->nVdbeWr
14c50 69 74 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ite );.    asser
14c60 74 28 20 64 62 2d 3e 6e 56 64 62 65 57 72 69 74  t( db->nVdbeWrit
14c70 65 3e 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 2d  e>=0 );.  }.  p-
14c80 3e 6d 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41  >magic = VDBE_MA
14c90 47 49 43 5f 48 41 4c 54 3b 0a 20 20 63 68 65 63  GIC_HALT;.  chec
14ca0 6b 41 63 74 69 76 65 56 64 62 65 43 6e 74 28 64  kActiveVdbeCnt(d
14cb0 62 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  b);.  if( db->ma
14cc0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14cd0 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54 45    p->rc = SQLITE
14ce0 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 7d  _NOMEM_BKPT;.  }
14cf0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 61 75  ..  /* If the au
14d00 74 6f 2d 63 6f 6d 6d 69 74 20 66 6c 61 67 20 69  to-commit flag i
14d10 73 20 73 65 74 20 74 6f 20 74 72 75 65 2c 20 74  s set to true, t
14d20 68 65 6e 20 61 6e 79 20 6c 6f 63 6b 73 20 74 68  hen any locks th
14d30 61 74 20 77 65 72 65 20 68 65 6c 64 0a 20 20 2a  at were held.  *
14d40 2a 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  * by connection 
14d50 64 62 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  db have now been
14d60 20 72 65 6c 65 61 73 65 64 2e 20 43 61 6c 6c 20   released. Call 
14d70 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f  sqlite3Connectio
14d80 6e 55 6e 6c 6f 63 6b 65 64 28 29 20 0a 20 20 2a  nUnlocked() .  *
14d90 2a 20 74 6f 20 69 6e 76 6f 6b 65 20 61 6e 79 20  * to invoke any 
14da0 72 65 71 75 69 72 65 64 20 75 6e 6c 6f 63 6b 2d  required unlock-
14db0 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61 63 6b 73  notify callbacks
14dc0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
14dd0 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 29 7b 0a 20  >autoCommit ){. 
14de0 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
14df0 74 69 6f 6e 55 6e 6c 6f 63 6b 65 64 28 64 62 29  tionUnlocked(db)
14e00 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
14e10 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
14e20 3e 30 20 7c 7c 20 64 62 2d 3e 61 75 74 6f 43 6f  >0 || db->autoCo
14e30 6d 6d 69 74 3d 3d 30 20 7c 7c 20 64 62 2d 3e 6e  mmit==0 || db->n
14e40 53 74 61 74 65 6d 65 6e 74 3d 3d 30 20 29 3b 0a  Statement==0 );.
14e50 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 72 63 3d    return (p->rc=
14e60 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 3f 20 53  =SQLITE_BUSY ? S
14e70 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 53 51 4c  QLITE_BUSY : SQL
14e80 49 54 45 5f 4f 4b 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  ITE_OK);.}.../*.
14e90 2a 2a 20 45 61 63 68 20 56 44 42 45 20 68 6f 6c  ** Each VDBE hol
14ea0 64 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ds the result of
14eb0 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
14ec0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 29 20   sqlite3_step() 
14ed0 63 61 6c 6c 0a 2a 2a 20 69 6e 20 70 2d 3e 72 63  call.** in p->rc
14ee0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
14ef0 73 65 74 73 20 74 68 61 74 20 72 65 73 75 6c 74  sets that result
14f00 20 62 61 63 6b 20 74 6f 20 53 51 4c 49 54 45 5f   back to SQLITE_
14f10 4f 4b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  OK..*/.void sqli
14f20 74 65 33 56 64 62 65 52 65 73 65 74 53 74 65 70  te3VdbeResetStep
14f30 52 65 73 75 6c 74 28 56 64 62 65 20 2a 70 29 7b  Result(Vdbe *p){
14f40 0a 20 20 70 2d 3e 72 63 20 3d 20 53 51 4c 49 54  .  p->rc = SQLIT
14f50 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14f60 6f 70 79 20 74 68 65 20 65 72 72 6f 72 20 63 6f  opy the error co
14f70 64 65 20 61 6e 64 20 65 72 72 6f 72 20 6d 65 73  de and error mes
14f80 73 61 67 65 20 62 65 6c 6f 6e 67 69 6e 67 20 74  sage belonging t
14f90 6f 20 74 68 65 20 56 44 42 45 20 70 61 73 73 65  o the VDBE passe
14fa0 64 0a 2a 2a 20 61 73 20 74 68 65 20 66 69 72 73  d.** as the firs
14fb0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 69 74  t argument to it
14fc0 73 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  s database handl
14fd0 65 20 28 73 6f 20 74 68 61 74 20 74 68 65 79 20  e (so that they 
14fe0 77 69 6c 6c 20 62 65 20 0a 2a 2a 20 72 65 74 75  will be .** retu
14ff0 72 6e 65 64 20 62 79 20 63 61 6c 6c 73 20 74 6f  rned by calls to
15000 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
15010 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 65  () and sqlite3_e
15020 72 72 6d 73 67 28 29 29 2e 0a 2a 2a 0a 2a 2a 20  rrmsg())..**.** 
15030 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  This function do
15040 65 73 20 6e 6f 74 20 63 6c 65 61 72 20 74 68 65  es not clear the
15050 20 56 44 42 45 20 65 72 72 6f 72 20 63 6f 64 65   VDBE error code
15060 20 6f 72 20 6d 65 73 73 61 67 65 2c 20 6a 75 73   or message, jus
15070 74 0a 2a 2a 20 63 6f 70 69 65 73 20 74 68 65 6d  t.** copies them
15080 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
15090 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
150a0 73 71 6c 69 74 65 33 56 64 62 65 54 72 61 6e 73  sqlite3VdbeTrans
150b0 66 65 72 45 72 72 6f 72 28 56 64 62 65 20 2a 70  ferError(Vdbe *p
150c0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
150d0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 6e 74 20   = p->db;.  int 
150e0 72 63 20 3d 20 70 2d 3e 72 63 3b 0a 20 20 69 66  rc = p->rc;.  if
150f0 28 20 70 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a  ( p->zErrMsg ){.
15100 20 20 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d      db->bBenignM
15110 61 6c 6c 6f 63 2b 2b 3b 0a 20 20 20 20 73 71 6c  alloc++;.    sql
15120 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
15130 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
15140 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29 20 64   db->pErr==0 ) d
15150 62 2d 3e 70 45 72 72 20 3d 20 73 71 6c 69 74 65  b->pErr = sqlite
15160 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
15170 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
15180 65 74 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20  etStr(db->pErr, 
15190 2d 31 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 2c 20  -1, p->zErrMsg, 
151a0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
151b0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
151c0 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
151d0 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
151e0 20 20 64 62 2d 3e 62 42 65 6e 69 67 6e 4d 61 6c    db->bBenignMal
151f0 6c 6f 63 2d 2d 3b 0a 20 20 20 20 64 62 2d 3e 65  loc--;.    db->e
15200 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 7d  rrCode = rc;.  }
15210 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
15220 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a  3Error(db, rc);.
15230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15240 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
15250 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
15260 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 53 51 4c 49  /*.** If an SQLI
15270 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47  TE_CONFIG_SQLLOG
15280 20 68 6f 6f 6b 20 69 73 20 72 65 67 69 73 74 65   hook is registe
15290 72 65 64 20 61 6e 64 20 74 68 65 20 56 4d 20 68  red and the VM h
152a0 61 73 20 62 65 65 6e 20 72 75 6e 2c 20 0a 2a 2a  as been run, .**
152b0 20 69 6e 76 6f 6b 65 20 69 74 2e 0a 2a 2f 0a 73   invoke it..*/.s
152c0 74 61 74 69 63 20 76 6f 69 64 20 76 64 62 65 49  tatic void vdbeI
152d0 6e 76 6f 6b 65 53 71 6c 6c 6f 67 28 56 64 62 65  nvokeSqllog(Vdbe
152e0 20 2a 76 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *v){.  if( sqli
152f0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
15300 78 53 71 6c 6c 6f 67 20 26 26 20 76 2d 3e 72 63  xSqllog && v->rc
15310 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 76  ==SQLITE_OK && v
15320 2d 3e 7a 53 71 6c 20 26 26 20 76 2d 3e 70 63 3e  ->zSql && v->pc>
15330 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
15340 7a 45 78 70 61 6e 64 65 64 20 3d 20 73 71 6c 69  zExpanded = sqli
15350 74 65 33 56 64 62 65 45 78 70 61 6e 64 53 71 6c  te3VdbeExpandSql
15360 28 76 2c 20 76 2d 3e 7a 53 71 6c 29 3b 0a 20 20  (v, v->zSql);.  
15370 20 20 61 73 73 65 72 74 28 20 76 2d 3e 64 62 2d    assert( v->db-
15380 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 3b  >init.busy==0 );
15390 0a 20 20 20 20 69 66 28 20 7a 45 78 70 61 6e 64  .    if( zExpand
153a0 65 64 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ed ){.      sqli
153b0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
153c0 78 53 71 6c 6c 6f 67 28 0a 20 20 20 20 20 20 20  xSqllog(.       
153d0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
153e0 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72  Config.pSqllogAr
153f0 67 2c 20 76 2d 3e 64 62 2c 20 7a 45 78 70 61 6e  g, v->db, zExpan
15400 64 65 64 2c 20 31 0a 20 20 20 20 20 20 29 3b 0a  ded, 1.      );.
15410 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46        sqlite3DbF
15420 72 65 65 28 76 2d 3e 64 62 2c 20 7a 45 78 70 61  ree(v->db, zExpa
15430 6e 64 65 64 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nded);.    }.  }
15440 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
15450 65 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c  e vdbeInvokeSqll
15460 6f 67 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  og(x).#endif../*
15470 0a 2a 2a 20 43 6c 65 61 6e 20 75 70 20 61 20 56  .** Clean up a V
15480 44 42 45 20 61 66 74 65 72 20 65 78 65 63 75 74  DBE after execut
15490 69 6f 6e 20 62 75 74 20 64 6f 20 6e 6f 74 20 64  ion but do not d
154a0 65 6c 65 74 65 20 74 68 65 20 56 44 42 45 20 6a  elete the VDBE j
154b0 75 73 74 20 79 65 74 2e 0a 2a 2a 20 57 72 69 74  ust yet..** Writ
154c0 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73 73  e any error mess
154d0 61 67 65 73 20 69 6e 74 6f 20 2a 70 7a 45 72 72  ages into *pzErr
154e0 4d 73 67 2e 20 20 52 65 74 75 72 6e 20 74 68 65  Msg.  Return the
154f0 20 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 2a 2a   result code..**
15500 0a 2a 2a 20 41 66 74 65 72 20 74 68 69 73 20 72  .** After this r
15510 6f 75 74 69 6e 65 20 69 73 20 72 75 6e 2c 20 74  outine is run, t
15520 68 65 20 56 44 42 45 20 73 68 6f 75 6c 64 20 62  he VDBE should b
15530 65 20 72 65 61 64 79 20 74 6f 20 62 65 20 65 78  e ready to be ex
15540 65 63 75 74 65 64 0a 2a 2a 20 61 67 61 69 6e 2e  ecuted.** again.
15550 0a 2a 2a 0a 2a 2a 20 54 6f 20 6c 6f 6f 6b 20 61  .**.** To look a
15560 74 20 69 74 20 61 6e 6f 74 68 65 72 20 77 61 79  t it another way
15570 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
15580 65 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20  esets the state 
15590 6f 66 20 74 68 65 0a 2a 2a 20 76 69 72 74 75 61  of the.** virtua
155a0 6c 20 6d 61 63 68 69 6e 65 20 66 72 6f 6d 20 56  l machine from V
155b0 44 42 45 5f 4d 41 47 49 43 5f 52 55 4e 20 6f 72  DBE_MAGIC_RUN or
155c0 20 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54   VDBE_MAGIC_HALT
155d0 20 62 61 63 6b 20 74 6f 0a 2a 2a 20 56 44 42 45   back to.** VDBE
155e0 5f 4d 41 47 49 43 5f 49 4e 49 54 2e 0a 2a 2f 0a  _MAGIC_INIT..*/.
155f0 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62 65 52  int sqlite3VdbeR
15600 65 73 65 74 28 56 64 62 65 20 2a 70 29 7b 0a 20  eset(Vdbe *p){. 
15610 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15620 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20 2f  db = p->db;..  /
15630 2a 20 49 66 20 74 68 65 20 56 4d 20 64 69 64 20  * If the VM did 
15640 6e 6f 74 20 72 75 6e 20 74 6f 20 63 6f 6d 70 6c  not run to compl
15650 65 74 69 6f 6e 20 6f 72 20 69 66 20 69 74 20 65  etion or if it e
15660 6e 63 6f 75 6e 74 65 72 65 64 20 61 6e 0a 20 20  ncountered an.  
15670 2a 2a 20 65 72 72 6f 72 2c 20 74 68 65 6e 20 69  ** error, then i
15680 74 20 6d 69 67 68 74 20 6e 6f 74 20 68 61 76 65  t might not have
15690 20 62 65 65 6e 20 68 61 6c 74 65 64 20 70 72 6f   been halted pro
156a0 70 65 72 6c 79 2e 20 20 53 6f 20 68 61 6c 74 0a  perly.  So halt.
156b0 20 20 2a 2a 20 69 74 20 6e 6f 77 2e 0a 20 20 2a    ** it now..  *
156c0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 48  /.  sqlite3VdbeH
156d0 61 6c 74 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66  alt(p);..  /* If
156e0 20 74 68 65 20 56 44 42 45 20 68 61 73 20 62 65   the VDBE has be
156f0 20 72 75 6e 20 65 76 65 6e 20 70 61 72 74 69 61   run even partia
15700 6c 6c 79 2c 20 74 68 65 6e 20 74 72 61 6e 73 66  lly, then transf
15710 65 72 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  er the error cod
15720 65 0a 20 20 2a 2a 20 61 6e 64 20 65 72 72 6f 72  e.  ** and error
15730 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20 74 68   message from th
15740 65 20 56 44 42 45 20 69 6e 74 6f 20 74 68 65 20  e VDBE into the 
15750 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 73 74  main database st
15760 72 75 63 74 75 72 65 2e 20 20 42 75 74 0a 20 20  ructure.  But.  
15770 2a 2a 20 69 66 20 74 68 65 20 56 44 42 45 20 68  ** if the VDBE h
15780 61 73 20 6a 75 73 74 20 62 65 65 6e 20 73 65 74  as just been set
15790 20 74 6f 20 72 75 6e 20 62 75 74 20 68 61 73 20   to run but has 
157a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 65 78 65  not actually exe
157b0 63 75 74 65 64 20 61 6e 79 0a 20 20 2a 2a 20 69  cuted any.  ** i
157c0 6e 73 74 72 75 63 74 69 6f 6e 73 20 79 65 74 2c  nstructions yet,
157d0 20 6c 65 61 76 65 20 74 68 65 20 6d 61 69 6e 20   leave the main 
157e0 64 61 74 61 62 61 73 65 20 65 72 72 6f 72 20 69  database error i
157f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 75 6e 63 68 61  nformation uncha
15800 6e 67 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nged..  */.  if(
15810 20 70 2d 3e 70 63 3e 3d 30 20 29 7b 0a 20 20 20   p->pc>=0 ){.   
15820 20 76 64 62 65 49 6e 76 6f 6b 65 53 71 6c 6c 6f   vdbeInvokeSqllo
15830 67 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  g(p);.    sqlite
15840 33 56 64 62 65 54 72 61 6e 73 66 65 72 45 72 72  3VdbeTransferErr
15850 6f 72 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  or(p);.    sqlit
15860 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e  e3DbFree(db, p->
15870 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 2d  zErrMsg);.    p-
15880 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  >zErrMsg = 0;.  
15890 20 20 69 66 28 20 70 2d 3e 72 75 6e 4f 6e 6c 79    if( p->runOnly
158a0 4f 6e 63 65 20 29 20 70 2d 3e 65 78 70 69 72 65  Once ) p->expire
158b0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  d = 1;.  }else i
158c0 66 28 20 70 2d 3e 72 63 20 26 26 20 70 2d 3e 65  f( p->rc && p->e
158d0 78 70 69 72 65 64 20 29 7b 0a 20 20 20 20 2f 2a  xpired ){.    /*
158e0 20 54 68 65 20 65 78 70 69 72 65 64 20 66 6c 61   The expired fla
158f0 67 20 77 61 73 20 73 65 74 20 6f 6e 20 74 68 65  g was set on the
15900 20 56 44 42 45 20 62 65 66 6f 72 65 20 74 68 65   VDBE before the
15910 20 66 69 72 73 74 20 63 61 6c 6c 0a 20 20 20 20   first call.    
15920 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 73 74  ** to sqlite3_st
15930 65 70 28 29 2e 20 46 6f 72 20 63 6f 6e 73 69 73  ep(). For consis
15940 74 65 6e 63 79 20 28 73 69 6e 63 65 20 73 71 6c  tency (since sql
15950 69 74 65 33 5f 73 74 65 70 28 29 20 77 61 73 0a  ite3_step() was.
15960 20 20 20 20 2a 2a 20 63 61 6c 6c 65 64 29 2c 20      ** called), 
15970 73 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  set the database
15980 20 65 72 72 6f 72 20 69 6e 20 74 68 69 73 20 63   error in this c
15990 61 73 65 20 61 73 20 77 65 6c 6c 2e 0a 20 20 20  ase as well..   
159a0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
159b0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
159c0 70 2d 3e 72 63 2c 20 70 2d 3e 7a 45 72 72 4d 73  p->rc, p->zErrMs
159d0 67 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 70 2d  g ? "%s" : 0, p-
159e0 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73  >zErrMsg);.    s
159f0 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
15a00 20 70 2d 3e 7a 45 72 72 4d 73 67 29 3b 0a 20 20   p->zErrMsg);.  
15a10 20 20 70 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30    p->zErrMsg = 0
15a20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 63 6c  ;.  }..  /* Recl
15a30 61 69 6d 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 75  aim all memory u
15a40 73 65 64 20 62 79 20 74 68 65 20 56 44 42 45 0a  sed by the VDBE.
15a50 20 20 2a 2f 0a 20 20 43 6c 65 61 6e 75 70 28 70    */.  Cleanup(p
15a60 29 3b 0a 0a 20 20 2f 2a 20 53 61 76 65 20 70 72  );..  /* Save pr
15a70 6f 66 69 6c 69 6e 67 20 69 6e 66 6f 72 6d 61 74  ofiling informat
15a80 69 6f 6e 20 66 72 6f 6d 20 74 68 69 73 20 56 44  ion from this VD
15a90 42 45 20 72 75 6e 2e 0a 20 20 2a 2f 0a 23 69 66  BE run..  */.#if
15aa0 64 65 66 20 56 44 42 45 5f 50 52 4f 46 49 4c 45  def VDBE_PROFILE
15ab0 0a 20 20 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  .  {.    FILE *o
15ac0 75 74 20 3d 20 66 6f 70 65 6e 28 22 76 64 62 65  ut = fopen("vdbe
15ad0 5f 70 72 6f 66 69 6c 65 2e 6f 75 74 22 2c 20 22  _profile.out", "
15ae0 61 22 29 3b 0a 20 20 20 20 69 66 28 20 6f 75 74  a");.    if( out
15af0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
15b00 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f  .      fprintf(o
15b10 75 74 2c 20 22 2d 2d 2d 2d 20 22 29 3b 0a 20 20  ut, "---- ");.  
15b20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
15b30 2d 3e 6e 4f 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nOp; i++){.   
15b40 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74       fprintf(out
15b50 2c 20 22 25 30 32 78 22 2c 20 70 2d 3e 61 4f 70  , "%02x", p->aOp
15b60 5b 69 5d 2e 6f 70 63 6f 64 65 29 3b 0a 20 20 20  [i].opcode);.   
15b70 20 20 20 7d 0a 20 20 20 20 20 20 66 70 72 69 6e     }.      fprin
15b80 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  tf(out, "\n");. 
15b90 20 20 20 20 20 69 66 28 20 70 2d 3e 7a 53 71 6c       if( p->zSql
15ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
15bb0 20 63 2c 20 70 63 20 3d 20 30 3b 0a 20 20 20 20   c, pc = 0;.    
15bc0 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
15bd0 20 22 2d 2d 20 22 29 3b 0a 20 20 20 20 20 20 20   "-- ");.       
15be0 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 70   for(i=0; (c = p
15bf0 2d 3e 7a 53 71 6c 5b 69 5d 29 21 3d 30 3b 20 69  ->zSql[i])!=0; i
15c00 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
15c10 66 28 20 70 63 3d 3d 27 5c 6e 27 20 29 20 66 70  f( pc=='\n' ) fp
15c20 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 22  rintf(out, "-- "
15c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  );.          put
15c40 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  c(c, out);.     
15c50 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
15c60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
15c70 66 28 20 70 63 21 3d 27 5c 6e 27 20 29 20 66 70  f( pc!='\n' ) fp
15c80 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 29  rintf(out, "\n")
15c90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
15ca0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 4f  for(i=0; i<p->nO
15cb0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
15cc0 20 63 68 61 72 20 7a 48 64 72 5b 31 30 30 5d 3b   char zHdr[100];
15cd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ce0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
15cf0 28 7a 48 64 72 29 2c 20 7a 48 64 72 2c 20 22 25  (zHdr), zHdr, "%
15d00 36 75 20 25 31 32 6c 6c 75 20 25 38 6c 6c 75 20  6u %12llu %8llu 
15d10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
15d20 3e 61 4f 70 5b 69 5d 2e 63 6e 74 2c 0a 20 20 20  >aOp[i].cnt,.   
15d30 20 20 20 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69          p->aOp[i
15d40 5d 2e 63 79 63 6c 65 73 2c 0a 20 20 20 20 20 20  ].cycles,.      
15d50 20 20 20 20 20 70 2d 3e 61 4f 70 5b 69 5d 2e 63       p->aOp[i].c
15d60 6e 74 3e 30 20 3f 20 70 2d 3e 61 4f 70 5b 69 5d  nt>0 ? p->aOp[i]
15d70 2e 63 79 63 6c 65 73 2f 70 2d 3e 61 4f 70 5b 69  .cycles/p->aOp[i
15d80 5d 2e 63 6e 74 20 3a 20 30 0a 20 20 20 20 20 20  ].cnt : 0.      
15d90 20 20 29 3b 0a 20 20 20 20 20 20 20 20 66 70 72    );.        fpr
15da0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
15db0 7a 48 64 72 29 3b 0a 20 20 20 20 20 20 20 20 73  zHdr);.        s
15dc0 71 6c 69 74 65 33 56 64 62 65 50 72 69 6e 74 4f  qlite3VdbePrintO
15dd0 70 28 6f 75 74 2c 20 69 2c 20 26 70 2d 3e 61 4f  p(out, i, &p->aO
15de0 70 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  p[i]);.      }. 
15df0 20 20 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29       fclose(out)
15e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  ;.    }.  }.#end
15e10 69 66 0a 20 20 70 2d 3e 69 43 75 72 72 65 6e 74  if.  p->iCurrent
15e20 54 69 6d 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 6d  Time = 0;.  p->m
15e30 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
15e40 43 5f 49 4e 49 54 3b 0a 20 20 72 65 74 75 72 6e  C_INIT;.  return
15e50 20 70 2d 3e 72 63 20 26 20 64 62 2d 3e 65 72 72   p->rc & db->err
15e60 4d 61 73 6b 3b 0a 7d 0a 20 0a 2f 2a 0a 2a 2a 20  Mask;.}. ./*.** 
15e70 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 64 65 6c  Clean up and del
15e80 65 74 65 20 61 20 56 44 42 45 20 61 66 74 65 72  ete a VDBE after
15e90 20 65 78 65 63 75 74 69 6f 6e 2e 20 20 52 65 74   execution.  Ret
15ea0 75 72 6e 20 61 6e 20 69 6e 74 65 67 65 72 20 77  urn an integer w
15eb0 68 69 63 68 20 69 73 0a 2a 2a 20 74 68 65 20 72  hich is.** the r
15ec0 65 73 75 6c 74 20 63 6f 64 65 2e 20 20 57 72 69  esult code.  Wri
15ed0 74 65 20 61 6e 79 20 65 72 72 6f 72 20 6d 65 73  te any error mes
15ee0 73 61 67 65 20 74 65 78 74 20 69 6e 74 6f 20 2a  sage text into *
15ef0 70 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  pzErrMsg..*/.int
15f00 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e 61   sqlite3VdbeFina
15f10 6c 69 7a 65 28 56 64 62 65 20 2a 70 29 7b 0a 20  lize(Vdbe *p){. 
15f20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15f30 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 6d 61  _OK;.  if( p->ma
15f40 67 69 63 3d 3d 56 44 42 45 5f 4d 41 47 49 43 5f  gic==VDBE_MAGIC_
15f50 52 55 4e 20 7c 7c 20 70 2d 3e 6d 61 67 69 63 3d  RUN || p->magic=
15f60 3d 56 44 42 45 5f 4d 41 47 49 43 5f 48 41 4c 54  =VDBE_MAGIC_HALT
15f70 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15f80 69 74 65 33 56 64 62 65 52 65 73 65 74 28 70 29  ite3VdbeReset(p)
15f90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 72  ;.    assert( (r
15fa0 63 20 26 20 70 2d 3e 64 62 2d 3e 65 72 72 4d 61  c & p->db->errMa
15fb0 73 6b 29 3d 3d 72 63 20 29 3b 0a 20 20 7d 0a 20  sk)==rc );.  }. 
15fc0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
15fd0 74 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  te(p);.  return 
15fe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  rc;.}../*.** If 
15ff0 70 61 72 61 6d 65 74 65 72 20 69 4f 70 20 69 73  parameter iOp is
16000 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
16010 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
16020 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 0a   destructor for.
16030 2a 2a 20 61 6c 6c 20 61 75 78 69 6c 69 61 72 79  ** all auxiliary
16040 20 64 61 74 61 20 70 6f 69 6e 74 65 72 73 20 63   data pointers c
16050 75 72 72 65 6e 74 6c 79 20 63 61 63 68 65 64 20  urrently cached 
16060 62 79 20 74 68 65 20 56 4d 20 70 61 73 73 65 64  by the VM passed
16070 20 61 73 0a 2a 2a 20 74 68 65 20 66 69 72 73 74   as.** the first
16080 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a   argument..**.**
16090 20 4f 72 2c 20 69 66 20 69 4f 70 20 69 73 20 67   Or, if iOp is g
160a0 72 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65  reater than or e
160b0 71 75 61 6c 20 74 6f 20 7a 65 72 6f 2c 20 74 68  qual to zero, th
160c0 65 6e 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  en the destructo
160d0 72 20 69 73 0a 2a 2a 20 6f 6e 6c 79 20 69 6e 76  r is.** only inv
160e0 6f 6b 65 64 20 66 6f 72 20 74 68 6f 73 65 20 61  oked for those a
160f0 75 78 69 6c 69 61 72 79 20 64 61 74 61 20 70 6f  uxiliary data po
16100 69 6e 74 65 72 73 20 63 72 65 61 74 65 64 20 62  inters created b
16110 79 20 74 68 65 20 75 73 65 72 20 0a 2a 2a 20 66  y the user .** f
16120 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 6b 65 64 20  unction invoked 
16130 62 79 20 74 68 65 20 4f 50 5f 46 75 6e 63 74 69  by the OP_Functi
16140 6f 6e 20 6f 70 63 6f 64 65 20 61 74 20 69 6e 73  on opcode at ins
16150 74 72 75 63 74 69 6f 6e 20 69 4f 70 20 6f 66 20  truction iOp of 
16160 0a 2a 2a 20 56 4d 20 70 56 64 62 65 2c 20 61 6e  .** VM pVdbe, an
16170 64 20 6f 6e 6c 79 20 74 68 65 6e 20 69 66 3a 0a  d only then if:.
16180 2a 2a 0a 2a 2a 20 20 20 20 2a 20 74 68 65 20 61  **.**    * the a
16190 73 73 6f 63 69 61 74 65 64 20 66 75 6e 63 74 69  ssociated functi
161a0 6f 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  on parameter is 
161b0 74 68 65 20 33 32 6e 64 20 6f 72 20 6c 61 74 65  the 32nd or late
161c0 72 20 28 63 6f 75 6e 74 69 6e 67 0a 2a 2a 20 20  r (counting.**  
161d0 20 20 20 20 66 72 6f 6d 20 6c 65 66 74 20 74 6f      from left to
161e0 20 72 69 67 68 74 29 2c 20 6f 72 0a 2a 2a 0a 2a   right), or.**.*
161f0 2a 20 20 20 20 2a 20 74 68 65 20 63 6f 72 72 65  *    * the corre
16200 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 6e 20  sponding bit in 
16210 61 72 67 75 6d 65 6e 74 20 6d 61 73 6b 20 69 73  argument mask is
16220 20 63 6c 65 61 72 20 28 77 68 65 72 65 20 74 68   clear (where th
16230 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 20 20 20  e first.**      
16240 66 75 6e 63 74 69 6f 6e 20 70 61 72 61 6d 65 74  function paramet
16250 65 72 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74  er corresponds t
16260 6f 20 62 69 74 20 30 20 65 74 63 2e 29 2e 0a 2a  o bit 0 etc.)..*
16270 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
16280 62 65 44 65 6c 65 74 65 41 75 78 44 61 74 61 28  beDeleteAuxData(
16290 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 75 78  sqlite3 *db, Aux
162a0 44 61 74 61 20 2a 2a 70 70 2c 20 69 6e 74 20 69  Data **pp, int i
162b0 4f 70 2c 20 69 6e 74 20 6d 61 73 6b 29 7b 0a 20  Op, int mask){. 
162c0 20 77 68 69 6c 65 28 20 2a 70 70 20 29 7b 0a 20   while( *pp ){. 
162d0 20 20 20 41 75 78 44 61 74 61 20 2a 70 41 75 78     AuxData *pAux
162e0 20 3d 20 2a 70 70 3b 0a 20 20 20 20 69 66 28 20   = *pp;.    if( 
162f0 28 69 4f 70 3c 30 29 0a 20 20 20 20 20 7c 7c 20  (iOp<0).     || 
16300 28 70 41 75 78 2d 3e 69 4f 70 3d 3d 69 4f 70 20  (pAux->iOp==iOp 
16310 26 26 20 28 70 41 75 78 2d 3e 69 41 72 67 3e 33  && (pAux->iArg>3
16320 31 20 7c 7c 20 21 28 6d 61 73 6b 20 26 20 4d 41  1 || !(mask & MA
16330 53 4b 42 49 54 33 32 28 70 41 75 78 2d 3e 69 41  SKBIT32(pAux->iA
16340 72 67 29 29 29 29 0a 20 20 20 20 29 7b 0a 20 20  rg)))).    ){.  
16350 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 41      testcase( pA
16360 75 78 2d 3e 69 41 72 67 3d 3d 33 31 20 29 3b 0a  ux->iArg==31 );.
16370 20 20 20 20 20 20 69 66 28 20 70 41 75 78 2d 3e        if( pAux->
16380 78 44 65 6c 65 74 65 20 29 7b 0a 20 20 20 20 20  xDelete ){.     
16390 20 20 20 70 41 75 78 2d 3e 78 44 65 6c 65 74 65     pAux->xDelete
163a0 28 70 41 75 78 2d 3e 70 41 75 78 29 3b 0a 20 20  (pAux->pAux);.  
163b0 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 70 20      }.      *pp 
163c0 3d 20 70 41 75 78 2d 3e 70 4e 65 78 74 3b 0a 20  = pAux->pNext;. 
163d0 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
163e0 65 65 28 64 62 2c 20 70 41 75 78 29 3b 0a 20 20  ee(db, pAux);.  
163f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
16400 70 3d 20 26 70 41 75 78 2d 3e 70 4e 65 78 74 3b  p= &pAux->pNext;
16410 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16420 0a 2a 2a 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  .** Free all mem
16430 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
16440 69 74 68 20 74 68 65 20 56 64 62 65 20 70 61 73  ith the Vdbe pas
16450 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
16460 64 20 61 72 67 75 6d 65 6e 74 2c 0a 2a 2a 20 65  d argument,.** e
16470 78 63 65 70 74 20 66 6f 72 20 6f 62 6a 65 63 74  xcept for object
16480 20 69 74 73 65 6c 66 2c 20 77 68 69 63 68 20 69   itself, which i
16490 73 20 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a  s preserved..**.
164a0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
164b0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
164c0 75 6e 63 74 69 6f 6e 20 61 6e 64 20 73 71 6c 69  unction and sqli
164d0 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 29 20  te3VdbeDelete() 
164e0 69 73 20 74 68 61 74 0a 2a 2a 20 56 64 62 65 44  is that.** VdbeD
164f0 65 6c 65 74 65 28 29 20 61 6c 73 6f 20 75 6e 6c  elete() also unl
16500 69 6e 6b 73 20 74 68 65 20 56 64 62 65 20 66 72  inks the Vdbe fr
16510 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 56  om the list of V
16520 4d 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  Ms associated wi
16530 74 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  th.** the databa
16540 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e  se connection an
16550 64 20 66 72 65 65 73 20 74 68 65 20 6f 62 6a 65  d frees the obje
16560 63 74 20 69 74 73 65 6c 66 2e 0a 2a 2f 0a 76 6f  ct itself..*/.vo
16570 69 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6c  id sqlite3VdbeCl
16580 65 61 72 4f 62 6a 65 63 74 28 73 71 6c 69 74 65  earObject(sqlite
16590 33 20 2a 64 62 2c 20 56 64 62 65 20 2a 70 29 7b  3 *db, Vdbe *p){
165a0 0a 20 20 53 75 62 50 72 6f 67 72 61 6d 20 2a 70  .  SubProgram *p
165b0 53 75 62 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69  Sub, *pNext;.  i
165c0 6e 74 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20  nt i;.  assert( 
165d0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 70 2d 3e 64  p->db==0 || p->d
165e0 62 3d 3d 64 62 20 29 3b 0a 20 20 72 65 6c 65 61  b==db );.  relea
165f0 73 65 4d 65 6d 41 72 72 61 79 28 70 2d 3e 61 56  seMemArray(p->aV
16600 61 72 2c 20 70 2d 3e 6e 56 61 72 29 3b 0a 20 20  ar, p->nVar);.  
16610 72 65 6c 65 61 73 65 4d 65 6d 41 72 72 61 79 28  releaseMemArray(
16620 70 2d 3e 61 43 6f 6c 4e 61 6d 65 2c 20 70 2d 3e  p->aColName, p->
16630 6e 52 65 73 43 6f 6c 75 6d 6e 2a 43 4f 4c 4e 41  nResColumn*COLNA
16640 4d 45 5f 4e 29 3b 0a 20 20 66 6f 72 28 70 53 75  ME_N);.  for(pSu
16650 62 3d 70 2d 3e 70 50 72 6f 67 72 61 6d 3b 20 70  b=p->pProgram; p
16660 53 75 62 3b 20 70 53 75 62 3d 70 4e 65 78 74 29  Sub; pSub=pNext)
16670 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 53  {.    pNext = pS
16680 75 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 76  ub->pNext;.    v
16690 64 62 65 46 72 65 65 4f 70 41 72 72 61 79 28 64  dbeFreeOpArray(d
166a0 62 2c 20 70 53 75 62 2d 3e 61 4f 70 2c 20 70 53  b, pSub->aOp, pS
166b0 75 62 2d 3e 6e 4f 70 29 3b 0a 20 20 20 20 73 71  ub->nOp);.    sq
166c0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
166d0 70 53 75 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  pSub);.  }.  for
166e0 28 69 3d 70 2d 3e 6e 7a 56 61 72 2d 31 3b 20 69  (i=p->nzVar-1; i
166f0 3e 3d 30 3b 20 69 2d 2d 29 20 73 71 6c 69 74 65  >=0; i--) sqlite
16700 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 61  3DbFree(db, p->a
16710 7a 56 61 72 5b 69 5d 29 3b 0a 20 20 73 71 6c 69  zVar[i]);.  sqli
16720 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 2d  te3DbFree(db, p-
16730 3e 61 7a 56 61 72 29 3b 0a 20 20 76 64 62 65 46  >azVar);.  vdbeF
16740 72 65 65 4f 70 41 72 72 61 79 28 64 62 2c 20 70  reeOpArray(db, p
16750 2d 3e 61 4f 70 2c 20 70 2d 3e 6e 4f 70 29 3b 0a  ->aOp, p->nOp);.
16760 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
16770 64 62 2c 20 70 2d 3e 61 43 6f 6c 4e 61 6d 65 29  db, p->aColName)
16780 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65  ;.  sqlite3DbFre
16790 65 28 64 62 2c 20 70 2d 3e 7a 53 71 6c 29 3b 0a  e(db, p->zSql);.
167a0 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
167b0 64 62 2c 20 70 2d 3e 70 46 72 65 65 29 3b 0a 23  db, p->pFree);.#
167c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
167d0 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
167e0 54 55 53 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  TUS.  for(i=0; i
167f0 3c 70 2d 3e 6e 53 63 61 6e 3b 20 69 2b 2b 29 7b  <p->nScan; i++){
16800 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
16810 65 65 28 64 62 2c 20 70 2d 3e 61 53 63 61 6e 5b  ee(db, p->aScan[
16820 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  i].zName);.  }. 
16830 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
16840 62 2c 20 70 2d 3e 61 53 63 61 6e 29 3b 0a 23 65  b, p->aScan);.#e
16850 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  ndif.}../*.** De
16860 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 56  lete an entire V
16870 44 42 45 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  DBE..*/.void sql
16880 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 28 56  ite3VdbeDelete(V
16890 64 62 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  dbe *p){.  sqlit
168a0 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20 4e  e3 *db;..  if( N
168b0 45 56 45 52 28 70 3d 3d 30 29 20 29 20 72 65 74  EVER(p==0) ) ret
168c0 75 72 6e 3b 0a 20 20 64 62 20 3d 20 70 2d 3e 64  urn;.  db = p->d
168d0 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  b;.  assert( sql
168e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
168f0 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
16900 73 71 6c 69 74 65 33 56 64 62 65 43 6c 65 61 72  sqlite3VdbeClear
16910 4f 62 6a 65 63 74 28 64 62 2c 20 70 29 3b 0a 20  Object(db, p);. 
16920 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20 29 7b   if( p->pPrev ){
16930 0a 20 20 20 20 70 2d 3e 70 50 72 65 76 2d 3e 70  .    p->pPrev->p
16940 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
16950 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
16960 73 65 72 74 28 20 64 62 2d 3e 70 56 64 62 65 3d  sert( db->pVdbe=
16970 3d 70 20 29 3b 0a 20 20 20 20 64 62 2d 3e 70 56  =p );.    db->pV
16980 64 62 65 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  dbe = p->pNext;.
16990 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65    }.  if( p->pNe
169a0 78 74 20 29 7b 0a 20 20 20 20 70 2d 3e 70 4e 65  xt ){.    p->pNe
169b0 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
169c0 50 72 65 76 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6d  Prev;.  }.  p->m
169d0 61 67 69 63 20 3d 20 56 44 42 45 5f 4d 41 47 49  agic = VDBE_MAGI
169e0 43 5f 44 45 41 44 3b 0a 20 20 70 2d 3e 64 62 20  C_DEAD;.  p->db 
169f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  = 0;.  sqlite3Db
16a00 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 7d 0a 0a  Free(db, p);.}..
16a10 2f 2a 0a 2a 2a 20 54 68 65 20 63 75 72 73 6f 72  /*.** The cursor
16a20 20 22 70 22 20 68 61 73 20 61 20 70 65 6e 64 69   "p" has a pendi
16a30 6e 67 20 73 65 65 6b 20 6f 70 65 72 61 74 69 6f  ng seek operatio
16a40 6e 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  n that has not y
16a50 65 74 20 62 65 65 6e 0a 2a 2a 20 63 61 72 72 69  et been.** carri
16a60 65 64 20 6f 75 74 2e 20 20 53 65 65 6b 20 74 68  ed out.  Seek th
16a70 65 20 63 75 72 73 6f 72 20 6e 6f 77 2e 20 20 49  e cursor now.  I
16a80 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16a90 73 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  s, return.** the
16aa0 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
16ab0 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
16ac0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 4e 4f  ic int SQLITE_NO
16ad0 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65 44 65 66  INLINE handleDef
16ae0 65 72 72 65 64 4d 6f 76 65 74 6f 28 56 64 62 65  erredMoveto(Vdbe
16af0 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
16b00 74 20 72 65 73 2c 20 72 63 3b 0a 23 69 66 64 65  t res, rc;.#ifde
16b10 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
16b20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
16b30 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
16b40 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74  .#endif.  assert
16b50 28 20 70 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76  ( p->deferredMov
16b60 65 74 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28  eto );.  assert(
16b70 20 70 2d 3e 69 73 54 61 62 6c 65 20 29 3b 0a 20   p->isTable );. 
16b80 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43 75 72   assert( p->eCur
16b90 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
16ba0 52 45 45 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  REE );.  rc = sq
16bb0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
16bc0 55 6e 70 61 63 6b 65 64 28 70 2d 3e 75 63 2e 70  Unpacked(p->uc.p
16bd0 43 75 72 73 6f 72 2c 20 30 2c 20 70 2d 3e 6d 6f  Cursor, 0, p->mo
16be0 76 65 74 6f 54 61 72 67 65 74 2c 20 30 2c 20 26  vetoTarget, 0, &
16bf0 72 65 73 29 3b 0a 20 20 69 66 28 20 72 63 20 29  res);.  if( rc )
16c00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 69 66   return rc;.  if
16c10 28 20 72 65 73 21 3d 30 20 29 20 72 65 74 75 72  ( res!=0 ) retur
16c20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
16c30 5f 42 4b 50 54 3b 0a 23 69 66 64 65 66 20 53 51  _BKPT;.#ifdef SQ
16c40 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71 6c 69  LITE_TEST.  sqli
16c50 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  te3_search_count
16c60 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 2d 3e  ++;.#endif.  p->
16c70 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f 20 3d  deferredMoveto =
16c80 20 30 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53 74   0;.  p->cacheSt
16c90 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54 41  atus = CACHE_STA
16ca0 4c 45 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  LE;.  return SQL
16cb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
16cc0 20 53 6f 6d 65 74 68 69 6e 67 20 68 61 73 20 6d   Something has m
16cd0 6f 76 65 64 20 63 75 72 73 6f 72 20 22 70 22 20  oved cursor "p" 
16ce0 6f 75 74 20 6f 66 20 70 6c 61 63 65 2e 20 20 4d  out of place.  M
16cf0 61 79 62 65 20 74 68 65 20 72 6f 77 20 69 74 20  aybe the row it 
16d00 77 61 73 0a 2a 2a 20 70 6f 69 6e 74 65 64 20 74  was.** pointed t
16d10 6f 20 77 61 73 20 64 65 6c 65 74 65 64 20 6f 75  o was deleted ou
16d20 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 69 74 2e  t from under it.
16d30 20 20 4f 72 20 6d 61 79 62 65 20 74 68 65 20 62    Or maybe the b
16d40 74 72 65 65 20 77 61 73 0a 2a 2a 20 72 65 62 61  tree was.** reba
16d50 6c 61 6e 63 65 64 2e 20 20 57 68 61 74 65 76 65  lanced.  Whateve
16d60 72 20 74 68 65 20 63 61 75 73 65 2c 20 74 72 79  r the cause, try
16d70 20 74 6f 20 72 65 73 74 6f 72 65 20 22 70 22 20   to restore "p" 
16d80 74 6f 20 74 68 65 20 70 6c 61 63 65 20 69 74 0a  to the place it.
16d90 2a 2a 20 69 73 20 73 75 70 70 6f 73 65 64 20 74  ** is supposed t
16da0 6f 20 62 65 20 70 6f 69 6e 74 69 6e 67 2e 20 20  o be pointing.  
16db0 49 66 20 74 68 65 20 72 6f 77 20 77 61 73 20 64  If the row was d
16dc0 65 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20  eleted out from 
16dd0 75 6e 64 65 72 20 74 68 65 0a 2a 2a 20 63 75 72  under the.** cur
16de0 73 6f 72 2c 20 73 65 74 20 74 68 65 20 63 75 72  sor, set the cur
16df0 73 6f 72 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  sor to point to 
16e00 61 20 4e 55 4c 4c 20 72 6f 77 2e 0a 2a 2f 0a 73  a NULL row..*/.s
16e10 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
16e20 5f 4e 4f 49 4e 4c 49 4e 45 20 68 61 6e 64 6c 65  _NOINLINE handle
16e30 4d 6f 76 65 64 43 75 72 73 6f 72 28 56 64 62 65  MovedCursor(Vdbe
16e40 43 75 72 73 6f 72 20 2a 70 29 7b 0a 20 20 69 6e  Cursor *p){.  in
16e50 74 20 69 73 44 69 66 66 65 72 65 6e 74 52 6f 77  t isDifferentRow
16e60 2c 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  , rc;.  assert( 
16e70 70 2d 3e 65 43 75 72 54 79 70 65 3d 3d 43 55 52  p->eCurType==CUR
16e80 54 59 50 45 5f 42 54 52 45 45 20 29 3b 0a 20 20  TYPE_BTREE );.  
16e90 61 73 73 65 72 74 28 20 70 2d 3e 75 63 2e 70 43  assert( p->uc.pC
16ea0 75 72 73 6f 72 21 3d 30 20 29 3b 0a 20 20 61 73  ursor!=0 );.  as
16eb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
16ec0 65 65 43 75 72 73 6f 72 48 61 73 4d 6f 76 65 64  eeCursorHasMoved
16ed0 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f 72 29 20  (p->uc.pCursor) 
16ee0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
16ef0 33 42 74 72 65 65 43 75 72 73 6f 72 52 65 73 74  3BtreeCursorRest
16f00 6f 72 65 28 70 2d 3e 75 63 2e 70 43 75 72 73 6f  ore(p->uc.pCurso
16f10 72 2c 20 26 69 73 44 69 66 66 65 72 65 6e 74 52  r, &isDifferentR
16f20 6f 77 29 3b 0a 20 20 70 2d 3e 63 61 63 68 65 53  ow);.  p->cacheS
16f30 74 61 74 75 73 20 3d 20 43 41 43 48 45 5f 53 54  tatus = CACHE_ST
16f40 41 4c 45 3b 0a 20 20 69 66 28 20 69 73 44 69 66  ALE;.  if( isDif
16f50 66 65 72 65 6e 74 52 6f 77 20 29 20 70 2d 3e 6e  ferentRow ) p->n
16f60 75 6c 6c 52 6f 77 20 3d 20 31 3b 0a 20 20 72 65  ullRow = 1;.  re
16f70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16f80 2a 20 43 68 65 63 6b 20 74 6f 20 65 6e 73 75 72  * Check to ensur
16f90 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
16fa0 72 20 69 73 20 76 61 6c 69 64 2e 20 20 52 65 73  r is valid.  Res
16fb0 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f 72 0a  tore the cursor.
16fc0 2a 2a 20 69 66 20 6e 65 65 64 20 62 65 2e 20 20  ** if need be.  
16fd0 52 65 74 75 72 6e 20 61 6e 79 20 49 2f 4f 20 65  Return any I/O e
16fe0 72 72 6f 72 20 66 72 6f 6d 20 74 68 65 20 72 65  rror from the re
16ff0 73 74 6f 72 65 20 6f 70 65 72 61 74 69 6f 6e 2e  store operation.
17000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56  .*/.int sqlite3V
17010 64 62 65 43 75 72 73 6f 72 52 65 73 74 6f 72 65  dbeCursorRestore
17020 28 56 64 62 65 43 75 72 73 6f 72 20 2a 70 29 7b  (VdbeCursor *p){
17030 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 43  .  assert( p->eC
17040 75 72 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f  urType==CURTYPE_
17050 42 54 52 45 45 20 29 3b 0a 20 20 69 66 28 20 73  BTREE );.  if( 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 7b 0a 20 20 20 20  pCursor) ){.    
17090 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
170a0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 7d  edCursor(p);.  }
170b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
170c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  _OK;.}../*.** Ma
170d0 6b 65 20 73 75 72 65 20 74 68 65 20 63 75 72 73  ke sure the curs
170e0 6f 72 20 70 20 69 73 20 72 65 61 64 79 20 74 6f  or p is ready to
170f0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
17100 68 65 20 72 6f 77 20 74 6f 20 77 68 69 63 68 20  he row to which 
17110 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20 70  it.** was last p
17120 6f 73 69 74 69 6f 6e 65 64 2e 20 20 52 65 74 75  ositioned.  Retu
17130 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
17140 20 69 66 20 61 6e 20 4f 4f 4d 20 66 61 75 6c 74   if an OOM fault
17150 20 6f 72 20 49 2f 4f 20 65 72 72 6f 72 0a 2a 2a   or I/O error.**
17160 20 70 72 65 76 65 6e 74 73 20 75 73 20 66 72 6f   prevents us fro
17170 6d 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 74 68  m positioning th
17180 65 20 63 75 72 73 6f 72 20 74 6f 20 69 74 73 20  e cursor to its 
17190 63 6f 72 72 65 63 74 20 70 6f 73 69 74 69 6f 6e  correct position
171a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 4d 6f 76  ..**.** If a Mov
171b0 65 54 6f 20 6f 70 65 72 61 74 69 6f 6e 20 69 73  eTo operation is
171c0 20 70 65 6e 64 69 6e 67 20 6f 6e 20 74 68 65 20   pending on the 
171d0 67 69 76 65 6e 20 63 75 72 73 6f 72 2c 20 74 68  given cursor, th
171e0 65 6e 20 64 6f 20 74 68 61 74 0a 2a 2a 20 4d 6f  en do that.** Mo
171f0 76 65 54 6f 20 6e 6f 77 2e 20 20 49 66 20 6e 6f  veTo now.  If no
17200 20 6d 6f 76 65 20 69 73 20 70 65 6e 64 69 6e 67   move is pending
17210 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
17220 66 20 74 68 65 20 72 6f 77 20 68 61 73 20 62 65  f the row has be
17230 65 6e 0a 2a 2a 20 64 65 6c 65 74 65 64 20 6f 75  en.** deleted ou
17240 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65  t from under the
17250 20 63 75 72 73 6f 72 20 61 6e 64 20 69 66 20 69   cursor and if i
17260 74 20 68 61 73 2c 20 6d 61 72 6b 20 74 68 65 20  t has, mark the 
17270 72 6f 77 20 61 73 0a 2a 2a 20 61 20 4e 55 4c 4c  row as.** a NULL
17280 20 72 6f 77 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   row..**.** If t
17290 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 72  he cursor is alr
172a0 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f  eady pointing to
172b0 20 74 68 65 20 63 6f 72 72 65 63 74 20 72 6f 77   the correct row
172c0 20 61 6e 64 20 74 68 61 74 20 72 6f 77 20 68 61   and that row ha
172d0 73 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 64 65  s.** not been de
172e0 6c 65 74 65 64 20 6f 75 74 20 66 72 6f 6d 20 75  leted out from u
172f0 6e 64 65 72 20 74 68 65 20 63 75 72 73 6f 72 2c  nder the cursor,
17300 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
17310 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
17320 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64 62  /.int sqlite3Vdb
17330 65 43 75 72 73 6f 72 4d 6f 76 65 74 6f 28 56 64  eCursorMoveto(Vd
17340 62 65 43 75 72 73 6f 72 20 2a 2a 70 70 2c 20 69  beCursor **pp, i
17350 6e 74 20 2a 70 69 43 6f 6c 29 7b 0a 20 20 56 64  nt *piCol){.  Vd
17360 62 65 43 75 72 73 6f 72 20 2a 70 20 3d 20 2a 70  beCursor *p = *p
17370 70 3b 0a 20 20 69 66 28 20 70 2d 3e 65 43 75 72  p;.  if( p->eCur
17380 54 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54  Type==CURTYPE_BT
17390 52 45 45 20 29 7b 0a 20 20 20 20 69 66 28 20 70  REE ){.    if( p
173a0 2d 3e 64 65 66 65 72 72 65 64 4d 6f 76 65 74 6f  ->deferredMoveto
173b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4d   ){.      int iM
173c0 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ap;.      if( p-
173d0 3e 61 41 6c 74 4d 61 70 20 26 26 20 28 69 4d 61  >aAltMap && (iMa
173e0 70 20 3d 20 70 2d 3e 61 41 6c 74 4d 61 70 5b 31  p = p->aAltMap[1
173f0 2b 2a 70 69 43 6f 6c 5d 29 3e 30 20 29 7b 0a 20  +*piCol])>0 ){. 
17400 20 20 20 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e         *pp = p->
17410 70 41 6c 74 43 75 72 73 6f 72 3b 0a 20 20 20 20  pAltCursor;.    
17420 20 20 20 20 2a 70 69 43 6f 6c 20 3d 20 69 4d 61      *piCol = iMa
17430 70 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  p - 1;.        r
17440 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17450 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
17460 65 74 75 72 6e 20 68 61 6e 64 6c 65 44 65 66 65  eturn handleDefe
17470 72 72 65 64 4d 6f 76 65 74 6f 28 70 29 3b 0a 20  rredMoveto(p);. 
17480 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c     }.    if( sql
17490 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
174a0 61 73 4d 6f 76 65 64 28 70 2d 3e 75 63 2e 70 43  asMoved(p->uc.pC
174b0 75 72 73 6f 72 29 20 29 7b 0a 20 20 20 20 20 20  ursor) ){.      
174c0 72 65 74 75 72 6e 20 68 61 6e 64 6c 65 4d 6f 76  return handleMov
174d0 65 64 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  edCursor(p);.   
174e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
174f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17500 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
17510 67 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a  g functions:.**.
17520 2a 2a 20 73 71 6c 69 74 65 33 56 64 62 65 53 65  ** sqlite3VdbeSe
17530 72 69 61 6c 54 79 70 65 28 29 0a 2a 2a 20 73 71  rialType().** sq
17540 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54  lite3VdbeSerialT
17550 79 70 65 4c 65 6e 28 29 0a 2a 2a 20 73 71 6c 69  ypeLen().** sqli
17560 74 65 33 56 64 62 65 53 65 72 69 61 6c 4c 65 6e  te3VdbeSerialLen
17570 28 29 0a 2a 2a 20 73 71 6c 69 74 65 33 56 64 62  ().** sqlite3Vdb
17580 65 53 65 72 69 61 6c 50 75 74 28 29 0a 2a 2a 20  eSerialPut().** 
17590 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
175a0 6c 47 65 74 28 29 0a 2a 2a 0a 2a 2a 20 65 6e 63  lGet().**.** enc
175b0 61 70 73 75 6c 61 74 65 20 74 68 65 20 63 6f 64  apsulate the cod
175c0 65 20 74 68 61 74 20 73 65 72 69 61 6c 69 7a 65  e that serialize
175d0 73 20 76 61 6c 75 65 73 20 66 6f 72 20 73 74 6f  s values for sto
175e0 72 61 67 65 20 69 6e 20 53 51 4c 69 74 65 0a 2a  rage in SQLite.*
175f0 2a 20 64 61 74 61 20 61 6e 64 20 69 6e 64 65 78  * data and index
17600 20 72 65 63 6f 72 64 73 2e 20 45 61 63 68 20 73   records. Each s
17610 65 72 69 61 6c 69 7a 65 64 20 76 61 6c 75 65 20  erialized value 
17620 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 0a 2a 2a  consists of a.**
17630 20 27 73 65 72 69 61 6c 2d 74 79 70 65 27 20 61   'serial-type' a
17640 6e 64 20 61 20 62 6c 6f 62 20 6f 66 20 64 61 74  nd a blob of dat
17650 61 2e 20 54 68 65 20 73 65 72 69 61 6c 20 74 79  a. The serial ty
17660 70 65 20 69 73 20 61 6e 20 38 2d 62 79 74 65 20  pe is an 8-byte 
17670 75 6e 73 69 67 6e 65 64 0a 2a 2a 20 69 6e 74 65  unsigned.** inte
17680 67 65 72 2c 20 73 74 6f 72 65 64 20 61 73 20 61  ger, stored as a
17690 20 76 61 72 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49   varint..**.** I
176a0 6e 20 61 6e 20 53 51 4c 69 74 65 20 69 6e 64 65  n an SQLite inde
176b0 78 20 72 65 63 6f 72 64 2c 20 74 68 65 20 73 65  x record, the se
176c0 72 69 61 6c 20 74 79 70 65 20 69 73 20 73 74 6f  rial type is sto
176d0 72 65 64 20 64 69 72 65 63 74 6c 79 20 62 65 66  red directly bef
176e0 6f 72 65 0a 2a 2a 20 74 68 65 20 62 6c 6f 62 20  ore.** the blob 
176f0 6f 66 20 64 61 74 61 20 74 68 61 74 20 69 74 20  of data that it 
17700 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 2e 20  corresponds to. 
17710 49 6e 20 61 20 74 61 62 6c 65 20 72 65 63 6f 72  In a table recor
17720 64 2c 20 61 6c 6c 20 73 65 72 69 61 6c 0a 2a 2a  d, all serial.**
17730 20 74 79 70 65 73 20 61 72 65 20 73 74 6f 72 65   types are store
17740 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
17750 66 20 74 68 65 20 72 65 63 6f 72 64 2c 20 61 6e  f the record, an
17760 64 20 74 68 65 20 62 6c 6f 62 73 20 6f 66 20 64  d the blobs of d
17770 61 74 61 20 61 74 0a 2a 2a 20 74 68 65 20 65 6e  ata at.** the en
17780 64 2e 20 48 65 6e 63 65 20 74 68 65 73 65 20 66  d. Hence these f
17790 75 6e 63 74 69 6f 6e 73 20 61 6c 6c 6f 77 20 74  unctions allow t
177a0 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 68 61 6e  he caller to han
177b0 64 6c 65 20 74 68 65 0a 2a 2a 20 73 65 72 69 61  dle the.** seria
177c0 6c 2d 74 79 70 65 20 61 6e 64 20 64 61 74 61 20  l-type and data 
177d0 62 6c 6f 62 20 73 65 70 61 72 61 74 65 6c 79 2e  blob separately.
177e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  .**.** The follo
177f0 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
17800 69 62 65 73 20 74 68 65 20 76 61 72 69 6f 75 73  ibes the various
17810 20 73 74 6f 72 61 67 65 20 63 6c 61 73 73 65 73   storage classes
17820 20 66 6f 72 20 64 61 74 61 3a 0a 2a 2a 0a 2a 2a   for data:.**.**
17830 20 20 20 73 65 72 69 61 6c 20 74 79 70 65 20 20     serial type  
17840 20 20 20 20 20 20 62 79 74 65 73 20 6f 66 20 64        bytes of d
17850 61 74 61 20 20 20 20 20 20 74 79 70 65 0a 2a 2a  ata      type.**
17860 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
17870 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  -     ----------
17880 2d 2d 2d 2d 2d 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  -----    -------
17890 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 20 20  --------.**     
178a0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
178b0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
178c0 20 20 20 20 4e 55 4c 4c 0a 2a 2a 20 20 20 20 20      NULL.**     
178d0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
178e0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
178f0 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67      signed integ
17900 65 72 0a 2a 2a 20 20 20 20 20 20 32 20 20 20 20  er.**      2    
17910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17920 20 32 20 20 20 20 20 20 20 20 20 20 20 20 73 69   2            si
17930 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
17940 20 20 20 20 20 33 20 20 20 20 20 20 20 20 20 20       3          
17950 20 20 20 20 20 20 20 20 20 20 20 33 20 20 20 20             3    
17960 20 20 20 20 20 20 20 20 73 69 67 6e 65 64 20 69          signed i
17970 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 34  nteger.**      4
17980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17990 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
179a0 20 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72    signed integer
179b0 0a 2a 2a 20 20 20 20 20 20 35 20 20 20 20 20 20  .**      5      
179c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 36                 6
179d0 20 20 20 20 20 20 20 20 20 20 20 20 73 69 67 6e              sign
179e0 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20  ed integer.**   
179f0 20 20 20 36 20 20 20 20 20 20 20 20 20 20 20 20     6            
17a00 20 20 20 20 20 20 20 20 20 38 20 20 20 20 20 20           8      
17a10 20 20 20 20 20 20 73 69 67 6e 65 64 20 69 6e 74        signed int
17a20 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 37 20 20  eger.**      7  
17a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a40 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17a50 49 45 45 45 20 66 6c 6f 61 74 0a 2a 2a 20 20 20  IEEE float.**   
17a60 20 20 20 38 20 20 20 20 20 20 20 20 20 20 20 20     8            
17a70 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
17a80 20 20 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f        Integer co
17a90 6e 73 74 61 6e 74 20 30 0a 2a 2a 20 20 20 20 20  nstant 0.**     
17aa0 20 39 20 20 20 20 20 20 20 20 20 20 20 20 20 20   9              
17ab0 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
17ac0 20 20 20 20 49 6e 74 65 67 65 72 20 63 6f 6e 73      Integer cons
17ad0 74 61 6e 74 20 31 0a 2a 2a 20 20 20 20 20 31 30  tant 1.**     10
17ae0 2c 31 31 20 20 20 20 20 20 20 20 20 20 20 20 20  ,11             
17af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b00 20 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 65    reserved for e
17b10 78 70 61 6e 73 69 6f 6e 0a 2a 2a 20 20 20 20 4e  xpansion.**    N
17b20 3e 3d 31 32 20 61 6e 64 20 65 76 65 6e 20 20 20  >=12 and even   
17b30 20 20 20 20 28 4e 2d 31 32 29 2f 32 20 20 20 20      (N-12)/2    
17b40 20 20 20 20 42 4c 4f 42 0a 2a 2a 20 20 20 20 4e      BLOB.**    N
17b50 3e 3d 31 33 20 61 6e 64 20 6f 64 64 20 20 20 20  >=13 and odd    
17b60 20 20 20 20 28 4e 2d 31 33 29 2f 32 20 20 20 20      (N-13)/2    
17b70 20 20 20 20 74 65 78 74 0a 2a 2a 0a 2a 2a 20 54      text.**.** T
17b80 68 65 20 38 20 61 6e 64 20 39 20 74 79 70 65 73  he 8 and 9 types
17b90 20 77 65 72 65 20 61 64 64 65 64 20 69 6e 20 33   were added in 3
17ba0 2e 33 2e 30 2c 20 66 69 6c 65 20 66 6f 72 6d 61  .3.0, file forma
17bb0 74 20 34 2e 20 20 50 72 69 6f 72 20 76 65 72 73  t 4.  Prior vers
17bc0 69 6f 6e 73 0a 2a 2a 20 6f 66 20 53 51 4c 69 74  ions.** of SQLit
17bd0 65 20 77 69 6c 6c 20 6e 6f 74 20 75 6e 64 65 72  e will not under
17be0 73 74 61 6e 64 20 74 68 6f 73 65 20 73 65 72 69  stand those seri
17bf0 61 6c 20 74 79 70 65 73 2e 0a 2a 2f 0a 0a 2f 2a  al types..*/../*
17c00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
17c10 65 72 69 61 6c 2d 74 79 70 65 20 66 6f 72 20 74  erial-type for t
17c20 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  he value stored 
17c30 69 6e 20 70 4d 65 6d 2e 0a 2a 2f 0a 75 33 32 20  in pMem..*/.u32 
17c40 73 71 6c 69 74 65 33 56 64 62 65 53 65 72 69 61  sqlite3VdbeSeria
17c50 6c 54 79 70 65 28 4d 65 6d 20 2a 70 4d 65 6d 2c  lType(Mem *pMem,
17c60 20 69 6e 74 20 66 69 6c 65 5f 66 6f 72 6d 61 74   int file_format
17c70 2c 20 75 33 32 20 2a 70 4c 65 6e 29 7b 0a 20 20  , u32 *pLen){.  
17c80 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 4d 65 6d  int flags = pMem
17c90 2d 3e 66 6c 61 67 73 3b 0a 20 20 75 33 32 20 6e  ->flags;.  u32 n
17ca0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65  ;..  assert( pLe
17cb0 6e 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 66 6c  n!=0 );.  if( fl
17cc0 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
17cd0 20 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20      *pLen = 0;. 
17ce0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
17cf0 0a 20 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d  .  if( flags&MEM
17d00 5f 49 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 46  _Int ){.    /* F
17d10 69 67 75 72 65 20 6f 75 74 20 77 68 65 74 68 65  igure out whethe
17d20 72 20 74 6f 20 75 73 65 20 31 2c 20 32 2c 20 34  r to use 1, 2, 4
17d30 2c 20 36 20 6f 72 20 38 20 62 79 74 65 73 2e 20  , 6 or 8 bytes. 
17d40 2a 2f 0a 23 20 20 20 64 65 66 69 6e 65 20 4d 41  */.#   define MA
17d50 58 5f 36 42 59 54 45 20 28 28 28 28 69 36 34 29  X_6BYTE ((((i64)
17d60 30 78 30 30 30 30 38 30 30 30 29 3c 3c 33 32 29  0x00008000)<<32)
17d70 2d 31 29 0a 20 20 20 20 69 36 34 20 69 20 3d 20  -1).    i64 i = 
17d80 70 4d 65 6d 2d 3e 75 2e 69 3b 0a 20 20 20 20 75  pMem->u.i;.    u
17d90 36 34 20 75 3b 0a 20 20 20 20 69 66 28 20 69 3c  64 u;.    if( i<
17da0 30 20 29 7b 0a 20 20 20 20 20 20 75 20 3d 20 7e  0 ){.      u = ~
17db0 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
17dc0 20 20 20 20 75 20 3d 20 69 3b 0a 20 20 20 20 7d      u = i;.    }
17dd0 0a 20 20 20 20 69 66 28 20 75 3c 3d 31 32 37 20  .    if( u<=127 
17de0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 26  ){.      if( (i&
17df0 31 29 3d 3d 69 20 26 26 20 66 69 6c 65 5f 66 6f  1)==i && file_fo
17e00 72 6d 61 74 3e 3d 34 20 29 7b 0a 20 20 20 20 20  rmat>=4 ){.     
17e10 20 20 20 2a 70 4c 65 6e 20 3d 20 30 3b 0a 20 20     *pLen = 0;.  
17e20 20 20 20 20 20 20 72 65 74 75 72 6e 20 38 2b 28        return 8+(
17e30 75 33 32 29 75 3b 0a 20 20 20 20 20 20 7d 65 6c  u32)u;.      }el
17e40 73 65 7b 0a 20 20 20 20 20 20 20 20 2a 70 4c 65  se{.        *pLe
17e50 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  n = 1;.        r
17e60 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
17e70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 75  .    }.    if( u
17e80 3c 3d 33 32 37 36 37 20 29 7b 20 2a 70 4c 65 6e  <=32767 ){ *pLen
17e90 20 3d 20 32 3b 20 72 65 74 75 72 6e 20 32 3b 20   = 2; return 2; 
17ea0 7d 0a 20 20 20 20 69 66 28 20 75 3c 3d 38 33 38  }.    if( u<=838
17eb0 38 36 30 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  8607 ){ *pLen = 
17ec0 33 3b 20 72 65 74 75 72 6e 20 33 3b 20 7d 0a 20  3; return 3; }. 
17ed0 20 20 20 69 66 28 20 75 3c 3d 32 31 34 37 34 38     if( u<=214748
17ee0 33 36 34 37 20 29 7b 20 2a 70 4c 65 6e 20 3d 20  3647 ){ *pLen = 
17ef0 34 3b 20 72 65 74 75 72 6e 20 34 3b 20 7d 0a 20  4; return 4; }. 
17f00 20 20 20 69 66 28 20 75 3c 3d 4d 41 58 5f 36 42     if( u<=MAX_6B
17f10 59 54 45 20 29 7b 20 2a 70 4c 65 6e 20 3d 20 36  YTE ){ *pLen = 6
17f20 3b 20 72 65 74 75 72 6e 20 35 3b 20 7d 0a 20 20  ; return 5; }.  
17f30 20 20 2a 70 4c 65 6e 20 3d 20 38 3b 0a 20 20 20    *pLen = 8;.   
17f40 20 72 65 74 75 72 6e 20 36 3b 0a 20 20 7d 0a 20   return 6;.  }. 
17f50 20 69 66 28 20 66 6c 61 67 73 26 4d 45 4d 5f 52   if( flags&MEM_R
17f60 65 61 6c 20 29 7b 0a 20 20 20 20 2a 70 4c 65 6e  eal ){.    *pLen
17f70 20 3d 20 38 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 8;.    return
17f80 20 37 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   7;.  }.  assert
17f90 28 20 70 4d 65 6d 2d 3e 64 62 2d 3e 6d 61 6c 6c  ( pMem->db->mall
17fa0 6f 63 46 61 69 6c 65 64 20 7c 7c 20 66 6c 61 67  ocFailed || flag
17fb0 73 26 28 4d 45 4d 5f 53 74 72 7c 4d 45 4d 5f 42  s&(MEM_Str|MEM_B
17fc0 6c 6f 62 29 20 29 3b 0a 20 20 61 73 73 65 72 74  lob) );.  assert
17fd0 28 20 70 4d 65 6d 2d 3e 6e 3e 3d 30 20 29 3b 0a  ( pMem->n>=0 );.
17fe0 20 20 6e 20 3d 20 28 75 33 32 29 70 4d 65 6d 2d    n = (u32)pMem-
17ff0 3e 6e 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  >n;.  if( flags 
18000 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
18010 20 20 6e 20 2b 3d 20 70 4d 65 6d 2d 3e 75 2e 6e    n += pMem->u.n
18020 5a 65 72 6f 3b 0a 20 20 7d 0a 20 20 2a 70 4c 65  Zero;.  }.  *pLe
18030 6e 20 3d 20 6e 3b 0a 20 20 72 65 74 75 72 6e 20  n = n;.  return 
18040 28 28 6e 2a 32 29 20 2b 20 31 32 20 2b 20 28 28  ((n*2) + 12 + ((
18050 66 6c 61 67 73 26 4d 45 4d 5f 53 74 72 29 21 3d  flags&MEM_Str)!=
18060 30 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  0));.}../*.** Th
18070 65 20 73 69 7a 65 73 20 66 6f 72 20 73 65 72 69  e sizes for seri
18080 61 6c 20 74 79 70 65 73 20 6c 65 73 73 20 74 68  al types less th
18090 61 6e 20 31 32 38 0a 2a 2f 0a 73 74 61 74 69 63  an 128.*/.static
180a0 20 63 6f 6e 73 74 20 75 38 20 73 71 6c 69 74 65   const u8 sqlite
180b0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
180c0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ] = {.        /*
180d0 20 20 30 20 20 20 31 20 20 20 32 20 20 20 33 20    0   1   2   3 
180e0 20 20 34 20 20 20 35 20 20 20 36 20 20 20 37 20    4   5   6   7 
180f0 20 20 38 20 20 20 39 20 2a 2f 20 20 20 0a 2f 2a    8   9 */   ./*
18100 20 20 20 30 20 2a 2f 20 20 20 30 2c 20 20 31 2c     0 */   0,  1,
18110 20 20 32 2c 20 20 33 2c 20 20 34 2c 20 20 36 2c    2,  3,  4,  6,
18120 20 20 38 2c 20 20 38 2c 20 20 30 2c 20 20 30 2c    8,  8,  0,  0,
18130 0a 2f 2a 20 20 31 30 20 2a 2f 20 20 20 30 2c 20  ./*  10 */   0, 
18140 20 30 2c 20 20 30 2c 20 20 30 2c 20 20 31 2c 20   0,  0,  0,  1, 
18150 20 31 2c 20 20 32 2c 20 20 32 2c 20 20 33 2c 20   1,  2,  2,  3, 
18160 20 33 2c 0a 2f 2a 20 20 32 30 20 2a 2f 20 20 20   3,./*  20 */   
18170 34 2c 20 20 34 2c 20 20 35 2c 20 20 35 2c 20 20  4,  4,  5,  5,  
18180 36 2c 20 20 36 2c 20 20 37 2c 20 20 37 2c 20 20  6,  6,  7,  7,  
18190 38 2c 20 20 38 2c 0a 2f 2a 20 20 33 30 20 2a 2f  8,  8,./*  30 */
181a0 20 20 20 39 2c 20 20 39 2c 20 31 30 2c 20 31 30     9,  9, 10, 10
181b0 2c 20 31 31 2c 20 31 31 2c 20 31 32 2c 20 31 32  , 11, 11, 12, 12
181c0 2c 20 31 33 2c 20 31 33 2c 0a 2f 2a 20 20 34 30  , 13, 13,./*  40
181d0 20 2a 2f 20 20 31 34 2c 20 31 34 2c 20 31 35 2c   */  14, 14, 15,
181e0 20 31 35 2c 20 31 36 2c 20 31 36 2c 20 31 37 2c   15, 16, 16, 17,
181f0 20 31 37 2c 20 31 38 2c 20 31 38 2c 0a 2f 2a 20   17, 18, 18,./* 
18200 20 35 30 20 2a 2f 20 20 31 39 2c 20 31 39 2c 20   50 */  19, 19, 
18210 32 30 2c 20 32 30 2c 20 32 31 2c 20 32 31 2c 20  20, 20, 21, 21, 
18220 32 32 2c 20 32 32 2c 20 32 33 2c 20 32 33 2c 0a  22, 22, 23, 23,.
18230 2f 2a 20 20 36 30 20 2a 2f 20 20 32 34 2c 20 32  /*  60 */  24, 2
18240 34 2c 20 32 35 2c 20 32 35 2c 20 32 36 2c 20 32  4, 25, 25, 26, 2
18250 36 2c 20 32 37 2c 20 32 37 2c 20 32 38 2c 20 32  6, 27, 27, 28, 2
18260 38 2c 0a 2f 2a 20 20 37 30 20 2a 2f 20 20 32 39  8,./*  70 */  29
18270 2c 20 32 39 2c 20 33 30 2c 20 33 30 2c 20 33 31  , 29, 30, 30, 31
18280 2c 20 33 31 2c 20 33 32 2c 20 33 32 2c 20 33 33  , 31, 32, 32, 33
18290 2c 20 33 33 2c 0a 2f 2a 20 20 38 30 20 2a 2f 20  , 33,./*  80 */ 
182a0 20 33 34 2c 20 33 34 2c 20 33 35 2c 20 33 35 2c   34, 34, 35, 35,
182b0 20 33 36 2c 20 33 36 2c 20 33 37 2c 20 33 37 2c   36, 36, 37, 37,
182c0 20 33 38 2c 20 33 38 2c 0a 2f 2a 20 20 39 30 20   38, 38,./*  90 
182d0 2a 2f 20 20 33 39 2c 20 33 39 2c 20 34 30 2c 20  */  39, 39, 40, 
182e0 34 30 2c 20 34 31 2c 20 34 31 2c 20 34 32 2c 20  40, 41, 41, 42, 
182f0 34 32 2c 20 34 33 2c 20 34 33 2c 0a 2f 2a 20 31  42, 43, 43,./* 1
18300 30 30 20 2a 2f 20 20 34 34 2c 20 34 34 2c 20 34  00 */  44, 44, 4
18310 35 2c 20 34 35 2c 20 34 36 2c 20 34 36 2c 20 34  5, 45, 46, 46, 4
18320 37 2c 20 34 37 2c 20 34 38 2c 20 34 38 2c 0a 2f  7, 47, 48, 48,./
18330 2a 20 31 31 30 20 2a 2f 20 20 34 39 2c 20 34 39  * 110 */  49, 49
18340 2c 20 35 30 2c 20 35 30 2c 20 35 31 2c 20 35 31  , 50, 50, 51, 51
18350 2c 20 35 32 2c 20 35 32 2c 20 35 33 2c 20 35 33  , 52, 52, 53, 53
18360 2c 0a 2f 2a 20 31 32 30 20 2a 2f 20 20 35 34 2c  ,./* 120 */  54,
18370 20 35 34 2c 20 35 35 2c 20 35 35 2c 20 35 36 2c   54, 55, 55, 56,
18380 20 35 36 2c 20 35 37 2c 20 35 37 0a 7d 3b 0a 0a   56, 57, 57.};..
18390 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
183a0 20 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 64   length of the d
183b0 61 74 61 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ata correspondin
183c0 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65  g to the supplie
183d0 64 20 73 65 72 69 61 6c 2d 74 79 70 65 2e 0a 2a  d serial-type..*
183e0 2f 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64 62  /.u32 sqlite3Vdb
183f0 65 53 65 72 69 61 6c 54 79 70 65 4c 65 6e 28 75  eSerialTypeLen(u
18400 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29 7b  32 serial_type){
18410 0a 20 20 69 66 28 20 73 65 72 69 61 6c 5f 74 79  .  if( serial_ty
18420 70 65 3e 3d 31 32 38 20 29 7b 0a 20 20 20 20 72  pe>=128 ){.    r
18430 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74 79  eturn (serial_ty
18440 70 65 2d 31 32 29 2f 32 3b 0a 20 20 7d 65 6c 73  pe-12)/2;.  }els
18450 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  e{.    assert( s
18460 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 0a 20  erial_type<12 . 
18470 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
18480 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53 69  lite3SmallTypeSi
18490 7a 65 73 5b 73 65 72 69 61 6c 5f 74 79 70 65 5d  zes[serial_type]
184a0 3d 3d 28 73 65 72 69 61 6c 5f 74 79 70 65 20 2d  ==(serial_type -
184b0 20 31 32 29 2f 32 20 29 3b 0a 20 20 20 20 72 65   12)/2 );.    re
184c0 74 75 72 6e 20 73 71 6c 69 74 65 33 53 6d 61 6c  turn sqlite3Smal
184d0 6c 54 79 70 65 53 69 7a 65 73 5b 73 65 72 69 61  lTypeSizes[seria
184e0 6c 5f 74 79 70 65 5d 3b 0a 20 20 7d 0a 7d 0a 75  l_type];.  }.}.u
184f0 38 20 73 71 6c 69 74 65 33 56 64 62 65 4f 6e 65  8 sqlite3VdbeOne
18500 42 79 74 65 53 65 72 69 61 6c 54 79 70 65 4c 65  ByteSerialTypeLe
18510 6e 28 75 38 20 73 65 72 69 61 6c 5f 74 79 70 65  n(u8 serial_type
18520 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 65 72  ){.  assert( ser
18530 69 61 6c 5f 74 79 70 65 3c 31 32 38 20 29 3b 0a  ial_type<128 );.
18540 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
18550 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b 73  SmallTypeSizes[s
18560 65 72 69 61 6c 5f 74 79 70 65 5d 3b 20 20 0a 7d  erial_type];  .}
18570 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
18580 65 20 6f 6e 20 61 6e 20 61 72 63 68 69 74 65 63  e on an architec
18590 74 75 72 65 20 77 69 74 68 20 6d 69 78 65 64 2d  ture with mixed-
185a0 65 6e 64 69 61 6e 20 66 6c 6f 61 74 69 6e 67 20  endian floating 
185b0 0a 2a 2a 20 70 6f 69 6e 74 73 20 28 65 78 3a 20  .** points (ex: 
185c0 41 52 4d 37 29 20 74 68 65 6e 20 73 77 61 70 20  ARM7) then swap 
185d0 74 68 65 20 6c 6f 77 65 72 20 34 20 62 79 74 65  the lower 4 byte
185e0 73 20 77 69 74 68 20 74 68 65 20 0a 2a 2a 20 75  s with the .** u
185f0 70 70 65 72 20 34 20 62 79 74 65 73 2e 20 20 52  pper 4 bytes.  R
18600 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
18610 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6d 6f 73 74  ..**.** For most
18620 20 61 72 63 68 69 74 65 63 74 75 72 65 73 2c 20   architectures, 
18630 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  this is a no-op.
18640 0a 2a 2a 0a 2a 2a 20 28 6c 61 74 65 72 29 3a 20  .**.** (later): 
18650 20 49 74 20 69 73 20 72 65 70 6f 72 74 65 64 20   It is reported 
18660 74 6f 20 6d 65 20 74 68 61 74 20 74 68 65 20 6d  to me that the m
18670 69 78 65 64 2d 65 6e 64 69 61 6e 20 70 72 6f 62  ixed-endian prob
18680 6c 65 6d 0a 2a 2a 20 6f 6e 20 41 52 4d 37 20 69  lem.** on ARM7 i
18690 73 20 61 6e 20 69 73 73 75 65 20 77 69 74 68 20  s an issue with 
186a0 47 43 43 2c 20 6e 6f 74 20 77 69 74 68 20 74 68  GCC, not with th
186b0 65 20 41 52 4d 37 20 63 68 69 70 2e 20 20 49 74  e ARM7 chip.  It
186c0 20 73 65 65 6d 73 0a 2a 2a 20 74 68 61 74 20 65   seems.** that e
186d0 61 72 6c 79 20 76 65 72 73 69 6f 6e 73 20 6f 66  arly versions of
186e0 20 47 43 43 20 73 74 6f 72 65 64 20 74 68 65 20   GCC stored the 
186f0 74 77 6f 20 77 6f 72 64 73 20 6f 66 20 61 20 36  two words of a 6
18700 34 2d 62 69 74 0a 2a 2a 20 66 6c 6f 61 74 20 69  4-bit.** float i
18710 6e 20 74 68 65 20 77 72 6f 6e 67 20 6f 72 64 65  n the wrong orde
18720 72 2e 20 20 41 6e 64 20 74 68 61 74 20 65 72 72  r.  And that err
18730 6f 72 20 68 61 73 20 62 65 65 6e 20 70 72 6f 70  or has been prop
18740 61 67 61 74 65 64 0a 2a 2a 20 65 76 65 72 20 73  agated.** ever s
18750 69 6e 63 65 2e 20 20 54 68 65 20 62 6c 61 6d 65  ince.  The blame
18760 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
18770 69 6c 79 20 77 69 74 68 20 47 43 43 2c 20 74 68  ily with GCC, th
18780 6f 75 67 68 2e 0a 2a 2a 20 47 43 43 20 6d 69 67  ough..** GCC mig
18790 68 74 20 68 61 76 65 20 6a 75 73 74 20 63 6f 70  ht have just cop
187a0 79 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ying the problem
187b0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 6f   from a prior co
187c0 6d 70 69 6c 65 72 2e 0a 2a 2a 20 49 20 61 6d 20  mpiler..** I am 
187d0 61 6c 73 6f 20 74 6f 6c 64 20 74 68 61 74 20 6e  also told that n
187e0 65 77 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  ewer versions of
187f0 20 47 43 43 20 74 68 61 74 20 66 6f 6c 6c 6f 77   GCC that follow
18800 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
18810 41 42 49 20 67 65 74 20 74 68 65 20 62 79 74 65  ABI get the byte
18820 20 6f 72 64 65 72 20 72 69 67 68 74 2e 0a 2a 2a   order right..**
18830 0a 2a 2a 20 44 65 76 65 6c 6f 70 65 72 73 20 75  .** Developers u
18840 73 69 6e 67 20 53 51 4c 69 74 65 20 6f 6e 20 61  sing SQLite on a
18850 6e 20 41 52 4d 37 20 73 68 6f 75 6c 64 20 63 6f  n ARM7 should co
18860 6d 70 69 6c 65 20 61 6e 64 20 72 75 6e 20 74 68  mpile and run th
18870 65 69 72 0a 2a 2a 20 61 70 70 6c 69 63 61 74 69  eir.** applicati
18880 6f 6e 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  on using -DSQLIT
18890 45 5f 44 45 42 55 47 3d 31 20 61 74 20 6c 65 61  E_DEBUG=1 at lea
188a0 73 74 20 6f 6e 63 65 2e 20 20 57 69 74 68 20 44  st once.  With D
188b0 45 42 55 47 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c  EBUG.** enabled,
188c0 20 73 6f 6d 65 20 61 73 73 65 72 74 73 20 62 65   some asserts be
188d0 6c 6f 77 20 77 69 6c 6c 20 65 6e 73 75 72 65 20  low will ensure 
188e0 74 68 61 74 20 74 68 65 20 62 79 74 65 20 6f 72  that the byte or
188f0 64 65 72 20 6f 66 0a 2a 2a 20 66 6c 6f 61 74 69  der of.** floati
18900 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 20  ng point values 
18910 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2a 0a 2a  is correct..**.*
18920 2a 20 28 32 30 30 37 2d 30 38 2d 33 30 29 20 20  * (2007-08-30)  
18930 46 72 61 6e 6b 20 76 61 6e 20 56 75 67 74 20 68  Frank van Vugt h
18940 61 73 20 73 74 75 64 69 65 64 20 74 68 69 73 20  as studied this 
18950 70 72 6f 62 6c 65 6d 20 63 6c 6f 73 65 6c 79 0a  problem closely.
18960 2a 2a 20 61 6e 64 20 68 61 73 20 73 65 6e 64 20  ** and has send 
18970 68 69 73 20 66 69 6e 64 69 6e 67 73 20 74 6f 20  his findings to 
18980 74 68 65 20 53 51 4c 69 74 65 20 64 65 76 65 6c  the SQLite devel
18990 6f 70 65 72 73 2e 20 20 46 72 61 6e 6b 0a 2a 2a  opers.  Frank.**
189a0 20 77 72 69 74 65 73 20 74 68 61 74 20 73 6f 6d   writes that som
189b0 65 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  e Linux kernels 
189c0 6f 66 66 65 72 20 66 6c 6f 61 74 69 6e 67 20 70  offer floating p
189d0 6f 69 6e 74 20 68 61 72 64 77 61 72 65 0a 2a 2a  oint hardware.**
189e0 20 65 6d 75 6c 61 74 69 6f 6e 20 74 68 61 74 20   emulation that 
189f0 75 73 65 73 20 6f 6e 6c 79 20 33 32 2d 62 69 74  uses only 32-bit
18a00 20 6d 61 6e 74 69 73 73 61 73 20 69 6e 73 74 65   mantissas inste
18a10 61 64 20 6f 66 20 61 20 66 75 6c 6c 20 0a 2a 2a  ad of a full .**
18a20 20 34 38 2d 62 69 74 73 20 61 73 20 72 65 71 75   48-bits as requ
18a30 69 72 65 64 20 62 79 20 74 68 65 20 49 45 45 45  ired by the IEEE
18a40 20 73 74 61 6e 64 61 72 64 2e 20 20 28 54 68 69   standard.  (Thi
18a50 73 20 69 73 20 74 68 65 0a 2a 2a 20 43 4f 4e 46  s is the.** CONF
18a60 49 47 5f 46 50 45 5f 46 41 53 54 46 50 45 20 6f  IG_FPE_FASTFPE o
18a70 70 74 69 6f 6e 2e 29 20 20 4f 6e 20 73 75 63 68  ption.)  On such
18a80 20 73 79 73 74 65 6d 73 2c 20 66 6c 6f 61 74 69   systems, floati
18a90 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 62 79 74 65  ng point.** byte
18aa0 20 73 77 61 70 70 69 6e 67 20 62 65 63 6f 6d 65   swapping become
18ab0 73 20 76 65 72 79 20 63 6f 6d 70 6c 69 63 61 74  s very complicat
18ac0 65 64 2e 20 20 54 6f 20 61 76 6f 69 64 20 70 72  ed.  To avoid pr
18ad0 6f 62 6c 65 6d 73 2c 0a 2a 2a 20 74 68 65 20 6e  oblems,.** the n
18ae0 65 63 65 73 73 61 72 79 20 62 79 74 65 20 73 77  ecessary byte sw
18af0 61 70 70 69 6e 67 20 69 73 20 63 61 72 72 69 65  apping is carrie
18b00 64 20 6f 75 74 20 75 73 69 6e 67 20 61 20 36 34  d out using a 64
18b10 2d 62 69 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  -bit integer.** 
18b20 72 61 74 68 65 72 20 74 68 61 6e 20 61 20 36 34  rather than a 64
18b30 2d 62 69 74 20 66 6c 6f 61 74 2e 20 20 46 72 61  -bit float.  Fra
18b40 6e 6b 20 61 73 73 75 72 65 73 20 75 73 20 74 68  nk assures us th
18b50 61 74 20 74 68 65 20 63 6f 64 65 20 68 65 72 65  at the code here
18b60 0a 2a 2a 20 77 6f 72 6b 73 20 66 6f 72 20 68 69  .** works for hi
18b70 6d 2e 20 20 57 65 2c 20 74 68 65 20 64 65 76 65  m.  We, the deve
18b80 6c 6f 70 65 72 73 2c 20 68 61 76 65 20 6e 6f 20  lopers, have no 
18b90 77 61 79 20 74 6f 20 69 6e 64 65 70 65 6e 64 65  way to independe
18ba0 6e 74 6c 79 0a 2a 2a 20 76 65 72 69 66 79 20 74  ntly.** verify t
18bb0 68 69 73 2c 20 62 75 74 20 46 72 61 6e 6b 20 73  his, but Frank s
18bc0 65 65 6d 73 20 74 6f 20 6b 6e 6f 77 20 77 68 61  eems to know wha
18bd0 74 20 68 65 20 69 73 20 74 61 6c 6b 69 6e 67 20  t he is talking 
18be0 61 62 6f 75 74 0a 2a 2a 20 73 6f 20 77 65 20 74  about.** so we t
18bf0 72 75 73 74 20 68 69 6d 2e 0a 2a 2f 0a 23 69 66  rust him..*/.#if
18c00 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44  def SQLITE_MIXED
18c10 5f 45 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c  _ENDIAN_64BIT_FL
18c20 4f 41 54 0a 73 74 61 74 69 63 20 75 36 34 20 66  OAT.static u64 f
18c30 6c 6f 61 74 53 77 61 70 28 75 36 34 20 69 6e 29  loatSwap(u64 in)
18c40 7b 0a 20 20 75 6e 69 6f 6e 20 7b 0a 20 20 20 20  {.  union {.    
18c50 75 36 34 20 72 3b 0a 20 20 20 20 75 33 32 20 69  u64 r;.    u32 i
18c60 5b 32 5d 3b 0a 20 20 7d 20 75 3b 0a 20 20 75 33  [2];.  } u;.  u3
18c70 32 20 74 3b 0a 0a 20 20 75 2e 72 20 3d 20 69 6e  2 t;..  u.r = in
18c80 3b 0a 20 20 74 20 3d 20 75 2e 69 5b 30 5d 3b 0a  ;.  t = u.i[0];.
18c90 20 20 75 2e 69 5b 30 5d 20 3d 20 75 2e 69 5b 31    u.i[0] = u.i[1
18ca0 5d 3b 0a 20 20 75 2e 69 5b 31 5d 20 3d 20 74 3b  ];.  u.i[1] = t;
18cb0 0a 20 20 72 65 74 75 72 6e 20 75 2e 72 3b 0a 7d  .  return u.r;.}
18cc0 0a 23 20 64 65 66 69 6e 65 20 73 77 61 70 4d 69  .# define swapMi
18cd0 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61 74 28 58  xedEndianFloat(X
18ce0 29 20 20 58 20 3d 20 66 6c 6f 61 74 53 77 61 70  )  X = floatSwap
18cf0 28 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  (X).#else.# defi
18d00 6e 65 20 73 77 61 70 4d 69 78 65 64 45 6e 64 69  ne swapMixedEndi
18d10 61 6e 46 6c 6f 61 74 28 58 29 0a 23 65 6e 64 69  anFloat(X).#endi
18d20 66 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74  f../*.** Write t
18d30 68 65 20 73 65 72 69 61 6c 69 7a 65 64 20 64 61  he serialized da
18d40 74 61 20 62 6c 6f 62 20 66 6f 72 20 74 68 65 20  ta blob for the 
18d50 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 20  value stored in 
18d60 70 4d 65 6d 20 69 6e 74 6f 20 0a 2a 2a 20 62 75  pMem into .** bu
18d70 66 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  f. It is assumed
18d80 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65 72   that the caller
18d90 20 68 61 73 20 61 6c 6c 6f 63 61 74 65 64 20 73   has allocated s
18da0 75 66 66 69 63 69 65 6e 74 20 73 70 61 63 65 2e  ufficient space.
18db0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
18dc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
18dd0 72 69 74 74 65 6e 2e 0a 2a 2a 0a 2a 2a 20 6e 42  ritten..**.** nB
18de0 75 66 20 69 73 20 74 68 65 20 61 6d 6f 75 6e 74  uf is the amount
18df0 20 6f 66 20 73 70 61 63 65 20 6c 65 66 74 20 69   of space left i
18e00 6e 20 62 75 66 5b 5d 2e 20 20 54 68 65 20 63 61  n buf[].  The ca
18e10 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
18e20 62 6c 65 0a 2a 2a 20 66 6f 72 20 61 6c 6c 6f 63  ble.** for alloc
18e30 61 74 69 6e 67 20 65 6e 6f 75 67 68 20 73 70 61  ating enough spa
18e40 63 65 20 74 6f 20 62 75 66 5b 5d 20 74 6f 20 68  ce to buf[] to h
18e50 6f 6c 64 20 74 68 65 20 65 6e 74 69 72 65 20 66  old the entire f
18e60 69 65 6c 64 2c 20 65 78 63 6c 75 73 69 76 65 0a  ield, exclusive.
18e70 2a 2a 20 6f 66 20 74 68 65 20 70 4d 65 6d 2d 3e  ** of the pMem->
18e80 75 2e 6e 5a 65 72 6f 20 62 79 74 65 73 20 66 6f  u.nZero bytes fo
18e90 72 20 61 20 4d 45 4d 5f 5a 65 72 6f 20 76 61 6c  r a MEM_Zero val
18ea0 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ue..**.** Return
18eb0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
18ec0 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 77 72  ytes actually wr
18ed0 69 74 74 65 6e 20 69 6e 74 6f 20 62 75 66 5b 5d  itten into buf[]
18ee0 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a  .  The number.**
18ef0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
18f00 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 74 61 69   zero-filled tai
18f10 6c 20 69 73 20 69 6e 63 6c 75 64 65 64 20 69 6e  l is included in
18f20 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
18f30 65 20 6f 6e 6c 79 0a 2a 2a 20 69 66 20 74 68 6f  e only.** if tho
18f40 73 65 20 62 79 74 65 73 20 77 65 72 65 20 7a 65  se bytes were ze
18f50 72 6f 65 64 20 69 6e 20 62 75 66 5b 5d 2e 0a 2a  roed in buf[]..*
18f60 2f 20 0a 75 33 32 20 73 71 6c 69 74 65 33 56 64  / .u32 sqlite3Vd
18f70 62 65 53 65 72 69 61 6c 50 75 74 28 75 38 20 2a  beSerialPut(u8 *
18f80 62 75 66 2c 20 4d 65 6d 20 2a 70 4d 65 6d 2c 20  buf, Mem *pMem, 
18f90 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 29  u32 serial_type)
18fa0 7b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 0a 20 20  {.  u32 len;..  
18fb0 2f 2a 20 49 6e 74 65 67 65 72 20 61 6e 64 20 52  /* Integer and R
18fc0 65 61 6c 20 2a 2f 0a 20 20 69 66 28 20 73 65 72  eal */.  if( ser
18fd0 69 61 6c 5f 74 79 70 65 3c 3d 37 20 26 26 20 73  ial_type<=7 && s
18fe0 65 72 69 61 6c 5f 74 79 70 65 3e 30 20 29 7b 0a  erial_type>0 ){.
18ff0 20 20 20 20 75 36 34 20 76 3b 0a 20 20 20 20 75      u64 v;.    u
19000 33 32 20 69 3b 0a 20 20 20 20 69 66 28 20 73 65  32 i;.    if( se
19010 72 69 61 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a  rial_type==7 ){.
19020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
19030 7a 65 6f 66 28 76 29 3d 3d 73 69 7a 65 6f 66 28  zeof(v)==sizeof(
19040 70 4d 65 6d 2d 3e 75 2e 72 29 20 29 3b 0a 20 20  pMem->u.r) );.  
19050 20 20 20 20 6d 65 6d 63 70 79 28 26 76 2c 20 26      memcpy(&v, &
19060 70 4d 65 6d 2d 3e 75 2e 72 2c 20 73 69 7a 65 6f  pMem->u.r, sizeo
19070 66 28 76 29 29 3b 0a 20 20 20 20 20 20 73 77 61  f(v));.      swa
19080 70 4d 69 78 65 64 45 6e 64 69 61 6e 46 6c 6f 61  pMixedEndianFloa
19090 74 28 76 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  t(v);.    }else{
190a0 0a 20 20 20 20 20 20 76 20 3d 20 70 4d 65 6d 2d  .      v = pMem-
190b0 3e 75 2e 69 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >u.i;.    }.    
190c0 6c 65 6e 20 3d 20 69 20 3d 20 73 71 6c 69 74 65  len = i = sqlite
190d0 33 53 6d 61 6c 6c 54 79 70 65 53 69 7a 65 73 5b  3SmallTypeSizes[
190e0 73 65 72 69 61 6c 5f 74 79 70 65 5d 3b 0a 20 20  serial_type];.  
190f0 20 20 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b    assert( i>0 );
19100 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 62  .    do{.      b
19110 75 66 5b 2d 2d 69 5d 20 3d 20 28 75 38 29 28 76  uf[--i] = (u8)(v
19120 26 30 78 46 46 29 3b 0a 20 20 20 20 20 20 76 20  &0xFF);.      v 
19130 3e 3e 3d 20 38 3b 0a 20 20 20 20 7d 77 68 69 6c  >>= 8;.    }whil
19140 65 28 20 69 20 29 3b 0a 20 20 20 20 72 65 74 75  e( i );.    retu
19150 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  rn len;.  }..  /
19160 2a 20 53 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62  * String or blob
19170 20 2a 2f 0a 20 20 69 66 28 20 73 65 72 69 61 6c   */.  if( serial
19180 5f 74 79 70 65 3e 3d 31 32 20 29 7b 0a 20 20 20  _type>=12 ){.   
19190 20 61 73 73 65 72 74 28 20 70 4d 65 6d 2d 3e 6e   assert( pMem->n
191a0 20 2b 20 28 28 70 4d 65 6d 2d 3e 66 6c 61 67 73   + ((pMem->flags
191b0 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3f 70 4d 65   & MEM_Zero)?pMe
191c0 6d 2d 3e 75 2e 6e 5a 65 72 6f 3a 30 29 0a 20 20  m->u.nZero:0).  
191d0 20 20 20 20 20 20 20 20 20 20 20 3d 3d 20 28 69             == (i
191e0 6e 74 29 73 71 6c 69 74 65 33 56 64 62 65 53 65  nt)sqlite3VdbeSe
191f0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
19200 61 6c 5f 74 79 70 65 29 20 29 3b 0a 20 20 20 20  al_type) );.    
19210 6c 65 6e 20 3d 20 70 4d 65 6d 2d 3e 6e 3b 0a 20  len = pMem->n;. 
19220 20 20 20 69 66 28 20 6c 65 6e 3e 30 20 29 20 6d     if( len>0 ) m
19230 65 6d 63 70 79 28 62 75 66 2c 20 70 4d 65 6d 2d  emcpy(buf, pMem-
19240 3e 7a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 72 65  >z, len);.    re
19250 74 75 72 6e 20 6c 65 6e 3b 0a 20 20 7d 0a 0a 20  turn len;.  }.. 
19260 20 2f 2a 20 4e 55 4c 4c 20 6f 72 20 63 6f 6e 73   /* NULL or cons
19270 74 61 6e 74 73 20 30 20 6f 72 20 31 20 2a 2f 0a  tants 0 or 1 */.
19280 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19290 2a 20 49 6e 70 75 74 20 22 78 22 20 69 73 20 61  * Input "x" is a
192a0 20 73 65 71 75 65 6e 63 65 20 6f 66 20 75 6e 73   sequence of uns
192b0 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
192c0 20 74 68 61 74 20 72 65 70 72 65 73 65 6e 74 20   that represent 
192d0 61 0a 2a 2a 20 62 69 67 2d 65 6e 64 69 61 6e 20  a.** big-endian 
192e0 69 6e 74 65 67 65 72 2e 20 20 52 65 74 75 72 6e  integer.  Return
192f0 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 20   the equivalent 
19300 6e 61 74 69 76 65 20 69 6e 74 65 67 65 72 0a 2a  native integer.*
19310 2f 0a 23 64 65 66 69 6e 65 20 4f 4e 45 5f 42 59  /.#define ONE_BY
19320 54 45 5f 49 4e 54 28 78 29 20 20 20 20 28 28 69  TE_INT(x)    ((i
19330 38 29 28 78 29 5b 30 5d 29 0a 23 64 65 66 69 6e  8)(x)[0]).#defin
19340 65 20 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 78  e TWO_BYTE_INT(x
19350 29 20 20 20 20 28 32 35 36 2a 28 69 38 29 28 28  )    (256*(i8)((
19360 78 29 5b 30 5d 29 7c 28 78 29 5b 31 5d 29 0a 23  x)[0])|(x)[1]).#
19370 64 65 66 69 6e 65 20 54 48 52 45 45 5f 42 59 54  define THREE_BYT
19380 45 5f 49 4e 54 28 78 29 20 20 28 36 35 35 33 36  E_INT(x)  (65536
19390 2a 28 69 38 29 28 28 78 29 5b 30 5d 29 7c 28 28  *(i8)((x)[0])|((
193a0 78 29 5b 31 5d 3c 3c 38 29 7c 28 78 29 5b 32 5d  x)[1]<<8)|(x)[2]
193b0 29 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42  ).#define FOUR_B
193c0 59 54 45 5f 55 49 4e 54 28 78 29 20 20 28 28 28  YTE_UINT(x)  (((
193d0 75 33 32 29 28 78 29 5b 30 5d 3c 3c 32 34 29 7c  u32)(x)[0]<<24)|
193e0 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28 78  ((x)[1]<<16)|((x
193f0 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d 29  )[2]<<8)|(x)[3])
19400 0a 23 64 65 66 69 6e 65 20 46 4f 55 52 5f 42 59  .#define FOUR_BY
19410 54 45 5f 49 4e 54 28 78 29 20 28 31 36 37 37 37  TE_INT(x) (16777
19420 32 31 36 2a 28 69 38 29 28 28 78 29 5b 30 5d 29  216*(i8)((x)[0])
19430 7c 28 28 78 29 5b 31 5d 3c 3c 31 36 29 7c 28 28  |((x)[1]<<16)|((
19440 78 29 5b 32 5d 3c 3c 38 29 7c 28 78 29 5b 33 5d  x)[2]<<8)|(x)[3]
19450 29 0a 0a 2f 2a 0a 2a 2a 20 44 65 73 65 72 69 61  )../*.** Deseria
19460 6c 69 7a 65 20 74 68 65 20 64 61 74 61 20 62 6c  lize the data bl
19470 6f 62 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ob pointed to by
19480 20 62 75 66 20 61 73 20 73 65 72 69 61 6c 20 74   buf as serial t
19490 79 70 65 20 73 65 72 69 61 6c 5f 74 79 70 65 0a  ype serial_type.
194a0 2a 2a 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65  ** and store the
194b0 20 72 65 73 75 6c 74 20 69 6e 20 70 4d 65 6d 2e   result in pMem.
194c0 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
194d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 61  ber of bytes rea
194e0 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
194f0 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  nction is implem
19500 65 6e 74 65 64 20 61 73 20 74 77 6f 20 73 65 70  ented as two sep
19510 61 72 61 74 65 20 72 6f 75 74 69 6e 65 73 20 66  arate routines f
19520 6f 72 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a  or performance..
19530 2a 2a 20 54 68 65 20 66 65 77 20 63 61 73 65 73  ** The few cases
19540 20 74 68 61 74 20 72 65 71 75 69 72 65 20 6c 6f   that require lo
19550 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72  cal variables ar
19560 65 20 62 72 6f 6b 65 6e 20 6f 75 74 20 69 6e 74  e broken out int
19570 6f 20 61 20 73 65 70 61 72 61 74 65 0a 2a 2a 20  o a separate.** 
19580 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61 74 20  routine so that 
19590 69 6e 20 6d 6f 73 74 20 63 61 73 65 73 20 74 68  in most cases th
195a0 65 20 6f 76 65 72 68 65 61 64 20 6f 66 20 6d 6f  e overhead of mo
195b0 76 69 6e 67 20 74 68 65 20 73 74 61 63 6b 20 70  ving the stack p
195c0 6f 69 6e 74 65 72 0a 2a 2a 20 69 73 20 61 76 6f  ointer.** is avo
195d0 69 64 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63  ided..*/ .static
195e0 20 75 33 32 20 53 51 4c 49 54 45 5f 4e 4f 49 4e   u32 SQLITE_NOIN
195f0 4c 49 4e 45 20 73 65 72 69 61 6c 47 65 74 28 0a  LINE serialGet(.
19600 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64    const unsigned
19610 20 63 68 61 72 20 2a 62 75 66 2c 20 20 20 20 20   char *buf,     
19620 2f 2a 20 42 75 66 66 65 72 20 74 6f 20 64 65 73  /* Buffer to des
19630 65 72 69 61 6c 69 7a 65 20 66 72 6f 6d 20 2a 2f  erialize from */
19640 0a 20 20 75 33 32 20 73 65 72 69 61 6c 5f 74 79  .  u32 serial_ty
19650 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
19660 20 2f 2a 20 53 65 72 69 61 6c 20 74 79 70 65 20   /* Serial type 
19670 74 6f 20 64 65 73 65 72 69 61 6c 69 7a 65 20 2a  to deserialize *
19680 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65 6d 20 20 20  /.  Mem *pMem   
19690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196a0 20 20 2f 2a 20 4d 65 6d 6f 72 79 20 63 65 6c 6c    /* Memory cell
196b0 20 74 6f 20 77 72 69 74 65 20 76 61 6c 75 65 20   to write value 
196c0 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20 20 75 36 34  into */.){.  u64
196d0 20 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55   x = FOUR_BYTE_U
196e0 49 4e 54 28 62 75 66 29 3b 0a 20 20 75 33 32 20  INT(buf);.  u32 
196f0 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
19700 4e 54 28 62 75 66 2b 34 29 3b 0a 20 20 78 20 3d  NT(buf+4);.  x =
19710 20 28 78 3c 3c 33 32 29 20 2b 20 79 3b 0a 20 20   (x<<32) + y;.  
19720 69 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d  if( serial_type=
19730 3d 36 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49  =6 ){.    /* EVI
19740 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 39 38 35  DENCE-OF: R-2985
19750 31 2d 35 32 32 37 32 20 56 61 6c 75 65 20 69 73  1-52272 Value is
19760 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 36 34   a big-endian 64
19770 2d 62 69 74 0a 20 20 20 20 2a 2a 20 74 77 6f 73  -bit.    ** twos
19780 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65  -complement inte
19790 67 65 72 2e 20 2a 2f 0a 20 20 20 20 70 4d 65 6d  ger. */.    pMem
197a0 2d 3e 75 2e 69 20 3d 20 2a 28 69 36 34 2a 29 26  ->u.i = *(i64*)&
197b0 78 3b 0a 20 20 20 20 70 4d 65 6d 2d 3e 66 6c 61  x;.    pMem->fla
197c0 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a 20 20  gs = MEM_Int;.  
197d0 20 20 74 65 73 74 63 61 73 65 28 20 70 4d 65 6d    testcase( pMem
197e0 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20 20 7d 65 6c  ->u.i<0 );.  }el
197f0 73 65 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45  se{.    /* EVIDE
19800 4e 43 45 2d 4f 46 3a 20 52 2d 35 37 33 34 33 2d  NCE-OF: R-57343-
19810 34 39 31 31 34 20 56 61 6c 75 65 20 69 73 20 61  49114 Value is a
19820 20 62 69 67 2d 65 6e 64 69 61 6e 20 49 45 45 45   big-endian IEEE
19830 20 37 35 34 2d 32 30 30 38 20 36 34 2d 62 69 74   754-2008 64-bit
19840 0a 20 20 20 20 2a 2a 20 66 6c 6f 61 74 69 6e 67  .    ** floating
19850 20 70 6f 69 6e 74 20 6e 75 6d 62 65 72 2e 20 2a   point number. *
19860 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e  /.#if !defined(N
19870 44 45 42 55 47 29 20 26 26 20 21 64 65 66 69 6e  DEBUG) && !defin
19880 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
19890 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
198a0 20 20 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61     /* Verify tha
198b0 74 20 69 6e 74 65 67 65 72 73 20 61 6e 64 20 66  t integers and f
198c0 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
198d0 6c 75 65 73 20 75 73 65 20 74 68 65 20 73 61 6d  lues use the sam
198e0 65 0a 20 20 20 20 2a 2a 20 62 79 74 65 20 6f 72  e.    ** byte or
198f0 64 65 72 2e 20 20 4f 72 2c 20 74 68 61 74 20 69  der.  Or, that i
19900 66 20 53 51 4c 49 54 45 5f 4d 49 58 45 44 5f 45  f SQLITE_MIXED_E
19910 4e 44 49 41 4e 5f 36 34 42 49 54 5f 46 4c 4f 41  NDIAN_64BIT_FLOA
19920 54 20 69 73 0a 20 20 20 20 2a 2a 20 64 65 66 69  T is.    ** defi
19930 6e 65 64 20 74 68 61 74 20 36 34 2d 62 69 74 20  ned that 64-bit 
19940 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76  floating point v
19950 61 6c 75 65 73 20 72 65 61 6c 6c 79 20 61 72 65  alues really are
19960 20 6d 69 78 65 64 0a 20 20 20 20 2a 2a 20 65 6e   mixed.    ** en
19970 64 69 61 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  dian..    */.   
19980 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 36   static const u6
19990 34 20 74 31 20 3d 20 28 28 75 36 34 29 30 78 33  4 t1 = ((u64)0x3
199a0 66 66 30 30 30 30 30 29 3c 3c 33 32 3b 0a 20 20  ff00000)<<32;.  
199b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 64    static const d
199c0 6f 75 62 6c 65 20 72 31 20 3d 20 31 2e 30 3b 0a  ouble r1 = 1.0;.
199d0 20 20 20 20 75 36 34 20 74 32 20 3d 20 74 31 3b      u64 t2 = t1;
199e0 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64 45 6e  .    swapMixedEn
199f0 64 69 61 6e 46 6c 6f 61 74 28 74 32 29 3b 0a 20  dianFloat(t2);. 
19a00 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19a10 66 28 72 31 29 3d 3d 73 69 7a 65 6f 66 28 74 32  f(r1)==sizeof(t2
19a20 29 20 26 26 20 6d 65 6d 63 6d 70 28 26 72 31 2c  ) && memcmp(&r1,
19a30 20 26 74 32 2c 20 73 69 7a 65 6f 66 28 72 31 29   &t2, sizeof(r1)
19a40 29 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 20  )==0 );.#endif. 
19a50 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f     assert( sizeo
19a60 66 28 78 29 3d 3d 38 20 26 26 20 73 69 7a 65 6f  f(x)==8 && sizeo
19a70 66 28 70 4d 65 6d 2d 3e 75 2e 72 29 3d 3d 38 20  f(pMem->u.r)==8 
19a80 29 3b 0a 20 20 20 20 73 77 61 70 4d 69 78 65 64  );.    swapMixed
19a90 45 6e 64 69 61 6e 46 6c 6f 61 74 28 78 29 3b 0a  EndianFloat(x);.
19aa0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4d 65 6d      memcpy(&pMem
19ab0 2d 3e 75 2e 72 2c 20 26 78 2c 20 73 69 7a 65 6f  ->u.r, &x, sizeo
19ac0 66 28 78 29 29 3b 0a 20 20 20 20 70 4d 65 6d 2d  f(x));.    pMem-
19ad0 3e 66 6c 61 67 73 20 3d 20 73 71 6c 69 74 65 33  >flags = sqlite3
19ae0 49 73 4e 61 4e 28 70 4d 65 6d 2d 3e 75 2e 72 29  IsNaN(pMem->u.r)
19af0 20 3f 20 4d 45 4d 5f 4e 75 6c 6c 20 3a 20 4d 45   ? MEM_Null : ME
19b00 4d 5f 52 65 61 6c 3b 0a 20 20 7d 0a 20 20 72 65  M_Real;.  }.  re
19b10 74 75 72 6e 20 38 3b 0a 7d 0a 75 33 32 20 73 71  turn 8;.}.u32 sq
19b20 6c 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47  lite3VdbeSerialG
19b30 65 74 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  et(.  const unsi
19b40 67 6e 65 64 20 63 68 61 72 20 2a 62 75 66 2c 20  gned char *buf, 
19b50 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 74 6f      /* Buffer to
19b60 20 64 65 73 65 72 69 61 6c 69 7a 65 20 66 72 6f   deserialize fro
19b70 6d 20 2a 2f 0a 20 20 75 33 32 20 73 65 72 69 61  m */.  u32 seria
19b80 6c 5f 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  l_type,         
19b90 20 20 20 20 20 2f 2a 20 53 65 72 69 61 6c 20 74       /* Serial t
19ba0 79 70 65 20 74 6f 20 64 65 73 65 72 69 61 6c 69  ype to deseriali
19bb0 7a 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70 4d 65  ze */.  Mem *pMe
19bc0 6d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m               
19bd0 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f 72 79 20        /* Memory 
19be0 63 65 6c 6c 20 74 6f 20 77 72 69 74 65 20 76 61  cell to write va
19bf0 6c 75 65 20 69 6e 74 6f 20 2a 2f 0a 29 7b 0a 20  lue into */.){. 
19c00 20 73 77 69 74 63 68 28 20 73 65 72 69 61 6c 5f   switch( serial_
19c10 74 79 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65  type ){.    case
19c20 20 31 30 3a 20 20 20 2f 2a 20 52 65 73 65 72 76   10:   /* Reserv
19c30 65 64 20 66 6f 72 20 66 75 74 75 72 65 20 75 73  ed for future us
19c40 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 31 31  e */.    case 11
19c50 3a 20 20 20 2f 2a 20 52 65 73 65 72 76 65 64 20  :   /* Reserved 
19c60 66 6f 72 20 66 75 74 75 72 65 20 75 73 65 20 2a  for future use *
19c70 2f 0a 20 20 20 20 63 61 73 65 20 30 3a 20 7b 20  /.    case 0: { 
19c80 20 2f 2a 20 4e 75 6c 6c 20 2a 2f 0a 20 20 20 20   /* Null */.    
19c90 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
19ca0 3a 20 52 2d 32 34 30 37 38 2d 30 39 33 37 35 20  : R-24078-09375 
19cb0 56 61 6c 75 65 20 69 73 20 61 20 4e 55 4c 4c 2e  Value is a NULL.
19cc0 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e   */.      pMem->
19cd0 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 4e 75 6c 6c  flags = MEM_Null
19ce0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19cf0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 31 3a     }.    case 1:
19d00 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
19d10 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 34 38 38 35  ENCE-OF: R-44885
19d20 2d 32 35 31 39 36 20 56 61 6c 75 65 20 69 73 20  -25196 Value is 
19d30 61 6e 20 38 2d 62 69 74 20 74 77 6f 73 2d 63 6f  an 8-bit twos-co
19d40 6d 70 6c 65 6d 65 6e 74 0a 20 20 20 20 20 20 2a  mplement.      *
19d50 2a 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20  * integer. */.  
19d60 20 20 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20      pMem->u.i = 
19d70 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  ONE_BYTE_INT(buf
19d80 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19d90 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19da0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19db0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19dc0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
19dd0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a     }.    case 2:
19de0 20 7b 20 2f 2a 20 32 2d 62 79 74 65 20 73 69 67   { /* 2-byte sig
19df0 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
19e00 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
19e10 2d 4f 46 3a 20 52 2d 34 39 37 39 34 2d 33 35 30  -OF: R-49794-350
19e20 32 36 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  26 Value is a bi
19e30 67 2d 65 6e 64 69 61 6e 20 31 36 2d 62 69 74 0a  g-endian 16-bit.
19e40 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
19e50 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
19e60 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
19e70 3e 75 2e 69 20 3d 20 54 57 4f 5f 42 59 54 45 5f  >u.i = TWO_BYTE_
19e80 49 4e 54 28 62 75 66 29 3b 0a 20 20 20 20 20 20  INT(buf);.      
19e90 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45  pMem->flags = ME
19ea0 4d 5f 49 6e 74 3b 0a 20 20 20 20 20 20 74 65 73  M_Int;.      tes
19eb0 74 63 61 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69  tcase( pMem->u.i
19ec0 3c 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  <0 );.      retu
19ed0 72 6e 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 2;.    }.    
19ee0 63 61 73 65 20 33 3a 20 7b 20 2f 2a 20 33 2d 62  case 3: { /* 3-b
19ef0 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
19f00 65 72 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45  er */.      /* E
19f10 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 37  VIDENCE-OF: R-37
19f20 38 33 39 2d 35 34 33 30 31 20 56 61 6c 75 65 20  839-54301 Value 
19f30 69 73 20 61 20 62 69 67 2d 65 6e 64 69 61 6e 20  is a big-endian 
19f40 32 34 2d 62 69 74 0a 20 20 20 20 20 20 2a 2a 20  24-bit.      ** 
19f50 74 77 6f 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20  twos-complement 
19f60 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20  integer. */.    
19f70 20 20 70 4d 65 6d 2d 3e 75 2e 69 20 3d 20 54 48    pMem->u.i = TH
19f80 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 62 75 66  REE_BYTE_INT(buf
19f90 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d 3e 66  );.      pMem->f
19fa0 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74 3b 0a  lags = MEM_Int;.
19fb0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
19fc0 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b 0a 20  pMem->u.i<0 );. 
19fd0 20 20 20 20 20 72 65 74 75 72 6e 20 33 3b 0a 20       return 3;. 
19fe0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34 3a     }.    case 4:
19ff0 20 7b 20 2f 2a 20 34 2d 62 79 74 65 20 73 69 67   { /* 4-byte sig
1a000 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20  ned integer */. 
1a010 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
1a020 2d 4f 46 3a 20 52 2d 30 31 38 34 39 2d 32 36 30  -OF: R-01849-260
1a030 37 39 20 56 61 6c 75 65 20 69 73 20 61 20 62 69  79 Value is a bi
1a040 67 2d 65 6e 64 69 61 6e 20 33 32 2d 62 69 74 0a  g-endian 32-bit.
1a050 20 20 20 20 20 20 2a 2a 20 74 77 6f 73 2d 63 6f        ** twos-co
1a060 6d 70 6c 65 6d 65 6e 74 20 69 6e 74 65 67 65 72  mplement integer
1a070 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65 6d 2d  . */.      pMem-
1a080 3e 75 2e 69 20 3d 20 46 4f 55 52 5f 42 59 54 45  >u.i = FOUR_BYTE
1a090 5f 49 4e 54 28 62 75 66 29 3b 0a 23 69 66 64 65  _INT(buf);.#ifde
1a0a0 66 20 5f 5f 48 50 5f 63 63 20 0a 20 20 20 20 20  f __HP_cc .     
1a0b0 20 2f 2a 20 57 6f 72 6b 20 61 72 6f 75 6e 64 20   /* Work around 
1a0c0 61 20 73 69 67 6e 2d 65 78 74 65 6e 73 69 6f 6e  a sign-extension
1a0d0 20 62 75 67 20 69 6e 20 74 68 65 20 48 50 20 63   bug in the HP c
1a0e0 6f 6d 70 69 6c 65 72 20 66 6f 72 20 48 50 2f 55  ompiler for HP/U
1a0f0 58 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 62  X */.      if( b
1a100 75 66 5b 30 5d 26 30 78 38 30 20 29 20 70 4d 65  uf[0]&0x80 ) pMe
1a110 6d 2d 3e 75 2e 69 20 7c 3d 20 30 78 66 66 66 66  m->u.i |= 0xffff
1a120 66 66 66 66 38 30 30 30 30 30 30 30 4c 4c 3b 0a  ffff80000000LL;.
1a130 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 4d 65  #endif.      pMe
1a140 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49  m->flags = MEM_I
1a150 6e 74 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  nt;.      testca
1a160 73 65 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20  se( pMem->u.i<0 
1a170 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1a180 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  4;.    }.    cas
1a190 65 20 35 3a 20 7b 20 2f 2a 20 36 2d 62 79 74 65  e 5: { /* 6-byte
1a1a0 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20   signed integer 
1a1b0 2a 2f 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44  */.      /* EVID
1a1c0 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 30 33 38 35  ENCE-OF: R-50385
1a1d0 2d 30 39 36 37 34 20 56 61 6c 75 65 20 69 73 20  -09674 Value is 
1a1e0 61 20 62 69 67 2d 65 6e 64 69 61 6e 20 34 38 2d  a big-endian 48-
1a1f0 62 69 74 0a 20 20 20 20 20 20 2a 2a 20 74 77 6f  bit.      ** two
1a200 73 2d 63 6f 6d 70 6c 65 6d 65 6e 74 20 69 6e 74  s-complement int
1a210 65 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 70  eger. */.      p
1a220 4d 65 6d 2d 3e 75 2e 69 20 3d 20 46 4f 55 52 5f  Mem->u.i = FOUR_
1a230 42 59 54 45 5f 55 49 4e 54 28 62 75 66 2b 32 29  BYTE_UINT(buf+2)
1a240 20 2b 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32   + (((i64)1)<<32
1a250 29 2a 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 62  )*TWO_BYTE_INT(b
1a260 75 66 29 3b 0a 20 20 20 20 20 20 70 4d 65 6d 2d  uf);.      pMem-
1a270 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f 49 6e 74  >flags = MEM_Int
1a280 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
1a290 28 20 70 4d 65 6d 2d 3e 75 2e 69 3c 30 20 29 3b  ( pMem->u.i<0 );
1a2a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 36 3b  .      return 6;
1a2b0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
1a2c0 36 3a 20 20 20 2f 2a 20 38 2d 62 79 74 65 20 73  6:   /* 8-byte s
1a2d0 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a 2f  igned integer */
1a2e0 0a 20 20 20 20 63 61 73 65 20 37 3a 20 7b 20 2f  .    case 7: { /
1a2f0 2a 20 49 45 45 45 20 66 6c 6f 61 74 69 6e 67 20  * IEEE floating 
1a300 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 2f  point */.      /
1a310 2a 20 54 68 65 73 65 20 75 73 65 20 6c 6f 63 61  * These use loca
1a320 6c 20 76 61 72 69 61 62 6c 65 73 2c 20 73 6f 20  l variables, so 
1a330 64 6f 20 74 68 65 6d 20 69 6e 20 61 20 73 65 70  do them in a sep
1a340 61 72 61 74 65 20 72 6f 75 74 69 6e 65 0a 20 20  arate routine.  
1a350 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64 20      ** to avoid 
1a360 68 61 76 69 6e 67 20 74 6f 20 6d 6f 76 65 20 74  having to move t
1a370 68 65 20 66 72 61 6d 65 20 70 6f 69 6e 74 65 72  he frame pointer
1a380 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
1a390 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ase */.      ret
1a3a0 75 72 6e 20 73 65 72 69 61 6c 47 65 74 28 62 75  urn serialGet(bu
1a3b0 66 2c 73 65 72 69 61 6c 5f 74 79 70 65 2c 70 4d  f,serial_type,pM
1a3c0 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  em);.    }.    c
1a3d0 61 73 65 20 38 3a 20 20 20 20 2f 2a 20 49 6e 74  ase 8:    /* Int
1a3e0 65 67 65 72 20 30 20 2a 2f 0a 20 20 20 20 63 61  eger 0 */.    ca
1a3f0 73 65 20 39 3a 20 7b 20 20 2f 2a 20 49 6e 74 65  se 9: {  /* Inte
1a400 67 65 72 20 31 20 2a 2f 0a 20 20 20 20 20 20 2f  ger 1 */.      /
1a410 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a420 2d 31 32 39 37 36 2d 32 32 38 39 33 20 56 61 6c  -12976-22893 Val
1a430 75 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65  ue is the intege
1a440 72 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  r 0. */.      /*
1a450 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
1a460 31 38 31 34 33 2d 31 32 31 32 31 20 56 61 6c 75  18143-12121 Valu
1a470 65 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72  e is the integer
1a480 20 31 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4d 65   1. */.      pMe
1a490 6d 2d 3e 75 2e 69 20 3d 20 73 65 72 69 61 6c 5f  m->u.i = serial_
1a4a0 74 79 70 65 2d 38 3b 0a 20 20 20 20 20 20 70 4d  type-8;.      pM
1a4b0 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 4d 45 4d 5f  em->flags = MEM_
1a4c0 49 6e 74 3b 0a 20 20 20 20 20 20 72 65 74 75 72  Int;.      retur
1a4d0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  n 0;.    }.    d
1a4e0 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
1a4f0 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
1a500 52 2d 31 34 36 30 36 2d 33 31 35 36 34 20 56 61  R-14606-31564 Va
1a510 6c 75 65 20 69 73 20 61 20 42 4c 4f 42 20 74 68  lue is a BLOB th
1a520 61 74 20 69 73 20 28 4e 2d 31 32 29 2f 32 20 62  at is (N-12)/2 b
1a530 79 74 65 73 20 69 6e 0a 20 20 20 20 20 20 2a 2a  ytes in.      **
1a540 20 6c 65 6e 67 74 68 2e 0a 20 20 20 20 20 20 2a   length..      *
1a550 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
1a560 2d 32 38 34 30 31 2d 30 30 31 34 30 20 56 61 6c  -28401-00140 Val
1a570 75 65 20 69 73 20 61 20 73 74 72 69 6e 67 20 69  ue is a string i
1a580 6e 20 74 68 65 20 74 65 78 74 20 65 6e 63 6f 64  n the text encod
1a590 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ing and.      **
1a5a0 20 28 4e 2d 31 33 29 2f 32 20 62 79 74 65 73 20   (N-13)/2 bytes 
1a5b0 69 6e 20 6c 65 6e 67 74 68 2e 20 2a 2f 0a 20 20  in length. */.  
1a5c0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
1a5d0 20 75 31 36 20 61 46 6c 61 67 5b 5d 20 3d 20 7b   u16 aFlag[] = {
1a5e0 20 4d 45 4d 5f 42 6c 6f 62 7c 4d 45 4d 5f 45 70   MEM_Blob|MEM_Ep
1a5f0 68 65 6d 2c 20 4d 45 4d 5f 53 74 72 7c 4d 45 4d  hem, MEM_Str|MEM
1a600 5f 45 70 68 65 6d 20 7d 3b 0a 20 20 20 20 20 20  _Ephem };.      
1a610 70 4d 65 6d 2d 3e 7a 20 3d 20 28 63 68 61 72 20  pMem->z = (char 
1a620 2a 29 62 75 66 3b 0a 20 20 20 20 20 20 70 4d 65  *)buf;.      pMe
1a630 6d 2d 3e 6e 20 3d 20 28 73 65 72 69 61 6c 5f 74  m->n = (serial_t
1a640 79 70 65 2d 31 32 29 2f 32 3b 0a 20 20 20 20 20  ype-12)/2;.     
1a650 20 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 61   pMem->flags = a
1a660 46 6c 61 67 5b 73 65 72 69 61 6c 5f 74 79 70 65  Flag[serial_type
1a670 26 31 5d 3b 0a 20 20 20 20 20 20 72 65 74 75 72  &1];.      retur
1a680 6e 20 70 4d 65 6d 2d 3e 6e 3b 0a 20 20 20 20 7d  n pMem->n;.    }
1a690 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
1a6a0 0a 7d 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .}./*.** This ro
1a6b0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
1a6c0 20 61 6c 6c 6f 63 61 74 65 20 73 75 66 66 69 63   allocate suffic
1a6d0 69 65 6e 74 20 73 70 61 63 65 20 66 6f 72 20 61  ient space for a
1a6e0 6e 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  n UnpackedRecord
1a6f0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 6c 61  .** structure la
1a700 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 62 65  rge enough to be
1a710 20 75 73 65 64 20 77 69 74 68 20 73 71 6c 69 74   used with sqlit
1a720 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1a730 63 6b 28 29 20 69 66 0a 2a 2a 20 74 68 65 20 66  ck() if.** the f
1a740 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
1a750 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 4b 65   a pointer to Ke
1a760 79 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  yInfo structure 
1a770 70 4b 65 79 49 6e 66 6f 2e 0a 2a 2a 0a 2a 2a 20  pKeyInfo..**.** 
1a780 54 68 65 20 73 70 61 63 65 20 69 73 20 65 69 74  The space is eit
1a790 68 65 72 20 61 6c 6c 6f 63 61 74 65 64 20 75 73  her allocated us
1a7a0 69 6e 67 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  ing sqlite3DbMal
1a7b0 6c 6f 63 52 61 77 28 29 20 6f 72 20 66 72 6f 6d  locRaw() or from
1a7c0 20 77 69 74 68 69 6e 0a 2a 2a 20 74 68 65 20 75   within.** the u
1a7d0 6e 61 6c 69 67 6e 65 64 20 62 75 66 66 65 72 20  naligned buffer 
1a7e0 70 61 73 73 65 64 20 76 69 61 20 74 68 65 20 73  passed via the s
1a7f0 65 63 6f 6e 64 20 61 6e 64 20 74 68 69 72 64 20  econd and third 
1a800 61 72 67 75 6d 65 6e 74 73 20 28 70 72 65 73 75  arguments (presu
1a810 6d 61 62 6c 79 0a 2a 2a 20 73 74 61 63 6b 20 73  mably.** stack s
1a820 70 61 63 65 29 2e 20 49 66 20 74 68 65 20 66 6f  pace). If the fo
1a830 72 6d 65 72 2c 20 74 68 65 6e 20 2a 70 70 46 72  rmer, then *ppFr
1a840 65 65 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  ee is set to a p
1a850 6f 69 6e 74 65 72 20 74 68 61 74 20 73 68 6f 75  ointer that shou
1a860 6c 64 0a 2a 2a 20 62 65 20 65 76 65 6e 74 75 61  ld.** be eventua
1a870 6c 6c 79 20 66 72 65 65 64 20 62 79 20 74 68 65  lly freed by the
1a880 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 73 71   caller using sq
1a890 6c 69 74 65 33 44 62 46 72 65 65 28 29 2e 20 4f  lite3DbFree(). O
1a8a0 72 2c 20 69 66 20 74 68 65 20 0a 2a 2a 20 61 6c  r, if the .** al
1a8b0 6c 6f 63 61 74 69 6f 6e 20 63 6f 6d 65 73 20 66  location comes f
1a8c0 72 6f 6d 20 74 68 65 20 70 53 70 61 63 65 2f 73  rom the pSpace/s
1a8d0 7a 53 70 61 63 65 20 62 75 66 66 65 72 2c 20 2a  zSpace buffer, *
1a8e0 70 70 46 72 65 65 20 69 73 20 73 65 74 20 74 6f  ppFree is set to
1a8f0 20 4e 55 4c 4c 0a 2a 2a 20 62 65 66 6f 72 65 20   NULL.** before 
1a900 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a  returning..**.**
1a910 20 49 66 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72   If an OOM error
1a920 20 6f 63 63 75 72 73 2c 20 4e 55 4c 4c 20 69 73   occurs, NULL is
1a930 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 55 6e   returned..*/.Un
1a940 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 73 71  packedRecord *sq
1a950 6c 69 74 65 33 56 64 62 65 41 6c 6c 6f 63 55 6e  lite3VdbeAllocUn
1a960 70 61 63 6b 65 64 52 65 63 6f 72 64 28 0a 20 20  packedRecord(.  
1a970 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
1a980 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
1a990 2f 2a 20 44 65 73 63 72 69 70 74 69 6f 6e 20 6f  /* Description o
1a9a0 66 20 74 68 65 20 72 65 63 6f 72 64 20 2a 2f 0a  f the record */.
1a9b0 20 20 63 68 61 72 20 2a 70 53 70 61 63 65 2c 20    char *pSpace, 
1a9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a9d0 20 20 2f 2a 20 55 6e 61 6c 69 67 6e 65 64 20 73    /* Unaligned s
1a9e0 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 2a  pace available *
1a9f0 2f 0a 20 20 69 6e 74 20 73 7a 53 70 61 63 65 2c  /.  int szSpace,
1aa00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa10 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
1aa20 53 70 61 63 65 5b 5d 20 69 6e 20 62 79 74 65 73  Space[] in bytes
1aa30 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 70 46   */.  char **ppF
1aa40 72 65 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ree             
1aa50 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 61        /* OUT: Ca
1aa60 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 72 65 65  ller should free
1aa70 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 2a 2f   this pointer */
1aa80 0a 29 7b 0a 20 20 55 6e 70 61 63 6b 65 64 52 65  .){.  UnpackedRe
1aa90 63 6f 72 64 20 2a 70 3b 20 20 20 20 20 20 20 20  cord *p;        
1aaa0 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65        /* Unpacke
1aab0 64 20 72 65 63 6f 72 64 20 74 6f 20 72 65 74 75  d record to retu
1aac0 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 66 66  rn */.  int nOff
1aad0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1aae0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 63 72 65          /* Incre
1aaf0 6d 65 6e 74 20 70 53 70 61 63 65 20 62 79 20 6e  ment pSpace by n
1ab00 4f 66 66 20 74 6f 20 61 6c 69 67 6e 20 69 74 20  Off to align it 
1ab10 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 20  */.  int nByte; 
1ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab30 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1ab40 66 20 62 79 74 65 73 20 72 65 71 75 69 72 65 64  f bytes required
1ab50 20 66 6f 72 20 2a 70 20 2a 2f 0a 0a 20 20 2f 2a   for *p */..  /*
1ab60 20 57 65 20 77 61 6e 74 20 74 6f 20 73 68 69 66   We want to shif
1ab70 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20 70 53  t the pointer pS
1ab80 70 61 63 65 20 75 70 20 73 75 63 68 20 74 68 61  pace up such tha
1ab90 74 20 69 74 20 69 73 20 38 2d 62 79 74 65 20 61  t it is 8-byte a
1aba0 6c 69 67 6e 65 64 2e 0a 20 20 2a 2a 20 54 68 75  ligned..  ** Thu
1abb0 73 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 63 61  s, we need to ca
1abc0 6c 63 75 6c 61 74 65 20 61 20 76 61 6c 75 65 2c  lculate a value,
1abd0 20 6e 4f 66 66 2c 20 62 65 74 77 65 65 6e 20 30   nOff, between 0
1abe0 20 61 6e 64 20 37 2c 20 74 6f 20 73 68 69 66 74   and 7, to shift
1abf0 20 0a 20 20 2a 2a 20 69 74 20 62 79 2e 20 20 49   .  ** it by.  I
1ac00 66 20 70 53 70 61 63 65 20 69 73 20 61 6c 72 65  f pSpace is alre
1ac10 61 64 79 20 38 2d 62 79 74 65 20 61 6c 69 67 6e  ady 8-byte align
1ac20 65 64 2c 20 6e 4f 66 66 20 73 68 6f 75 6c 64 20  ed, nOff should 
1ac30 62 65 20 7a 65 72 6f 2e 0a 20 20 2a 2f 0a 20 20  be zero..  */.  
1ac40 6e 4f 66 66 20 3d 20 28 38 20 2d 20 28 53 51 4c  nOff = (8 - (SQL
1ac50 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
1ac60 53 70 61 63 65 29 20 26 20 37 29 29 20 26 20 37  Space) & 7)) & 7
1ac70 3b 0a 20 20 6e 42 79 74 65 20 3d 20 52 4f 55 4e  ;.  nByte = ROUN
1ac80 44 38 28 73 69 7a 65 6f 66 28 55 6e 70 61 63 6b  D8(sizeof(Unpack
1ac90 65 64 52 65 63 6f 72 64 29 29 20 2b 20 73 69 7a  edRecord)) + siz
1aca0 65 6f 66 28 4d 65 6d 29 2a 28 70 4b 65 79 49 6e  eof(Mem)*(pKeyIn
1acb0 66 6f 2d 3e 6e 46 69 65 6c 64 2b 31 29 3b 0a 20  fo->nField+1);. 
1acc0 20 69 66 28 20 6e 42 79 74 65 3e 73 7a 53 70 61   if( nByte>szSpa
1acd0 63 65 2b 6e 4f 66 66 20 29 7b 0a 20 20 20 20 70  ce+nOff ){.    p
1ace0 20 3d 20 28 55 6e 70 61 63 6b 65 64 52 65 63 6f   = (UnpackedReco
1acf0 72 64 20 2a 29 73 71 6c 69 74 65 33 44 62 4d 61  rd *)sqlite3DbMa
1ad00 6c 6c 6f 63 52 61 77 28 70 4b 65 79 49 6e 66 6f  llocRaw(pKeyInfo
1ad10 2d 3e 64 62 2c 20 6e 42 79 74 65 29 3b 0a 20 20  ->db, nByte);.  
1ad20 20 20 2a 70 70 46 72 65 65 20 3d 20 28 63 68 61    *ppFree = (cha
1ad30 72 20 2a 29 70 3b 0a 20 20 20 20 69 66 28 20 21  r *)p;.    if( !
1ad40 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
1ad50 7d 65 6c 73 65 7b 0a 20 20 20 20 70 20 3d 20 28  }else{.    p = (
1ad60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 2a 29  UnpackedRecord*)
1ad70 26 70 53 70 61 63 65 5b 6e 4f 66 66 5d 3b 0a 20  &pSpace[nOff];. 
1ad80 20 20 20 2a 70 70 46 72 65 65 20 3d 20 30 3b 0a     *ppFree = 0;.
1ad90 20 20 7d 0a 0a 20 20 70 2d 3e 61 4d 65 6d 20 3d    }..  p->aMem =
1ada0 20 28 4d 65 6d 2a 29 26 28 28 63 68 61 72 2a 29   (Mem*)&((char*)
1adb0 70 29 5b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  p)[ROUND8(sizeof
1adc0 28 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 29  (UnpackedRecord)
1add0 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b  )];.  assert( pK
1ade0 65 79 49 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64  eyInfo->aSortOrd
1adf0 65 72 21 3d 30 20 29 3b 0a 20 20 70 2d 3e 70 4b  er!=0 );.  p->pK
1ae00 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66  eyInfo = pKeyInf
1ae10 6f 3b 0a 20 20 70 2d 3e 6e 46 69 65 6c 64 20 3d  o;.  p->nField =
1ae20 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1ae30 64 20 2b 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  d + 1;.  return 
1ae40 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
1ae50 6e 20 74 68 65 20 6e 4b 65 79 2d 62 79 74 65 20  n the nKey-byte 
1ae60 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 20 72 65  encoding of a re
1ae70 63 6f 72 64 20 69 6e 20 70 4b 65 79 5b 5d 2c 20  cord in pKey[], 
1ae80 70 6f 70 75 6c 61 74 65 20 74 68 65 20 0a 2a 2a  populate the .**
1ae90 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20   UnpackedRecord 
1aea0 73 74 72 75 63 74 75 72 65 20 69 6e 64 69 63 61  structure indica
1aeb0 74 65 64 20 62 79 20 74 68 65 20 66 6f 75 72 74  ted by the fourt
1aec0 68 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68 20  h argument with 
1aed0 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
1aee0 6f 66 20 74 68 65 20 64 65 63 6f 64 65 64 20 72  of the decoded r
1aef0 65 63 6f 72 64 2e 0a 2a 2f 20 0a 76 6f 69 64 20  ecord..*/ .void 
1af00 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1af10 64 55 6e 70 61 63 6b 28 0a 20 20 4b 65 79 49 6e  dUnpack(.  KeyIn
1af20 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
1af30 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e    /* Information
1af40 20 61 62 6f 75 74 20 74 68 65 20 72 65 63 6f 72   about the recor
1af50 64 20 66 6f 72 6d 61 74 20 2a 2f 0a 20 20 69 6e  d format */.  in
1af60 74 20 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20  t nKey,         
1af70 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1af80 74 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f 72  the binary recor
1af90 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
1afa0 64 20 2a 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a  d *pKey,      /*
1afb0 20 54 68 65 20 62 69 6e 61 72 79 20 72 65 63 6f   The binary reco
1afc0 72 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  rd */.  Unpacked
1afd0 52 65 63 6f 72 64 20 2a 70 20 20 20 20 20 20 2f  Record *p      /
1afe0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 69 73 20  * Populate this 
1aff0 73 74 72 75 63 74 75 72 65 20 62 65 66 6f 72 65  structure before
1b000 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 29   returning. */.)
1b010 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
1b020 65 64 20 63 68 61 72 20 2a 61 4b 65 79 20 3d 20  ed char *aKey = 
1b030 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
1b040 63 68 61 72 20 2a 29 70 4b 65 79 3b 0a 20 20 69  char *)pKey;.  i
1b050 6e 74 20 64 3b 20 0a 20 20 75 33 32 20 69 64 78  nt d; .  u32 idx
1b060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1b070 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
1b080 65 74 20 69 6e 20 61 4b 65 79 5b 5d 20 74 6f 20  et in aKey[] to 
1b090 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 75  read from */.  u
1b0a0 31 36 20 75 3b 20 20 20 20 20 20 20 20 20 20 20  16 u;           
1b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b0c0 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20  * Unsigned loop 
1b0d0 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32  counter */.  u32
1b0e0 20 73 7a 48 64 72 3b 0a 20 20 4d 65 6d 20 2a 70   szHdr;.  Mem *p
1b0f0 4d 65 6d 20 3d 20 70 2d 3e 61 4d 65 6d 3b 0a 0a  Mem = p->aMem;..
1b100 20 20 70 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20    p->default_rc 
1b110 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 45  = 0;.  assert( E
1b120 49 47 48 54 5f 42 59 54 45 5f 41 4c 49 47 4e 4d  IGHT_BYTE_ALIGNM
1b130 45 4e 54 28 70 4d 65 6d 29 20 29 3b 0a 20 20 69  ENT(pMem) );.  i
1b140 64 78 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32  dx = getVarint32
1b150 28 61 4b 65 79 2c 20 73 7a 48 64 72 29 3b 0a 20  (aKey, szHdr);. 
1b160 20 64 20 3d 20 73 7a 48 64 72 3b 0a 20 20 75 20   d = szHdr;.  u 
1b170 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 64  = 0;.  while( id
1b180 78 3c 73 7a 48 64 72 20 26 26 20 64 3c 3d 6e 4b  x<szHdr && d<=nK
1b190 65 79 20 29 7b 0a 20 20 20 20 75 33 32 20 73 65  ey ){.    u32 se
1b1a0 72 69 61 6c 5f 74 79 70 65 3b 0a 0a 20 20 20 20  rial_type;..    
1b1b0 69 64 78 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  idx += getVarint
1b1c0 33 32 28 26 61 4b 65 79 5b 69 64 78 5d 2c 20 73  32(&aKey[idx], s
1b1d0 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 20  erial_type);.   
1b1e0 20 70 4d 65 6d 2d 3e 65 6e 63 20 3d 20 70 4b 65   pMem->enc = pKe
1b1f0 79 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20  yInfo->enc;.    
1b200 70 4d 65 6d 2d 3e 64 62 20 3d 20 70 4b 65 79 49  pMem->db = pKeyI
1b210 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20 20 2f 2a 20  nfo->db;.    /* 
1b220 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 3d 20 30 3b  pMem->flags = 0;
1b230 20 2f 2f 20 73 71 6c 69 74 65 33 56 64 62 65 53   // sqlite3VdbeS
1b240 65 72 69 61 6c 47 65 74 28 29 20 77 69 6c 6c 20  erialGet() will 
1b250 73 65 74 20 74 68 69 73 20 66 6f 72 20 75 73 20  set this for us 
1b260 2a 2f 0a 20 20 20 20 70 4d 65 6d 2d 3e 73 7a 4d  */.    pMem->szM
1b270 61 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 70  alloc = 0;.    p
1b280 4d 65 6d 2d 3e 7a 20 3d 20 30 3b 0a 20 20 20 20  Mem->z = 0;.    
1b290 64 20 2b 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d += sqlite3Vdbe
1b2a0 53 65 72 69 61 6c 47 65 74 28 26 61 4b 65 79 5b  SerialGet(&aKey[
1b2b0 64 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 2c  d], serial_type,
1b2c0 20 70 4d 65 6d 29 3b 0a 20 20 20 20 70 4d 65 6d   pMem);.    pMem
1b2d0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 28 2b 2b 75  ++;.    if( (++u
1b2e0 29 3e 3d 70 2d 3e 6e 46 69 65 6c 64 20 29 20 62  )>=p->nField ) b
1b2f0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  reak;.  }.  asse
1b300 72 74 28 20 75 3c 3d 70 4b 65 79 49 6e 66 6f 2d  rt( u<=pKeyInfo-
1b310 3e 6e 46 69 65 6c 64 20 2b 20 31 20 29 3b 0a 20  >nField + 1 );. 
1b320 20 70 2d 3e 6e 46 69 65 6c 64 20 3d 20 75 3b 0a   p->nField = u;.
1b330 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  }..#if SQLITE_DE
1b340 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BUG./*.** This f
1b350 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 61 72 65 73  unction compares
1b360 20 74 77 6f 20 69 6e 64 65 78 20 6f 72 20 74 61   two index or ta
1b370 62 6c 65 20 72 65 63 6f 72 64 20 6b 65 79 73 20  ble record keys 
1b380 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79 0a  in the same way.
1b390 2a 2a 20 61 73 20 74 68 65 20 73 71 6c 69 74 65  ** as the sqlite
1b3a0 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61  3VdbeRecordCompa
1b3b0 72 65 28 29 20 72 6f 75 74 69 6e 65 2e 20 55 6e  re() routine. Un
1b3c0 6c 69 6b 65 20 56 64 62 65 52 65 63 6f 72 64 43  like VdbeRecordC
1b3d0 6f 6d 70 61 72 65 28 29 2c 0a 2a 2a 20 74 68 69  ompare(),.** thi
1b3e0 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
1b3f0 69 61 6c 69 7a 65 73 20 61 6e 64 20 63 6f 6d 70  ializes and comp
1b400 61 72 65 73 20 76 61 6c 75 65 73 20 75 73 69 6e  ares values usin
1b410 67 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  g the.** sqlite3
1b420 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 29 20  VdbeSerialGet() 
1b430 61 6e 64 20 73 71 6c 69 74 65 33 4d 65 6d 43 6f  and sqlite3MemCo
1b440 6d 70 61 72 65 28 29 20 66 75 6e 63 74 69 6f 6e  mpare() function
1b450 73 2e 20 49 74 20 69 73 20 75 73 65 64 0a 2a 2a  s. It is used.**
1b460 20 69 6e 20 61 73 73 65 72 74 28 29 20 73 74 61   in assert() sta
1b470 74 65 6d 65 6e 74 73 20 74 6f 20 65 6e 73 75 72  tements to ensur
1b480 65 20 74 68 61 74 20 74 68 65 20 6f 70 74 69 6d  e that the optim
1b490 69 7a 65 64 20 63 6f 64 65 20 69 6e 0a 2a 2a 20  ized code in.** 
1b4a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1b4b0 64 43 6f 6d 70 61 72 65 28 29 20 72 65 74 75 72  dCompare() retur
1b4c0 6e 73 20 72 65 73 75 6c 74 73 20 77 69 74 68 20  ns results with 
1b4d0 74 68 65 73 65 20 74 77 6f 20 70 72 69 6d 69 74  these two primit
1b4e0 69 76 65 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ives..**.** Retu
1b4f0 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 72  rn true if the r
1b500 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69  esult of compari
1b510 73 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65 6e  son is equivalen
1b520 74 20 74 6f 20 64 65 73 69 72 65 64 52 65 73 75  t to desiredResu
1b530 6c 74 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61  lt..** Return fa
1b540 6c 73 65 20 69 66 20 74 68 65 72 65 20 69 73 20  lse if there is 
1b550 61 20 64 69 73 61 67 72 65 65 6d 65 6e 74 2e 0a  a disagreement..
1b560 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64  */.static int vd
1b570 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 44  beRecordCompareD
1b580 65 62 75 67 28 0a 20 20 69 6e 74 20 6e 4b 65 79  ebug(.  int nKey
1b590 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1b5a0 4b 65 79 31 2c 20 2f 2a 20 4c 65 66 74 20 6b 65  Key1, /* Left ke
1b5b0 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 55 6e 70  y */.  const Unp
1b5c0 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50 4b  ackedRecord *pPK
1b5d0 65 79 32 2c 20 2f 2a 20 52 69 67 68 74 20 6b 65  ey2, /* Right ke
1b5e0 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1b5f0 65 64 52 65 73 75 6c 74 20 20 20 20 20 20 20 20  edResult        
1b600 20 20 20 20 20 2f 2a 20 43 6f 72 72 65 63 74 20       /* Correct 
1b610 61 6e 73 77 65 72 20 2a 2f 0a 29 7b 0a 20 20 75  answer */.){.  u
1b620 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20 20  32 d1;          
1b630 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
1b640 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20   aKey[] of next 
1b650 64 61 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a  data element */.
1b660 20 20 75 33 32 20 69 64 78 31 3b 20 20 20 20 20    u32 idx1;     
1b670 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
1b680 6e 74 6f 20 61 4b 65 79 5b 5d 20 6f 66 20 6e 65  nto aKey[] of ne
1b690 78 74 20 68 65 61 64 65 72 20 65 6c 65 6d 65 6e  xt header elemen
1b6a0 74 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  t */.  u32 szHdr
1b6b0 31 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  1;        /* Num
1b6c0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
1b6d0 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
1b6e0 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  i = 0;.  int rc 
1b6f0 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  = 0;.  const uns
1b700 69 67 6e 65 64 20 63 68 61 72 20 2a 61 4b 65 79  igned char *aKey
1b710 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e 73 69 67  1 = (const unsig
1b720 6e 65 64 20 63 68 61 72 20 2a 29 70 4b 65 79 31  ned char *)pKey1
1b730 3b 0a 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65  ;.  KeyInfo *pKe
1b740 79 49 6e 66 6f 3b 0a 20 20 4d 65 6d 20 6d 65 6d  yInfo;.  Mem mem
1b750 31 3b 0a 0a 20 20 70 4b 65 79 49 6e 66 6f 20 3d  1;..  pKeyInfo =
1b760 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
1b770 6f 3b 0a 20 20 69 66 28 20 70 4b 65 79 49 6e 66  o;.  if( pKeyInf
1b780 6f 2d 3e 64 62 3d 3d 30 20 29 20 72 65 74 75 72  o->db==0 ) retur
1b790 6e 20 31 3b 0a 20 20 6d 65 6d 31 2e 65 6e 63 20  n 1;.  mem1.enc 
1b7a0 3d 20 70 4b 65 79 49 6e 66 6f 2d 3e 65 6e 63 3b  = pKeyInfo->enc;
1b7b0 0a 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70 4b 65  .  mem1.db = pKe
1b7c0 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 2f 2a 20  yInfo->db;.  /* 
1b7d0 6d 65 6d 31 2e 66 6c 61 67 73 20 3d 20 30 3b 20  mem1.flags = 0; 
1b7e0 20 2f 2f 20 57 69 6c 6c 20 62 65 20 69 6e 69 74   // Will be init
1b7f0 69 61 6c 69 7a 65 64 20 62 79 20 73 71 6c 69 74  ialized by sqlit
1b800 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74 28  e3VdbeSerialGet(
1b810 29 20 2a 2f 0a 20 20 56 56 41 5f 4f 4e 4c 59 28  ) */.  VVA_ONLY(
1b820 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 20 3d   mem1.szMalloc =
1b830 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79 20 6e 65   0; ) /* Only ne
1b840 65 64 65 64 20 62 79 20 61 73 73 65 72 74 28 29  eded by assert()
1b850 20 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 0a   statements */..
1b860 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 72 73 20 6d    /* Compilers m
1b870 61 79 20 63 6f 6d 70 6c 61 69 6e 20 74 68 61 74  ay complain that
1b880 20 6d 65 6d 31 2e 75 2e 69 20 69 73 20 70 6f 74   mem1.u.i is pot
1b890 65 6e 74 69 61 6c 6c 79 20 75 6e 69 6e 69 74 69  entially uniniti
1b8a0 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 57 65 20  alized..  ** We 
1b8b0 63 6f 75 6c 64 20 69 6e 69 74 69 61 6c 69 7a 65  could initialize
1b8c0 20 69 74 2c 20 61 73 20 73 68 6f 77 6e 20 68 65   it, as shown he
1b8d0 72 65 2c 20 74 6f 20 73 69 6c 65 6e 63 65 20 74  re, to silence t
1b8e0 68 6f 73 65 20 63 6f 6d 70 6c 61 69 6e 74 73 2e  hose complaints.
1b8f0 0a 20 20 2a 2a 20 42 75 74 20 69 6e 20 66 61 63  .  ** But in fac
1b900 74 2c 20 6d 65 6d 31 2e 75 2e 69 20 77 69 6c 6c  t, mem1.u.i will
1b910 20 6e 65 76 65 72 20 61 63 74 75 61 6c 6c 79 20   never actually 
1b920 62 65 20 75 73 65 64 20 75 6e 69 6e 69 74 69 61  be used uninitia
1b930 6c 69 7a 65 64 2c 20 61 6e 64 20 64 6f 69 6e 67  lized, and doing
1b940 20 0a 20 20 2a 2a 20 74 68 65 20 75 6e 6e 65 63   .  ** the unnec
1b950 65 73 73 61 72 79 20 69 6e 69 74 69 61 6c 69 7a  essary initializ
1b960 61 74 69 6f 6e 20 68 61 73 20 61 20 6d 65 61 73  ation has a meas
1b970 75 72 61 62 6c 65 20 6e 65 67 61 74 69 76 65 20  urable negative 
1b980 70 65 72 66 6f 72 6d 61 6e 63 65 0a 20 20 2a 2a  performance.  **
1b990 20 69 6d 70 61 63 74 2c 20 73 69 6e 63 65 20 74   impact, since t
1b9a0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
1b9b0 20 76 65 72 79 20 68 69 67 68 20 72 75 6e 6e 65   very high runne
1b9c0 72 2e 20 20 41 6e 64 20 73 6f 2c 20 77 65 20 63  r.  And so, we c
1b9d0 68 6f 6f 73 65 0a 20 20 2a 2a 20 74 6f 20 69 67  hoose.  ** to ig
1b9e0 6e 6f 72 65 20 74 68 65 20 63 6f 6d 70 69 6c 65  nore the compile
1b9f0 72 20 77 61 72 6e 69 6e 67 73 20 61 6e 64 20 6c  r warnings and l
1ba00 65 61 76 65 20 74 68 69 73 20 76 61 72 69 61 62  eave this variab
1ba10 6c 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  le uninitialized
1ba20 2e 0a 20 20 2a 2f 0a 20 20 2f 2a 20 20 6d 65 6d  ..  */.  /*  mem
1ba30 31 2e 75 2e 69 20 3d 20 30 3b 20 20 2f 2f 20 6e  1.u.i = 0;  // n
1ba40 6f 74 20 6e 65 65 64 65 64 2c 20 68 65 72 65 20  ot needed, here 
1ba50 74 6f 20 73 69 6c 65 6e 63 65 20 63 6f 6d 70 69  to silence compi
1ba60 6c 65 72 20 77 61 72 6e 69 6e 67 20 2a 2f 0a 20  ler warning */. 
1ba70 20 0a 20 20 69 64 78 31 20 3d 20 67 65 74 56 61   .  idx1 = getVa
1ba80 72 69 6e 74 33 32 28 61 4b 65 79 31 2c 20 73 7a  rint32(aKey1, sz
1ba90 48 64 72 31 29 3b 0a 20 20 69 66 28 20 73 7a 48  Hdr1);.  if( szH
1baa0 64 72 31 3e 39 38 33 30 37 20 29 20 72 65 74 75  dr1>98307 ) retu
1bab0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1bac0 54 3b 0a 20 20 64 31 20 3d 20 73 7a 48 64 72 31  T;.  d1 = szHdr1
1bad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4b 65 79  ;.  assert( pKey
1bae0 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 2b 70 4b 65  Info->nField+pKe
1baf0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1bb00 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 7c  pPKey2->nField |
1bb10 7c 20 43 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a  | CORRUPT_DB );.
1bb20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 49 6e    assert( pKeyIn
1bb30 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1bb40 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1bb50 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 3e  KeyInfo->nField>
1bb60 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  0 );.  assert( i
1bb70 64 78 31 3c 3d 73 7a 48 64 72 31 20 7c 7c 20 43  dx1<=szHdr1 || C
1bb80 4f 52 52 55 50 54 5f 44 42 20 29 3b 0a 20 20 64  ORRUPT_DB );.  d
1bb90 6f 7b 0a 20 20 20 20 75 33 32 20 73 65 72 69 61  o{.    u32 seria
1bba0 6c 5f 74 79 70 65 31 3b 0a 0a 20 20 20 20 2f 2a  l_type1;..    /*
1bbb0 20 52 65 61 64 20 74 68 65 20 73 65 72 69 61 6c   Read the serial
1bbc0 20 74 79 70 65 73 20 66 6f 72 20 74 68 65 20 6e   types for the n
1bbd0 65 78 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20 65  ext element in e
1bbe0 61 63 68 20 6b 65 79 2e 20 2a 2f 0a 20 20 20 20  ach key. */.    
1bbf0 69 64 78 31 20 2b 3d 20 67 65 74 56 61 72 69 6e  idx1 += getVarin
1bc00 74 33 32 28 20 61 4b 65 79 31 2b 69 64 78 31 2c  t32( aKey1+idx1,
1bc10 20 73 65 72 69 61 6c 5f 74 79 70 65 31 20 29 3b   serial_type1 );
1bc20 0a 0a 20 20 20 20 2f 2a 20 56 65 72 69 66 79 20  ..    /* Verify 
1bc30 74 68 61 74 20 74 68 65 72 65 20 69 73 20 65 6e  that there is en
1bc40 6f 75 67 68 20 6b 65 79 20 73 70 61 63 65 20 72  ough key space r
1bc50 65 6d 61 69 6e 69 6e 67 20 74 6f 20 61 76 6f 69  emaining to avoi
1bc60 64 0a 20 20 20 20 2a 2a 20 61 20 62 75 66 66 65  d.    ** a buffe
1bc70 72 20 6f 76 65 72 72 65 61 64 2e 20 20 54 68 65  r overread.  The
1bc80 20 22 64 31 2b 73 65 72 69 61 6c 5f 74 79 70 65   "d1+serial_type
1bc90 31 2b 32 22 20 73 75 62 65 78 70 72 65 73 73 69  1+2" subexpressi
1bca0 6f 6e 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 61  on will.    ** a
1bcb0 6c 77 61 79 73 20 62 65 20 67 72 65 61 74 65 72  lways be greater
1bcc0 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
1bcd0 6f 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  o the amount of 
1bce0 72 65 71 75 69 72 65 64 20 6b 65 79 20 73 70 61  required key spa
1bcf0 63 65 2e 0a 20 20 20 20 2a 2a 20 55 73 65 20 74  ce..    ** Use t
1bd00 68 61 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f  hat approximatio
1bd10 6e 20 74 6f 20 61 76 6f 69 64 20 74 68 65 20 6d  n to avoid the m
1bd20 6f 72 65 20 65 78 70 65 6e 73 69 76 65 20 63 61  ore expensive ca
1bd30 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
1bd40 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 54 79  ite3VdbeSerialTy
1bd50 70 65 4c 65 6e 28 29 20 69 6e 20 74 68 65 20 63  peLen() in the c
1bd60 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20 20 20  ommon case..    
1bd70 2a 2f 0a 20 20 20 20 69 66 28 20 64 31 2b 73 65  */.    if( d1+se
1bd80 72 69 61 6c 5f 74 79 70 65 31 2b 32 3e 28 75 33  rial_type1+2>(u3
1bd90 32 29 6e 4b 65 79 31 0a 20 20 20 20 20 26 26 20  2)nKey1.     && 
1bda0 64 31 2b 73 71 6c 69 74 65 33 56 64 62 65 53 65  d1+sqlite3VdbeSe
1bdb0 72 69 61 6c 54 79 70 65 4c 65 6e 28 73 65 72 69  rialTypeLen(seri
1bdc0 61 6c 5f 74 79 70 65 31 29 3e 28 75 33 32 29 6e  al_type1)>(u32)n
1bdd0 4b 65 79 31 20 0a 20 20 20 20 29 7b 0a 20 20 20  Key1 .    ){.   
1bde0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1bdf0 0a 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20  .    /* Extract 
1be00 74 68 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  the values to be
1be10 20 63 6f 6d 70 61 72 65 64 2e 0a 20 20 20 20 2a   compared..    *
1be20 2f 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69  /.    d1 += sqli
1be30 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65 74  te3VdbeSerialGet
1be40 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72  (&aKey1[d1], ser
1be50 69 61 6c 5f 74 79 70 65 31 2c 20 26 6d 65 6d 31  ial_type1, &mem1
1be60 29 3b 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 74 68  );..    /* Do th
1be70 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 20 20 20  e comparison.   
1be80 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
1be90 69 74 65 33 4d 65 6d 43 6f 6d 70 61 72 65 28 26  ite3MemCompare(&
1bea0 6d 65 6d 31 2c 20 26 70 50 4b 65 79 32 2d 3e 61  mem1, &pPKey2->a
1beb0 4d 65 6d 5b 69 5d 2c 20 70 4b 65 79 49 6e 66 6f  Mem[i], pKeyInfo
1bec0 2d 3e 61 43 6f 6c 6c 5b 69 5d 29 3b 0a 20 20 20  ->aColl[i]);.   
1bed0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
1bee0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 31      assert( mem1
1bef0 2e 73 7a 4d 61 6c 6c 6f 63 3d 3d 30 20 29 3b 20  .szMalloc==0 ); 
1bf00 20 2f 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20   /* See comment 
1bf10 62 65 6c 6f 77 20 2a 2f 0a 20 20 20 20 20 20 69  below */.      i
1bf20 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f  f( pKeyInfo->aSo
1bf30 72 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20  rtOrder[i] ){.  
1bf40 20 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 20        rc = -rc; 
1bf50 20 2f 2a 20 49 6e 76 65 72 74 20 74 68 65 20 72   /* Invert the r
1bf60 65 73 75 6c 74 20 66 6f 72 20 44 45 53 43 20 73  esult for DESC s
1bf70 6f 72 74 20 6f 72 64 65 72 2e 20 2a 2f 0a 20 20  ort order. */.  
1bf80 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
1bf90 20 64 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64   debugCompareEnd
1bfa0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 2b 2b 3b  ;.    }.    i++;
1bfb0 0a 20 20 7d 77 68 69 6c 65 28 20 69 64 78 31 3c  .  }while( idx1<
1bfc0 73 7a 48 64 72 31 20 26 26 20 69 3c 70 50 4b 65  szHdr1 && i<pPKe
1bfd0 79 32 2d 3e 6e 46 69 65 6c 64 20 29 3b 0a 0a 20  y2->nField );.. 
1bfe0 20 2f 2a 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c   /* No memory al
1bff0 6c 6f 63 61 74 69 6f 6e 20 69 73 20 65 76 65 72  location is ever
1c000 20 75 73 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20   used on mem1.  
1c010 50 72 6f 76 65 20 74 68 69 73 20 75 73 69 6e 67  Prove this using
1c020 0a 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77  .  ** the follow
1c030 69 6e 67 20 61 73 73 65 72 74 28 29 2e 20 20 49  ing assert().  I
1c040 66 20 74 68 65 20 61 73 73 65 72 74 28 29 20 66  f the assert() f
1c050 61 69 6c 73 2c 20 69 74 20 69 6e 64 69 63 61 74  ails, it indicat
1c060 65 73 20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  es a.  ** memory
1c070 20 6c 65 61 6b 20 61 6e 64 20 61 20 6e 65 65 64   leak and a need
1c080 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33   to call sqlite3
1c090 56 64 62 65 4d 65 6d 52 65 6c 65 61 73 65 28 26  VdbeMemRelease(&
1c0a0 6d 65 6d 31 29 2e 0a 20 20 2a 2f 0a 20 20 61 73  mem1)..  */.  as
1c0b0 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c  sert( mem1.szMal
1c0c0 6c 6f 63 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  loc==0 );..  /* 
1c0d0 72 63 3d 3d 30 20 68 65 72 65 20 6d 65 61 6e 73  rc==0 here means
1c0e0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1c0f0 20 6b 65 79 73 20 72 61 6e 20 6f 75 74 20 6f 66   keys ran out of
1c100 20 66 69 65 6c 64 73 20 61 6e 64 0a 20 20 2a 2a   fields and.  **
1c110 20 61 6c 6c 20 74 68 65 20 66 69 65 6c 64 73 20   all the fields 
1c120 75 70 20 74 6f 20 74 68 61 74 20 70 6f 69 6e 74  up to that point
1c130 20 77 65 72 65 20 65 71 75 61 6c 2e 20 52 65 74   were equal. Ret
1c140 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 5f  urn the default_
1c150 72 63 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20 20  rc.  ** value.  
1c160 2a 2f 0a 20 20 72 63 20 3d 20 70 50 4b 65 79 32  */.  rc = pPKey2
1c170 2d 3e 64 65 66 61 75 6c 74 5f 72 63 3b 0a 0a 64  ->default_rc;..d
1c180 65 62 75 67 43 6f 6d 70 61 72 65 45 6e 64 3a 0a  ebugCompareEnd:.
1c190 20 20 69 66 28 20 64 65 73 69 72 65 64 52 65 73    if( desiredRes
1c1a0 75 6c 74 3d 3d 30 20 26 26 20 72 63 3d 3d 30 20  ult==0 && rc==0 
1c1b0 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
1c1c0 28 20 64 65 73 69 72 65 64 52 65 73 75 6c 74 3c  ( desiredResult<
1c1d0 30 20 26 26 20 72 63 3c 30 20 29 20 72 65 74 75  0 && rc<0 ) retu
1c1e0 72 6e 20 31 3b 0a 20 20 69 66 28 20 64 65 73 69  rn 1;.  if( desi
1c1f0 72 65 64 52 65 73 75 6c 74 3e 30 20 26 26 20 72  redResult>0 && r
1c200 63 3e 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  c>0 ) return 1;.
1c210 20 20 69 66 28 20 43 4f 52 52 55 50 54 5f 44 42    if( CORRUPT_DB
1c220 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
1c230 66 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  f( pKeyInfo->db-
1c240 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
1c250 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
1c260 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
1c270 23 69 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  #if SQLITE_DEBUG
1c280 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74 20 74 68 65  ./*.** Count the
1c290 20 6e 75 6d 62 65 72 20 6f 66 20 66 69 65 6c 64   number of field
1c2a0 73 20 28 61 2e 6b 2e 61 2e 20 63 6f 6c 75 6d 6e  s (a.k.a. column
1c2b0 73 29 20 69 6e 20 74 68 65 20 72 65 63 6f 72 64  s) in the record
1c2c0 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20 70 4b 65   given by.** pKe
1c2d0 79 2c 6e 4b 65 79 2e 20 20 54 68 65 20 76 65 72  y,nKey.  The ver
1c2e0 69 66 79 20 74 68 61 74 20 74 68 69 73 20 63 6f  ify that this co
1c2f0 75 6e 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e  unt is less than
1c300 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65   or equal to the
1c310 0a 2a 2a 20 6c 69 6d 69 74 20 67 69 76 65 6e 20  .** limit given 
1c320 62 79 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69  by pKeyInfo->nFi
1c330 65 6c 64 20 2b 20 70 4b 65 79 49 6e 66 6f 2d 3e  eld + pKeyInfo->
1c340 6e 58 46 69 65 6c 64 2e 0a 2a 2a 0a 2a 2a 20 49  nXField..**.** I
1c350 66 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  f this constrain
1c360 74 20 69 73 20 6e 6f 74 20 73 61 74 69 73 66 69  t is not satisfi
1c370 65 64 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ed, it means tha
1c380 74 20 74 68 65 20 68 69 67 68 2d 73 70 65 65 64  t the high-speed
1c390 0a 2a 2a 20 76 64 62 65 52 65 63 6f 72 64 43 6f  .** vdbeRecordCo
1c3a0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
1c3b0 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c3c0 53 74 72 69 6e 67 28 29 20 72 6f 75 74 69 6e 65  String() routine
1c3d0 73 20 77 69 6c 6c 0a 2a 2a 20 6e 6f 74 20 77 6f  s will.** not wo
1c3e0 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49  rk correctly.  I
1c3f0 66 20 74 68 69 73 20 61 73 73 65 72 74 28 29 20  f this assert() 
1c400 65 76 65 72 20 66 69 72 65 73 2c 20 69 74 20 70  ever fires, it p
1c410 72 6f 62 61 62 6c 79 20 6d 65 61 6e 73 0a 2a 2a  robably means.**
1c420 20 74 68 61 74 20 74 68 65 20 4b 65 79 49 6e 66   that the KeyInf
1c430 6f 2e 6e 46 69 65 6c 64 20 6f 72 20 4b 65 79 49  o.nField or KeyI
1c440 6e 66 6f 2e 6e 58 46 69 65 6c 64 20 76 61 6c 75  nfo.nXField valu
1c450 65 73 20 77 65 72 65 20 63 6f 6d 70 75 74 65 64  es were computed
1c460 0a 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 2e  .** incorrectly.
1c470 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1c480 76 64 62 65 41 73 73 65 72 74 46 69 65 6c 64 43  vdbeAssertFieldC
1c490 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69 74 73  ountWithinLimits
1c4a0 28 0a 20 20 69 6e 74 20 6e 4b 65 79 2c 20 63 6f  (.  int nKey, co
1c4b0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
1c4c0 20 20 2f 2a 20 54 68 65 20 72 65 63 6f 72 64 20    /* The record 
1c4d0 74 6f 20 76 65 72 69 66 79 20 2a 2f 20 0a 20 20  to verify */ .  
1c4e0 63 6f 6e 73 74 20 4b 65 79 49 6e 66 6f 20 2a 70  const KeyInfo *p
1c4f0 4b 65 79 49 6e 66 6f 20 20 20 20 20 20 20 2f 2a  KeyInfo       /*
1c500 20 43 6f 6d 70 61 72 65 20 73 69 7a 65 20 77 69   Compare size wi
1c510 74 68 20 74 68 69 73 20 4b 65 79 49 6e 66 6f 20  th this KeyInfo 
1c520 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 46 69 65  */.){.  int nFie
1c530 6c 64 20 3d 20 30 3b 0a 20 20 75 33 32 20 73 7a  ld = 0;.  u32 sz
1c540 48 64 72 3b 0a 20 20 75 33 32 20 69 64 78 3b 0a  Hdr;.  u32 idx;.
1c550 20 20 75 33 32 20 6e 6f 74 55 73 65 64 3b 0a 20    u32 notUsed;. 
1c560 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
1c570 63 68 61 72 20 2a 61 4b 65 79 20 3d 20 28 63 6f  char *aKey = (co
1c580 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
1c590 72 2a 29 70 4b 65 79 3b 0a 0a 20 20 69 66 28 20  r*)pKey;..  if( 
1c5a0 43 4f 52 52 55 50 54 5f 44 42 20 29 20 72 65 74  CORRUPT_DB ) ret
1c5b0 75 72 6e 3b 0a 20 20 69 64 78 20 3d 20 67 65 74  urn;.  idx = get
1c5c0 56 61 72 69 6e 74 33 32 28 61 4b 65 79 2c 20 73  Varint32(aKey, s
1c5d0 7a 48 64 72 29 3b 0a 20 20 61 73 73 65 72 74 28  zHdr);.  assert(
1c5e0 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73   nKey>=0 );.  as
1c5f0 73 65 72 74 28 20 73 7a 48 64 72 3c 3d 28 75 33  sert( szHdr<=(u3
1c600 32 29 6e 4b 65 79 20 29 3b 0a 20 20 77 68 69 6c  2)nKey );.  whil
1c610 65 28 20 69 64 78 3c 73 7a 48 64 72 20 29 7b 0a  e( idx<szHdr ){.
1c620 20 20 20 20 69 64 78 20 2b 3d 20 67 65 74 56 61      idx += getVa
1c630 72 69 6e 74 33 32 28 61 4b 65 79 2b 69 64 78 2c  rint32(aKey+idx,
1c640 20 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 6e   notUsed);.    n
1c650 46 69 65 6c 64 2b 2b 3b 0a 20 20 7d 0a 20 20 61  Field++;.  }.  a
1c660 73 73 65 72 74 28 20 6e 46 69 65 6c 64 20 3c 3d  ssert( nField <=
1c670 20 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c   pKeyInfo->nFiel
1c680 64 2b 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58 46 69  d+pKeyInfo->nXFi
1c690 65 6c 64 20 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23  eld );.}.#else.#
1c6a0 20 64 65 66 69 6e 65 20 76 64 62 65 41 73 73 65   define vdbeAsse
1c6b0 72 74 46 69 65 6c 64 43 6f 75 6e 74 57 69 74 68  rtFieldCountWith
1c6c0 69 6e 4c 69 6d 69 74 73 28 41 2c 42 2c 43 29 0a  inLimits(A,B,C).
1c6d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 42 6f  #endif../*.** Bo
1c6e0 74 68 20 2a 70 4d 65 6d 31 20 61 6e 64 20 2a 70  th *pMem1 and *p
1c6f0 4d 65 6d 32 20 63 6f 6e 74 61 69 6e 20 73 74 72  Mem2 contain str
1c700 69 6e 67 20 76 61 6c 75 65 73 2e 20 43 6f 6d 70  ing values. Comp
1c710 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c 75  are the two valu
1c720 65 73 0a 2a 2a 20 75 73 69 6e 67 20 74 68 65 20  es.** using the 
1c730 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1c740 63 65 20 70 43 6f 6c 6c 2e 20 41 73 20 75 73 75  ce pColl. As usu
1c750 61 6c 2c 20 72 65 74 75 72 6e 20 61 20 6e 65 67  al, return a neg
1c760 61 74 69 76 65 20 2c 20 7a 65 72 6f 0a 2a 2a 20  ative , zero.** 
1c770 6f 72 20 70 6f 73 69 74 69 76 65 20 76 61 6c 75  or positive valu
1c780 65 20 69 66 20 2a 70 4d 65 6d 31 20 69 73 20 6c  e if *pMem1 is l
1c790 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c 20  ess than, equal 
1c7a0 74 6f 20 6f 72 20 67 72 65 61 74 65 72 20 74 68  to or greater th
1c7b0 61 6e 20 0a 2a 2a 20 2a 70 4d 65 6d 32 2c 20 72  an .** *pMem2, r
1c7c0 65 73 70 65 63 74 69 76 65 6c 79 2e 20 53 69 6d  espectively. Sim
1c7d0 69 6c 61 72 20 69 6e 20 73 70 69 72 69 74 20 74  ilar in spirit t
1c7e0 6f 20 22 72 63 20 3d 20 28 2a 70 4d 65 6d 31 29  o "rc = (*pMem1)
1c7f0 20 2d 20 28 2a 70 4d 65 6d 32 29 3b 22 2e 0a 2a   - (*pMem2);"..*
1c800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 64 62  /.static int vdb
1c810 65 43 6f 6d 70 61 72 65 4d 65 6d 53 74 72 69 6e  eCompareMemStrin
1c820 67 28 0a 20 20 63 6f 6e 73 74 20 4d 65 6d 20 2a  g(.  const Mem *
1c830 70 4d 65 6d 31 2c 0a 20 20 63 6f 6e 73 74 20 4d  pMem1,.  const M
1c840 65 6d 20 2a 70 4d 65 6d 32 2c 0a 20 20 63 6f 6e  em *pMem2,.  con
1c850 73 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  st CollSeq *pCol
1c860 6c 2c 0a 20 20 75 38 20 2a 70 72 63 45 72 72 20  l,.  u8 *prcErr 
1c870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c880 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 4f 4f       /* If an OO
1c890 4d 20 6f 63 63 75 72 73 2c 20 73 65 74 20 74 6f  M occurs, set to
1c8a0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 2a 2f   SQLITE_NOMEM */
1c8b0 0a 29 7b 0a 20 20 69 66 28 20 70 4d 65 6d 31 2d  .){.  if( pMem1-
1c8c0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
1c8d0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 73   ){.    /* The s
1c8e0 74 72 69 6e 67 73 20 61 72 65 20 61 6c 72 65 61  trings are alrea
1c8f0 64 79 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63  dy in the correc
1c900 74 20 65 6e 63 6f 64 69 6e 67 2e 20 20 43 61 6c  t encoding.  Cal
1c910 6c 20 74 68 65 0a 20 20 20 20 20 2a 2a 20 63 6f  l the.     ** co
1c920 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
1c930 6e 20 64 69 72 65 63 74 6c 79 20 2a 2f 0a 20 20  n directly */.  
1c940 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 2d 3e    return pColl->
1c950 78 43 6d 70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65  xCmp(pColl->pUse
1c960 72 2c 70 4d 65 6d 31 2d 3e 6e 2c 70 4d 65 6d 31  r,pMem1->n,pMem1
1c970 2d 3e 7a 2c 70 4d 65 6d 32 2d 3e 6e 2c 70 4d 65  ->z,pMem2->n,pMe
1c980 6d 32 2d 3e 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  m2->z);.  }else{
1c990 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1c9a0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 76 31 2c   const void *v1,
1c9b0 20 2a 76 32 3b 0a 20 20 20 20 69 6e 74 20 6e 31   *v2;.    int n1
1c9c0 2c 20 6e 32 3b 0a 20 20 20 20 4d 65 6d 20 63 31  , n2;.    Mem c1
1c9d0 3b 0a 20 20 20 20 4d 65 6d 20 63 32 3b 0a 20 20  ;.    Mem c2;.  
1c9e0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
1c9f0 49 6e 69 74 28 26 63 31 2c 20 70 4d 65 6d 31 2d  Init(&c1, pMem1-
1ca00 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29 3b 0a  >db, MEM_Null);.
1ca10 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d      sqlite3VdbeM
1ca20 65 6d 49 6e 69 74 28 26 63 32 2c 20 70 4d 65 6d  emInit(&c2, pMem
1ca30 31 2d 3e 64 62 2c 20 4d 45 4d 5f 4e 75 6c 6c 29  1->db, MEM_Null)
1ca40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1ca50 65 4d 65 6d 53 68 61 6c 6c 6f 77 43 6f 70 79 28  eMemShallowCopy(
1ca60 26 63 31 2c 20 70 4d 65 6d 31 2c 20 4d 45 4d 5f  &c1, pMem1, MEM_
1ca70 45 70 68 65 6d 29 3b 0a 20 20 20 20 73 71 6c 69  Ephem);.    sqli
1ca80 74 65 33 56 64 62 65 4d 65 6d 53 68 61 6c 6c 6f  te3VdbeMemShallo
1ca90 77 43 6f 70 79 28 26 63 32 2c 20 70 4d 65 6d 32  wCopy(&c2, pMem2
1caa0 2c 20 4d 45 4d 5f 45 70 68 65 6d 29 3b 0a 20 20  , MEM_Ephem);.  
1cab0 20 20 76 31 20 3d 20 73 71 6c 69 74 65 33 56 61    v1 = sqlite3Va
1cac0 6c 75 65 54 65 78 74 28 28 73 71 6c 69 74 65 33  lueText((sqlite3
1cad0 5f 76 61 6c 75 65 2a 29 26 63 31 2c 20 70 43 6f  _value*)&c1, pCo
1cae0 6c 6c 2d 3e 65 6e 63 29 3b 0a 20 20 20 20 6e 31  ll->enc);.    n1
1caf0 20 3d 20 76 31 3d 3d 30 20 3f 20 30 20 3a 20 63   = v1==0 ? 0 : c
1cb00 31 2e 6e 3b 0a 20 20 20 20 76 32 20 3d 20 73 71  1.n;.    v2 = sq
1cb10 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 28  lite3ValueText((
1cb20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 29 26  sqlite3_value*)&
1cb30 63 32 2c 20 70 43 6f 6c 6c 2d 3e 65 6e 63 29 3b  c2, pColl->enc);
1cb40 0a 20 20 20 20 6e 32 20 3d 20 76 32 3d 3d 30 20  .    n2 = v2==0 
1cb50 3f 20 30 20 3a 20 63 32 2e 6e 3b 0a 20 20 20 20  ? 0 : c2.n;.    
1cb60 72 63 20 3d 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70  rc = pColl->xCmp
1cb70 28 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 2c 20 6e  (pColl->pUser, n
1cb80 31 2c 20 76 31 2c 20 6e 32 2c 20 76 32 29 3b 0a  1, v1, n2, v2);.
1cb90 20 20 20 20 69 66 28 20 28 76 31 3d 3d 30 20 7c      if( (v1==0 |
1cba0 7c 20 76 32 3d 3d 30 29 20 26 26 20 70 72 63 45  | v2==0) && prcE
1cbb0 72 72 20 29 20 2a 70 72 63 45 72 72 20 3d 20 53  rr ) *prcErr = S
1cbc0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
1cbd0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cbe0 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 31 29  eMemRelease(&c1)
1cbf0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
1cc00 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 63 32 29  eMemRelease(&c2)
1cc10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
1cc20 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
1cc30 65 20 69 6e 70 75 74 20 70 42 6c 6f 62 20 69 73  e input pBlob is
1cc40 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62   guaranteed to b
1cc50 65 20 61 20 42 6c 6f 62 20 74 68 61 74 20 69 73  e a Blob that is
1cc60 20 6e 6f 74 20 6d 61 72 6b 65 64 0a 2a 2a 20 77   not marked.** w
1cc70 69 74 68 20 4d 45 4d 5f 5a 65 72 6f 2e 20 20 52  ith MEM_Zero.  R
1cc80 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69 74  eturn true if it
1cc90 20 63 6f 75 6c 64 20 62 65 20 61 20 7a 65 72 6f   could be a zero
1cca0 2d 62 6c 6f 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  -blob..*/.static
1ccb0 20 69 6e 74 20 69 73 41 6c 6c 5a 65 72 6f 28 63   int isAllZero(c
1ccc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
1ccd0 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
1cce0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
1ccf0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69  ++){.    if( z[i
1cd00 5d 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ] ) return 0;.  
1cd10 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1cd20 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
1cd30 77 6f 20 62 6c 6f 62 73 2e 20 20 52 65 74 75 72  wo blobs.  Retur
1cd40 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f  n negative, zero
1cd50 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66  , or positive if
1cd60 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 73   the first.** is
1cd70 20 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61   less than, equa
1cd80 6c 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72  l to, or greater
1cd90 20 74 68 61 6e 20 74 68 65 20 73 65 63 6f 6e 64   than the second
1cda0 2c 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  , respectively..
1cdb0 2a 2a 20 49 66 20 6f 6e 65 20 62 6c 6f 62 20 69  ** If one blob i
1cdc0 73 20 61 20 70 72 65 66 69 78 20 6f 66 20 74 68  s a prefix of th
1cdd0 65 20 6f 74 68 65 72 2c 20 74 68 65 6e 20 74 68  e other, then th
1cde0 65 20 73 68 6f 72 74 65 72 20 69 73 20 74 68 65  e shorter is the
1cdf0 20 6c 65 73 73 6f 72 2e 0a 2a 2f 0a 73 74 61 74   lessor..*/.stat
1ce00 69 63 20 53 51 4c 49 54 45 5f 4e 4f 49 4e 4c 49  ic SQLITE_NOINLI
1ce10 4e 45 20 69 6e 74 20 73 71 6c 69 74 65 33 42 6c  NE int sqlite3Bl
1ce20 6f 62 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20  obCompare(const 
1ce30 4d 65 6d 20 2a 70 42 31 2c 20 63 6f 6e 73 74 20  Mem *pB1, const 
1ce40 4d 65 6d 20 2a 70 42 32 29 7b 0a 20 20 69 6e 74  Mem *pB2){.  int
1ce50 20 63 3b 0a 20 20 69 6e 74 20 6e 31 20 3d 20 70   c;.  int n1 = p
1ce60 42 31 2d 3e 6e 3b 0a 20 20 69 6e 74 20 6e 32 20  B1->n;.  int n2 
1ce70 3d 20 70 42 32 2d 3e 6e 3b 0a 0a 20 20 2f 2a 20  = pB2->n;..  /* 
1ce80 49 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  It is possible t
1ce90 6f 20 68 61 76 65 20 61 20 42 6c 6f 62 20 76 61  o have a Blob va
1cea0 6c 75 65 20 74 68 61 74 20 68 61 73 20 73 6f 6d  lue that has som
1ceb0 65 20 6e 6f 6e 2d 7a 65 72 6f 20 63 6f 6e 74 65  e non-zero conte
1cec0 6e 74 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 65 64  nt.  ** followed
1ced0 20 62 79 20 7a 65 72 6f 20 63 6f 6e 74 65 6e 74   by zero content
1cee0 2e 20 20 42 75 74 20 74 68 61 74 20 6f 6e 6c 79  .  But that only
1cef0 20 63 6f 6d 65 73 20 75 70 20 66 6f 72 20 42 6c   comes up for Bl
1cf00 6f 62 73 20 66 6f 72 6d 65 64 0a 20 20 2a 2a 20  obs formed.  ** 
1cf10 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65  by the OP_MakeRe
1cf20 63 6f 72 64 20 6f 70 63 6f 64 65 2c 20 61 6e 64  cord opcode, and
1cf30 20 73 75 63 68 20 42 6c 6f 62 73 20 6e 65 76 65   such Blobs neve
1cf40 72 20 67 65 74 20 70 61 73 73 65 64 20 69 6e 74  r get passed int
1cf50 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 4d 65  o.  ** sqlite3Me
1cf60 6d 43 6f 6d 70 61 72 65 28 29 2e 20 2a 2f 0a 20  mCompare(). */. 
1cf70 20 61 73 73 65 72 74 28 20 28 70 42 31 2d 3e 66   assert( (pB1->f
1cf80 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29  lags & MEM_Zero)
1cf90 3d 3d 30 20 7c 7c 20 6e 31 3d 3d 30 20 29 3b 0a  ==0 || n1==0 );.
1cfa0 20 20 61 73 73 65 72 74 28 20 28 70 42 32 2d 3e    assert( (pB2->
1cfb0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f  flags & MEM_Zero
1cfc0 29 3d 3d 30 20 7c 7c 20 6e 32 3d 3d 30 20 29 3b  )==0 || n2==0 );
1cfd0 0a 0a 20 20 69 66 28 20 28 70 42 31 2d 3e 66 6c  ..  if( (pB1->fl
1cfe0 61 67 73 7c 70 42 32 2d 3e 66 6c 61 67 73 29 20  ags|pB2->flags) 
1cff0 26 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20  & MEM_Zero ){.  
1d000 20 20 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73    if( pB1->flags
1d010 20 26 20 70 42 32 2d 3e 66 6c 61 67 73 20 26 20   & pB2->flags & 
1d020 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20 20  MEM_Zero ){.    
1d030 20 20 72 65 74 75 72 6e 20 70 42 31 2d 3e 75 2e    return pB1->u.
1d040 6e 5a 65 72 6f 20 2d 20 70 42 32 2d 3e 75 2e 6e  nZero - pB2->u.n
1d050 5a 65 72 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Zero;.    }else 
1d060 69 66 28 20 70 42 31 2d 3e 66 6c 61 67 73 20 26  if( pB1->flags &
1d070 20 4d 45 4d 5f 5a 65 72 6f 20 29 7b 0a 20 20 20   MEM_Zero ){.   
1d080 20 20 20 69 66 28 20 21 69 73 41 6c 6c 5a 65 72     if( !isAllZer
1d090 6f 28 70 42 32 2d 3e 7a 2c 20 70 42 32 2d 3e 6e  o(pB2->z, pB2->n
1d0a0 29 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  ) ) return -1;. 
1d0b0 20 20 20 20 20 72 65 74 75 72 6e 20 70 42 31 2d       return pB1-
1d0c0 3e 75 2e 6e 5a 65 72 6f 20 2d 20 6e 32 3b 0a 20  >u.nZero - n2;. 
1d0d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d0e0 69 66 28 20 21 69 73 41 6c 6c 5a 65 72 6f 28 70  if( !isAllZero(p
1d0f0 42 31 2d 3e 7a 2c 20 70 42 31 2d 3e 6e 29 20 29  B1->z, pB1->n) )
1d100 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20   return +1;.    
1d110 20 20 72 65 74 75 72 6e 20 6e 31 20 2d 20 70 42    return n1 - pB
1d120 32 2d 3e 75 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20  2->u.nZero;.    
1d130 7d 0a 20 20 7d 0a 20 20 63 20 3d 20 6d 65 6d 63  }.  }.  c = memc
1d140 6d 70 28 70 42 31 2d 3e 7a 2c 20 70 42 32 2d 3e  mp(pB1->z, pB2->
1d150 7a 2c 20 6e 31 3e 6e 32 20 3f 20 6e 32 20 3a 20  z, n1>n2 ? n2 : 
1d160 6e 31 29 3b 0a 20 20 69 66 28 20 63 20 29 20 72  n1);.  if( c ) r
1d170 65 74 75 72 6e 20 63 3b 0a 20 20 72 65 74 75 72  eturn c;.  retur
1d180 6e 20 6e 31 20 2d 20 6e 32 3b 0a 7d 0a 0a 2f 2a  n n1 - n2;.}../*
1d190 0a 2a 2a 20 44 6f 20 61 20 63 6f 6d 70 61 72 69  .** Do a compari
1d1a0 73 6f 6e 20 62 65 74 77 65 65 6e 20 61 20 36 34  son between a 64
1d1b0 2d 62 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65  -bit signed inte
1d1c0 67 65 72 20 61 6e 64 20 61 20 36 34 2d 62 69 74  ger and a 64-bit
1d1d0 20 66 6c 6f 61 74 69 6e 67 2d 70 6f 69 6e 74 0a   floating-point.
1d1e0 2a 2a 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ** number.  Retu
1d1f0 72 6e 20 6e 65 67 61 74 69 76 65 2c 20 7a 65 72  rn negative, zer
1d200 6f 2c 20 6f 72 20 70 6f 73 69 74 69 76 65 20 69  o, or positive i
1d210 66 20 74 68 65 20 66 69 72 73 74 20 28 69 36 34  f the first (i64
1d220 29 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 0a  ) is less than,.
1d230 2a 2a 20 65 71 75 61 6c 20 74 6f 2c 20 6f 72 20  ** equal to, or 
1d240 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
1d250 20 73 65 63 6f 6e 64 20 28 64 6f 75 62 6c 65 29   second (double)
1d260 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d270 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43  sqlite3IntFloatC
1d280 6f 6d 70 61 72 65 28 69 36 34 20 69 2c 20 64 6f  ompare(i64 i, do
1d290 75 62 6c 65 20 72 29 7b 0a 20 20 69 66 28 20 73  uble r){.  if( s
1d2a0 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45  izeof(LONGDOUBLE
1d2b0 5f 54 59 50 45 29 3e 38 20 29 7b 0a 20 20 20 20  _TYPE)>8 ){.    
1d2c0 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59 50 45 20  LONGDOUBLE_TYPE 
1d2d0 78 20 3d 20 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f  x = (LONGDOUBLE_
1d2e0 54 59 50 45 29 69 3b 0a 20 20 20 20 69 66 28 20  TYPE)i;.    if( 
1d2f0 78 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  x<r ) return -1;
1d300 0a 20 20 20 20 69 66 28 20 78 3e 72 20 29 20 72  .    if( x>r ) r
1d310 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72 65  eturn +1;.    re
1d320 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
1d330 0a 20 20 20 20 69 36 34 20 79 3b 0a 20 20 20 20  .    i64 y;.    
1d340 64 6f 75 62 6c 65 20 73 3b 0a 20 20 20 20 69 66  double s;.    if
1d350 28 20 72 3c 2d 39 32 32 33 33 37 32 30 33 36 38  ( r<-92233720368
1d360 35 34 37 37 35 38 30 38 2e 30 20 29 20 72 65 74  54775808.0 ) ret
1d370 75 72 6e 20 2b 31 3b 0a 20 20 20 20 69 66 28 20  urn +1;.    if( 
1d380 72 3e 39 32 32 33 33 37 32 30 33 36 38 35 34 37  r>92233720368547
1d390 37 35 38 30 37 2e 30 20 29 20 72 65 74 75 72 6e  75807.0 ) return
1d3a0 20 2d 31 3b 0a 20 20 20 20 79 20 3d 20 28 69 36   -1;.    y = (i6
1d3b0 34 29 72 3b 0a 20 20 20 20 69 66 28 20 69 3c 79  4)r;.    if( i<y
1d3c0 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20   ) return -1;.  
1d3d0 20 20 69 66 28 20 69 3e 79 20 29 7b 0a 20 20 20    if( i>y ){.   
1d3e0 20 20 20 69 66 28 20 79 3d 3d 53 4d 41 4c 4c 45     if( y==SMALLE
1d3f0 53 54 5f 49 4e 54 36 34 20 26 26 20 72 3e 30 2e  ST_INT64 && r>0.
1d400 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
1d410 20 20 20 20 20 72 65 74 75 72 6e 20 2b 31 3b 0a       return +1;.
1d420 20 20 20 20 7d 0a 20 20 20 20 73 20 3d 20 28 64      }.    s = (d
1d430 6f 75 62 6c 65 29 69 3b 0a 20 20 20 20 69 66 28  ouble)i;.    if(
1d440 20 73 3c 72 20 29 20 72 65 74 75 72 6e 20 2d 31   s<r ) return -1
1d450 3b 0a 20 20 20 20 69 66 28 20 73 3e 72 20 29 20  ;.    if( s>r ) 
1d460 72 65 74 75 72 6e 20 2b 31 3b 0a 20 20 20 20 72  return +1;.    r
1d470 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
1d480 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 68  /*.** Compare th
1d490 65 20 76 61 6c 75 65 73 20 63 6f 6e 74 61 69 6e  e values contain
1d4a0 65 64 20 62 79 20 74 68 65 20 74 77 6f 20 6d 65  ed by the two me
1d4b0 6d 6f 72 79 20 63 65 6c 6c 73 2c 20 72 65 74 75  mory cells, retu
1d4c0 72 6e 69 6e 67 0a 2a 2a 20 6e 65 67 61 74 69 76  rning.** negativ
1d4d0 65 2c 20 7a 65 72 6f 20 6f 72 20 70 6f 73 69 74  e, zero or posit
1d4e0 69 76 65 20 69 66 20 70 4d 65 6d 31 20 69 73 20  ive if pMem1 is 
1d4f0 6c 65 73 73 20 74 68 61 6e 2c 20 65 71 75 61 6c  less than, equal
1d500 20 74 6f 2c 20 6f 72 20 67 72 65 61 74 65 72 0a   to, or greater.
1d510 2a 2a 20 74 68 61 6e 20 70 4d 65 6d 32 2e 20 53  ** than pMem2. S
1d520 6f 72 74 69 6e 67 20 6f 72 64 65 72 20 69 73 20  orting order is 
1d530 4e 55 4c 4c 27 73 20 66 69 72 73 74 2c 20 66 6f  NULL's first, fo
1d540 6c 6c 6f 77 65 64 20 62 79 20 6e 75 6d 62 65 72  llowed by number
1d550 73 20 28 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  s (integers.** a
1d560 6e 64 20 72 65 61 6c 73 29 20 73 6f 72 74 65 64  nd reals) sorted
1d570 20 6e 75 6d 65 72 69 63 61 6c 6c 79 2c 20 66 6f   numerically, fo
1d580 6c 6c 6f 77 65 64 20 62 79 20 74 65 78 74 20 6f  llowed by text o
1d590 72 64 65 72 65 64 20 62 79 20 74 68 65 20 63 6f  rdered by the co
1d5a0 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65  llating.** seque
1d5b0 6e 63 65 20 70 43 6f 6c 6c 20 61 6e 64 20 66 69  nce pColl and fi
1d5c0 6e 61 6c 6c 79 20 62 6c 6f 62 27 73 20 6f 72 64  nally blob's ord
1d5d0 65 72 65 64 20 62 79 20 6d 65 6d 63 6d 70 28 29  ered by memcmp()
1d5e0 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20 4e 55 4c 4c  ..**.** Two NULL
1d5f0 20 76 61 6c 75 65 73 20 61 72 65 20 63 6f 6e 73   values are cons
1d600 69 64 65 72 65 64 20 65 71 75 61 6c 20 62 79 20  idered equal by 
1d610 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
1d620 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 65 6d  /.int sqlite3Mem
1d630 43 6f 6d 70 61 72 65 28 63 6f 6e 73 74 20 4d 65  Compare(const Me
1d640 6d 20 2a 70 4d 65 6d 31 2c 20 63 6f 6e 73 74 20  m *pMem1, const 
1d650 4d 65 6d 20 2a 70 4d 65 6d 32 2c 20 63 6f 6e 73  Mem *pMem2, cons
1d660 74 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c  t CollSeq *pColl
1d670 29 7b 0a 20 20 69 6e 74 20 66 31 2c 20 66 32 3b  ){.  int f1, f2;
1d680 0a 20 20 69 6e 74 20 63 6f 6d 62 69 6e 65 64 5f  .  int combined_
1d690 66 6c 61 67 73 3b 0a 0a 20 20 66 31 20 3d 20 70  flags;..  f1 = p
1d6a0 4d 65 6d 31 2d 3e 66 6c 61 67 73 3b 0a 20 20 66  Mem1->flags;.  f
1d6b0 32 20 3d 20 70 4d 65 6d 32 2d 3e 66 6c 61 67 73  2 = pMem2->flags
1d6c0 3b 0a 20 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  ;.  combined_fla
1d6d0 67 73 20 3d 20 66 31 7c 66 32 3b 0a 20 20 61 73  gs = f1|f2;.  as
1d6e0 73 65 72 74 28 20 28 63 6f 6d 62 69 6e 65 64 5f  sert( (combined_
1d6f0 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 6f 77 53  flags & MEM_RowS
1d700 65 74 29 3d 3d 30 20 29 3b 0a 20 0a 20 20 2f 2a  et)==0 );. .  /*
1d710 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69 73   If one value is
1d720 20 4e 55 4c 4c 2c 20 69 74 20 69 73 20 6c 65 73   NULL, it is les
1d730 73 20 74 68 61 6e 20 74 68 65 20 6f 74 68 65 72  s than the other
1d740 2e 20 49 66 20 62 6f 74 68 20 76 61 6c 75 65 73  . If both values
1d750 0a 20 20 2a 2a 20 61 72 65 20 4e 55 4c 4c 2c 20  .  ** are NULL, 
1d760 72 65 74 75 72 6e 20 30 2e 0a 20 20 2a 2f 0a 20  return 0..  */. 
1d770 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c   if( combined_fl
1d780 61 67 73 26 4d 45 4d 5f 4e 75 6c 6c 20 29 7b 0a  ags&MEM_Null ){.
1d790 20 20 20 20 72 65 74 75 72 6e 20 28 66 32 26 4d      return (f2&M
1d7a0 45 4d 5f 4e 75 6c 6c 29 20 2d 20 28 66 31 26 4d  EM_Null) - (f1&M
1d7b0 45 4d 5f 4e 75 6c 6c 29 3b 0a 20 20 7d 0a 0a 20  EM_Null);.  }.. 
1d7c0 20 2f 2a 20 41 74 20 6c 65 61 73 74 20 6f 6e 65   /* At least one
1d7d0 20 6f 66 20 74 68 65 20 74 77 6f 20 76 61 6c 75   of the two valu
1d7e0 65 73 20 69 73 20 61 20 6e 75 6d 62 65 72 0a 20  es is a number. 
1d7f0 20 2a 2f 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e   */.  if( combin
1d800 65 64 5f 66 6c 61 67 73 26 28 4d 45 4d 5f 49 6e  ed_flags&(MEM_In
1d810 74 7c 4d 45 4d 5f 52 65 61 6c 29 20 29 7b 0a 20  t|MEM_Real) ){. 
1d820 20 20 20 69 66 28 20 28 66 31 20 26 20 66 32 20     if( (f1 & f2 
1d830 26 20 4d 45 4d 5f 49 6e 74 29 21 3d 30 20 29 7b  & MEM_Int)!=0 ){
1d840 0a 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31  .      if( pMem1
1d850 2d 3e 75 2e 69 20 3c 20 70 4d 65 6d 32 2d 3e 75  ->u.i < pMem2->u
1d860 2e 69 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .i ) return -1;.
1d870 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 31 2d        if( pMem1-
1d880 3e 75 2e 69 20 3e 20 70 4d 65 6d 32 2d 3e 75 2e  >u.i > pMem2->u.
1d890 69 20 29 20 72 65 74 75 72 6e 20 2b 31 3b 0a 20  i ) return +1;. 
1d8a0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
1d8b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 66 31     }.    if( (f1
1d8c0 20 26 20 66 32 20 26 20 4d 45 4d 5f 52 65 61 6c   & f2 & MEM_Real
1d8d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
1d8e0 28 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3c 20 70  ( pMem1->u.r < p
1d8f0 4d 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75  Mem2->u.r ) retu
1d900 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 69 66 28  rn -1;.      if(
1d910 20 70 4d 65 6d 31 2d 3e 75 2e 72 20 3e 20 70 4d   pMem1->u.r > pM
1d920 65 6d 32 2d 3e 75 2e 72 20 29 20 72 65 74 75 72  em2->u.r ) retur
1d930 6e 20 2b 31 3b 0a 20 20 20 20 20 20 72 65 74 75  n +1;.      retu
1d940 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1d950 69 66 28 20 28 66 31 26 4d 45 4d 5f 49 6e 74 29  if( (f1&MEM_Int)
1d960 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
1d970 20 28 66 32 26 4d 45 4d 5f 52 65 61 6c 29 21 3d   (f2&MEM_Real)!=
1d980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
1d990 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 74 46 6c  urn sqlite3IntFl
1d9a0 6f 61 74 43 6f 6d 70 61 72 65 28 70 4d 65 6d 31  oatCompare(pMem1
1d9b0 2d 3e 75 2e 69 2c 20 70 4d 65 6d 32 2d 3e 75 2e  ->u.i, pMem2->u.
1d9c0 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  r);.      }else{
1d9d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1d9e0 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1d9f0 7d 0a 20 20 20 20 69 66 28 20 28 66 31 26 4d 45  }.    if( (f1&ME
1da00 4d 5f 52 65 61 6c 29 21 3d 30 20 29 7b 0a 20 20  M_Real)!=0 ){.  
1da10 20 20 20 20 69 66 28 20 28 66 32 26 4d 45 4d 5f      if( (f2&MEM_
1da20 49 6e 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Int)!=0 ){.     
1da30 20 20 20 72 65 74 75 72 6e 20 2d 73 71 6c 69 74     return -sqlit
1da40 65 33 49 6e 74 46 6c 6f 61 74 43 6f 6d 70 61 72  e3IntFloatCompar
1da50 65 28 70 4d 65 6d 32 2d 3e 75 2e 69 2c 20 70 4d  e(pMem2->u.i, pM
1da60 65 6d 31 2d 3e 75 2e 72 29 3b 0a 20 20 20 20 20  em1->u.r);.     
1da70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1da80 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
1da90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74   }.    }.    ret
1daa0 75 72 6e 20 2b 31 3b 0a 20 20 7d 0a 0a 20 20 2f  urn +1;.  }..  /
1dab0 2a 20 49 66 20 6f 6e 65 20 76 61 6c 75 65 20 69  * If one value i
1dac0 73 20 61 20 73 74 72 69 6e 67 20 61 6e 64 20 74  s a string and t
1dad0 68 65 20 6f 74 68 65 72 20 69 73 20 61 20 62 6c  he other is a bl
1dae0 6f 62 2c 20 74 68 65 20 73 74 72 69 6e 67 20 69  ob, the string i
1daf0 73 20 6c 65 73 73 2e 0a 20 20 2a 2a 20 49 66 20  s less..  ** If 
1db00 62 6f 74 68 20 61 72 65 20 73 74 72 69 6e 67 73  both are strings
1db10 2c 20 63 6f 6d 70 61 72 65 20 75 73 69 6e 67 20  , compare using 
1db20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  the collating fu
1db30 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20  nctions..  */.  
1db40 69 66 28 20 63 6f 6d 62 69 6e 65 64 5f 66 6c 61  if( combined_fla
1db50 67 73 26 4d 45 4d 5f 53 74 72 20 29 7b 0a 20 20  gs&MEM_Str ){.  
1db60 20 20 69 66 28 20 28 66 31 20 26 20 4d 45 4d 5f    if( (f1 & MEM_
1db70 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Str)==0 ){.     
1db80 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
1db90 0a 20 20 20 20 69 66 28 20 28 66 32 20 26 20 4d  .    if( (f2 & M
1dba0 45 4d 5f 53 74 72 29 3d 3d 30 20 29 7b 0a 20 20  EM_Str)==0 ){.  
1dbb0 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1dbc0 20 20 20 7d 0a 0a 20 20 20 20 61 73 73 65 72 74     }..    assert
1dbd0 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 70 4d  ( pMem1->enc==pM
1dbe0 65 6d 32 2d 3e 65 6e 63 20 7c 7c 20 70 4d 65 6d  em2->enc || pMem
1dbf0 31 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  1->db->mallocFai
1dc00 6c 65 64 20 29 3b 0a 20 20 20 20 61 73 73 65 72  led );.    asser
1dc10 74 28 20 70 4d 65 6d 31 2d 3e 65 6e 63 3d 3d 53  t( pMem1->enc==S
1dc20 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 0a 20  QLITE_UTF8 || . 
1dc30 20 20 20 20 20 20 20 20 20 20 20 70 4d 65 6d 31             pMem1
1dc40 2d 3e 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  ->enc==SQLITE_UT
1dc50 46 31 36 4c 45 20 7c 7c 20 70 4d 65 6d 31 2d 3e  F16LE || pMem1->
1dc60 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
1dc70 36 42 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 54  6BE );..    /* T
1dc80 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1dc90 75 65 6e 63 65 20 6d 75 73 74 20 62 65 20 64 65  uence must be de
1dca0 66 69 6e 65 64 20 61 74 20 74 68 69 73 20 70 6f  fined at this po
1dcb0 69 6e 74 2c 20 65 76 65 6e 20 69 66 0a 20 20 20  int, even if.   
1dcc0 20 2a 2a 20 74 68 65 20 75 73 65 72 20 64 65 6c   ** the user del
1dcd0 65 74 65 73 20 74 68 65 20 63 6f 6c 6c 61 74 69  etes the collati
1dce0 6f 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65  on sequence afte
1dcf0 72 20 74 68 65 20 76 64 62 65 20 70 72 6f 67 72  r the vdbe progr
1dd00 61 6d 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 6d  am is.    ** com
1dd10 70 69 6c 65 64 20 28 74 68 69 73 20 77 61 73 20  piled (this was 
1dd20 6e 6f 74 20 61 6c 77 61 79 73 20 74 68 65 20 63  not always the c
1dd30 61 73 65 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ase)..    */.   
1dd40 20 61 73 73 65 72 74 28 20 21 70 43 6f 6c 6c 20   assert( !pColl 
1dd50 7c 7c 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29  || pColl->xCmp )
1dd60 3b 0a 0a 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  ;..    if( pColl
1dd70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1dd80 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d 53   vdbeCompareMemS
1dd90 74 72 69 6e 67 28 70 4d 65 6d 31 2c 20 70 4d 65  tring(pMem1, pMe
1dda0 6d 32 2c 20 70 43 6f 6c 6c 2c 20 30 29 3b 0a 20  m2, pColl, 0);. 
1ddb0 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66 20 61     }.    /* If a
1ddc0 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 77 61   NULL pointer wa
1ddd0 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  s passed as the 
1dde0 63 6f 6c 6c 61 74 65 20 66 75 6e 63 74 69 6f 6e  collate function
1ddf0 2c 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 0a 20  , fall through. 
1de00 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 62 6c 6f     ** to the blo
1de10 62 20 63 61 73 65 20 61 6e 64 20 75 73 65 20 6d  b case and use m
1de20 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a 20 20 7d  emcmp().  */.  }
1de30 0a 20 0a 20 20 2f 2a 20 42 6f 74 68 20 76 61 6c  . .  /* Both val
1de40 75 65 73 20 6d 75 73 74 20 62 65 20 62 6c 6f 62  ues must be blob
1de50 73 2e 20 20 43 6f 6d 70 61 72 65 20 75 73 69 6e  s.  Compare usin
1de60 67 20 6d 65 6d 63 6d 70 28 29 2e 20 20 2a 2f 0a  g memcmp().  */.
1de70 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1de80 42 6c 6f 62 43 6f 6d 70 61 72 65 28 70 4d 65 6d  BlobCompare(pMem
1de90 31 2c 20 70 4d 65 6d 32 29 3b 0a 7d 0a 0a 0a 2f  1, pMem2);.}.../
1dea0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
1deb0 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
1dec0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
1ded0 69 73 20 61 20 73 65 72 69 61 6c 2d 74 79 70 65  is a serial-type
1dee0 20 74 68 61 74 0a 2a 2a 20 63 6f 72 72 65 73 70   that.** corresp
1def0 6f 6e 64 73 20 74 6f 20 61 6e 20 69 6e 74 65 67  onds to an integ
1df00 65 72 20 2d 20 61 6c 6c 20 76 61 6c 75 65 73 20  er - all values 
1df10 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 39 20  between 1 and 9 
1df20 69 6e 63 6c 75 73 69 76 65 20 0a 2a 2a 20 65 78  inclusive .** ex
1df30 63 65 70 74 20 37 2e 20 54 68 65 20 73 65 63 6f  cept 7. The seco
1df40 6e 64 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62  nd points to a b
1df50 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
1df60 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
1df70 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
1df80 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 65 72  according to ser
1df90 69 61 6c 5f 74 79 70 65 2e 20 54 68 69 73 20 66  ial_type. This f
1dfa0 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c  unction deserial
1dfb0 69 7a 65 73 0a 2a 2a 20 61 6e 64 20 72 65 74 75  izes.** and retu
1dfc0 72 6e 73 20 74 68 65 20 76 61 6c 75 65 2e 0a 2a  rns the value..*
1dfd0 2f 0a 73 74 61 74 69 63 20 69 36 34 20 76 64 62  /.static i64 vdb
1dfe0 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1dff0 28 75 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65  (u32 serial_type
1e000 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79  , const u8 *aKey
1e010 29 7b 0a 20 20 75 33 32 20 79 3b 0a 20 20 61 73  ){.  u32 y;.  as
1e020 73 65 72 74 28 20 43 4f 52 52 55 50 54 5f 44 42  sert( CORRUPT_DB
1e030 20 7c 7c 20 28 73 65 72 69 61 6c 5f 74 79 70 65   || (serial_type
1e040 3e 3d 31 20 26 26 20 73 65 72 69 61 6c 5f 74 79  >=1 && serial_ty
1e050 70 65 3c 3d 39 20 26 26 20 73 65 72 69 61 6c 5f  pe<=9 && serial_
1e060 74 79 70 65 21 3d 37 29 20 29 3b 0a 20 20 73 77  type!=7) );.  sw
1e070 69 74 63 68 28 20 73 65 72 69 61 6c 5f 74 79 70  itch( serial_typ
1e080 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 30 3a  e ){.    case 0:
1e090 0a 20 20 20 20 63 61 73 65 20 31 3a 0a 20 20 20  .    case 1:.   
1e0a0 20 20 20 74 65 73 74 63 61 73 65 28 20 61 4b 65     testcase( aKe
1e0b0 79 5b 30 5d 26 30 78 38 30 20 29 3b 0a 20 20 20  y[0]&0x80 );.   
1e0c0 20 20 20 72 65 74 75 72 6e 20 4f 4e 45 5f 42 59     return ONE_BY
1e0d0 54 45 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20  TE_INT(aKey);.  
1e0e0 20 20 63 61 73 65 20 32 3a 0a 20 20 20 20 20 20    case 2:.      
1e0f0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e100 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e110 72 65 74 75 72 6e 20 54 57 4f 5f 42 59 54 45 5f  return TWO_BYTE_
1e120 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63  INT(aKey);.    c
1e130 61 73 65 20 33 3a 0a 20 20 20 20 20 20 74 65 73  ase 3:.      tes
1e140 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26 30  tcase( aKey[0]&0
1e150 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74  x80 );.      ret
1e160 75 72 6e 20 54 48 52 45 45 5f 42 59 54 45 5f 49  urn THREE_BYTE_I
1e170 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 63 61  NT(aKey);.    ca
1e180 73 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 74 65  se 4: {.      te
1e190 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d 26  stcase( aKey[0]&
1e1a0 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 79 20  0x80 );.      y 
1e1b0 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49 4e 54  = FOUR_BYTE_UINT
1e1c0 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20 72 65  (aKey);.      re
1e1d0 74 75 72 6e 20 28 69 36 34 29 2a 28 69 6e 74 2a  turn (i64)*(int*
1e1e0 29 26 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  )&y;.    }.    c
1e1f0 61 73 65 20 35 3a 20 7b 0a 20 20 20 20 20 20 74  ase 5: {.      t
1e200 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30 5d  estcase( aKey[0]
1e210 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20 72  &0x80 );.      r
1e220 65 74 75 72 6e 20 46 4f 55 52 5f 42 59 54 45 5f  eturn FOUR_BYTE_
1e230 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b 20 28  UINT(aKey+2) + (
1e240 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a 54 57  ((i64)1)<<32)*TW
1e250 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65 79 29  O_BYTE_INT(aKey)
1e260 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
1e270 20 36 3a 20 7b 0a 20 20 20 20 20 20 75 36 34 20   6: {.      u64 
1e280 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
1e290 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
1e2a0 74 65 73 74 63 61 73 65 28 20 61 4b 65 79 5b 30  testcase( aKey[0
1e2b0 5d 26 30 78 38 30 20 29 3b 0a 20 20 20 20 20 20  ]&0x80 );.      
1e2c0 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
1e2d0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
1e2e0 79 2b 34 29 3b 0a 20 20 20 20 20 20 72 65 74 75  y+4);.      retu
1e2f0 72 6e 20 28 69 36 34 29 2a 28 69 36 34 2a 29 26  rn (i64)*(i64*)&
1e300 78 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  x;.    }.  }..  
1e310 72 65 74 75 72 6e 20 28 73 65 72 69 61 6c 5f 74  return (serial_t
1e320 79 70 65 20 2d 20 38 29 3b 0a 7d 0a 0a 2f 2a 0a  ype - 8);.}../*.
1e330 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1e340 20 63 6f 6d 70 61 72 65 73 20 74 68 65 20 74 77   compares the tw
1e350 6f 20 74 61 62 6c 65 20 72 6f 77 73 20 6f 72 20  o table rows or 
1e360 69 6e 64 65 78 20 72 65 63 6f 72 64 73 0a 2a 2a  index records.**
1e370 20 73 70 65 63 69 66 69 65 64 20 62 79 20 7b 6e   specified by {n
1e380 4b 65 79 31 2c 20 70 4b 65 79 31 7d 20 61 6e 64  Key1, pKey1} and
1e390 20 70 50 4b 65 79 32 2e 20 20 49 74 20 72 65 74   pPKey2.  It ret
1e3a0 75 72 6e 73 20 61 20 6e 65 67 61 74 69 76 65 2c  urns a negative,
1e3b0 20 7a 65 72 6f 0a 2a 2a 20 6f 72 20 70 6f 73 69   zero.** or posi
1e3c0 74 69 76 65 20 69 6e 74 65 67 65 72 20 69 66 20  tive integer if 
1e3d0 6b 65 79 31 20 69 73 20 6c 65 73 73 20 74 68 61  key1 is less tha
1e3e0 6e 2c 20 65 71 75 61 6c 20 74 6f 20 6f 72 20 0a  n, equal to or .
1e3f0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
1e400 6b 65 79 32 2e 20 20 54 68 65 20 7b 6e 4b 65 79  key2.  The {nKey
1e410 31 2c 20 70 4b 65 79 31 7d 20 6b 65 79 20 6d 75  1, pKey1} key mu
1e420 73 74 20 62 65 20 61 20 62 6c 6f 62 0a 2a 2a 20  st be a blob.** 
1e430 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 4f  created by the O
1e440 50 5f 4d 61 6b 65 52 65 63 6f 72 64 20 6f 70 63  P_MakeRecord opc
1e450 6f 64 65 20 6f 66 20 74 68 65 20 56 44 42 45 2e  ode of the VDBE.
1e460 20 20 54 68 65 20 70 50 4b 65 79 32 0a 2a 2a 20    The pPKey2.** 
1e470 6b 65 79 20 6d 75 73 74 20 62 65 20 61 20 70 61  key must be a pa
1e480 72 73 65 64 20 6b 65 79 20 73 75 63 68 20 61 73  rsed key such as
1e490 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a   obtained from.*
1e4a0 2a 20 73 71 6c 69 74 65 33 56 64 62 65 50 61 72  * sqlite3VdbePar
1e4b0 73 65 52 65 63 6f 72 64 2e 0a 2a 2a 0a 2a 2a 20  seRecord..**.** 
1e4c0 49 66 20 61 72 67 75 6d 65 6e 74 20 62 53 6b 69  If argument bSki
1e4d0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 69  p is non-zero, i
1e4e0 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
1e4f0 74 20 74 68 65 20 63 61 6c 6c 65 72 20 68 61 73  t the caller has
1e500 20 61 6c 72 65 61 64 79 0a 2a 2a 20 64 65 74 65   already.** dete
1e510 72 6d 69 6e 65 64 20 74 68 61 74 20 74 68 65 20  rmined that the 
1e520 66 69 72 73 74 20 66 69 65 6c 64 73 20 6f 66 20  first fields of 
1e530 74 68 65 20 6b 65 79 73 20 61 72 65 20 65 71 75  the keys are equ
1e540 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4b 65 79 31 20 61  al..**.** Key1 a
1e550 6e 64 20 4b 65 79 32 20 64 6f 20 6e 6f 74 20 68  nd Key2 do not h
1e560 61 76 65 20 74 6f 20 63 6f 6e 74 61 69 6e 20 74  ave to contain t
1e570 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 20 6f  he same number o
1e580 66 20 66 69 65 6c 64 73 2e 20 49 66 20 61 6c 6c  f fields. If all
1e590 20 0a 2a 2a 20 66 69 65 6c 64 73 20 74 68 61 74   .** fields that
1e5a0 20 61 70 70 65 61 72 20 69 6e 20 62 6f 74 68 20   appear in both 
1e5b0 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2c 20  keys are equal, 
1e5c0 74 68 65 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66  then pPKey2->def
1e5d0 61 75 6c 74 5f 72 63 20 69 73 20 0a 2a 2a 20 72  ault_rc is .** r
1e5e0 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1e5f0 66 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  f database corru
1e600 70 74 69 6f 6e 20 69 73 20 64 69 73 63 6f 76 65  ption is discove
1e610 72 65 64 2c 20 73 65 74 20 70 50 4b 65 79 32 2d  red, set pPKey2-
1e620 3e 65 72 72 43 6f 64 65 20 74 6f 20 0a 2a 2a 20  >errCode to .** 
1e630 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 61  SQLITE_CORRUPT a
1e640 6e 64 20 72 65 74 75 72 6e 20 30 2e 20 49 66 20  nd return 0. If 
1e650 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 20 69 73 20  an OOM error is 
1e660 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20 0a 2a 2a  encountered, .**
1e670 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
1e680 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
1e690 45 5f 4e 4f 4d 45 4d 20 61 6e 64 2c 20 69 66 20  E_NOMEM and, if 
1e6a0 69 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  it is not NULL, 
1e6b0 74 68 65 0a 2a 2a 20 6d 61 6c 6c 6f 63 2d 66 61  the.** malloc-fa
1e6c0 69 6c 65 64 20 66 6c 61 67 20 73 65 74 20 6f 6e  iled flag set on
1e6d0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1e6e0 20 28 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e   (pPKey2->pKeyIn
1e6f0 66 6f 2d 3e 64 62 29 2e 0a 2a 2f 0a 69 6e 74 20  fo->db)..*/.int 
1e700 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e710 64 43 6f 6d 70 61 72 65 57 69 74 68 53 6b 69 70  dCompareWithSkip
1e720 28 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  (.  int nKey1, c
1e730 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
1e740 2c 20 20 20 2f 2a 20 4c 65 66 74 20 6b 65 79 20  ,   /* Left key 
1e750 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63  */.  UnpackedRec
1e760 6f 72 64 20 2a 70 50 4b 65 79 32 2c 20 20 20 20  ord *pPKey2,    
1e770 20 20 20 20 20 2f 2a 20 52 69 67 68 74 20 6b 65       /* Right ke
1e780 79 20 2a 2f 0a 20 20 69 6e 74 20 62 53 6b 69 70  y */.  int bSkip
1e790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1e7b0 65 2c 20 73 6b 69 70 20 74 68 65 20 66 69 72 73  e, skip the firs
1e7c0 74 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20  t field */.){.  
1e7d0 75 33 32 20 64 31 3b 20 20 20 20 20 20 20 20 20  u32 d1;         
1e7e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e7f0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 61  /* Offset into a
1e800 4b 65 79 5b 5d 20 6f 66 20 6e 65 78 74 20 64 61  Key[] of next da
1e810 74 61 20 65 6c 65 6d 65 6e 74 20 2a 2f 0a 20 20  ta element */.  
1e820 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
1e830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e840 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6e 65 78 74  /* Index of next
1e850 20 66 69 65 6c 64 20 74 6f 20 63 6f 6d 70 61 72   field to compar
1e860 65 20 2a 2f 0a 20 20 75 33 32 20 73 7a 48 64 72  e */.  u32 szHdr
1e870 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e880 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1e890 66 20 72 65 63 6f 72 64 20 68 65 61 64 65 72 20  f record header 
1e8a0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33  in bytes */.  u3
1e8b0 32 20 69 64 78 31 3b 20 20 20 20 20 20 20 20 20  2 idx1;         
1e8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e8d0 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74   Offset of first
1e8e0 20 74 79 70 65 20 69 6e 20 68 65 61 64 65 72 20   type in header 
1e8f0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  */.  int rc = 0;
1e900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e910 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
1e920 61 6c 75 65 20 2a 2f 0a 20 20 4d 65 6d 20 2a 70  alue */.  Mem *p
1e930 52 68 73 20 3d 20 70 50 4b 65 79 32 2d 3e 61 4d  Rhs = pPKey2->aM
1e940 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 78  em;       /* Nex
1e950 74 20 66 69 65 6c 64 20 6f 66 20 70 50 4b 65 79  t field of pPKey
1e960 32 20 74 6f 20 63 6f 6d 70 61 72 65 20 2a 2f 0a  2 to compare */.
1e970 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49    KeyInfo *pKeyI
1e980 6e 66 6f 20 3d 20 70 50 4b 65 79 32 2d 3e 70 4b  nfo = pPKey2->pK
1e990 65 79 49 6e 66 6f 3b 0a 20 20 63 6f 6e 73 74 20  eyInfo;.  const 
1e9a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61  unsigned char *a
1e9b0 4b 65 79 31 20 3d 20 28 63 6f 6e 73 74 20 75 6e  Key1 = (const un
1e9c0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 4b  signed char *)pK
1e9d0 65 79 31 3b 0a 20 20 4d 65 6d 20 6d 65 6d 31 3b  ey1;.  Mem mem1;
1e9e0 0a 0a 20 20 2f 2a 20 49 66 20 62 53 6b 69 70 20  ..  /* If bSkip 
1e9f0 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68  is true, then th
1ea00 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61 6c 72  e caller has alr
1ea10 65 61 64 79 20 64 65 74 65 72 6d 69 6e 65 64 20  eady determined 
1ea20 74 68 61 74 20 74 68 65 20 66 69 72 73 74 0a 20  that the first. 
1ea30 20 2a 2a 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   ** two elements
1ea40 20 69 6e 20 74 68 65 20 6b 65 79 73 20 61 72 65   in the keys are
1ea50 20 65 71 75 61 6c 2e 20 46 69 78 20 74 68 65 20   equal. Fix the 
1ea60 76 61 72 69 6f 75 73 20 73 74 61 63 6b 20 76 61  various stack va
1ea70 72 69 61 62 6c 65 73 20 73 6f 0a 20 20 2a 2a 20  riables so.  ** 
1ea80 74 68 61 74 20 74 68 69 73 20 72 6f 75 74 69 6e  that this routin
1ea90 65 20 62 65 67 69 6e 73 20 63 6f 6d 70 61 72 69  e begins compari
1eaa0 6e 67 20 61 74 20 74 68 65 20 73 65 63 6f 6e 64  ng at the second
1eab0 20 66 69 65 6c 64 2e 20 2a 2f 0a 20 20 69 66 28   field. */.  if(
1eac0 20 62 53 6b 69 70 20 29 7b 0a 20 20 20 20 75 33   bSkip ){.    u3
1ead0 32 20 73 31 3b 0a 20 20 20 20 69 64 78 31 20 3d  2 s1;.    idx1 =
1eae0 20 31 20 2b 20 67 65 74 56 61 72 69 6e 74 33 32   1 + getVarint32
1eaf0 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 31 29 3b  (&aKey1[1], s1);
1eb00 0a 20 20 20 20 73 7a 48 64 72 31 20 3d 20 61 4b  .    szHdr1 = aK
1eb10 65 79 31 5b 30 5d 3b 0a 20 20 20 20 64 31 20 3d  ey1[0];.    d1 =
1eb20 20 73 7a 48 64 72 31 20 2b 20 73 71 6c 69 74 65   szHdr1 + sqlite
1eb30 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65 4c  3VdbeSerialTypeL
1eb40 65 6e 28 73 31 29 3b 0a 20 20 20 20 69 20 3d 20  en(s1);.    i = 
1eb50 31 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b 0a 20  1;.    pRhs++;. 
1eb60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 31   }else{.    idx1
1eb70 20 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 61   = getVarint32(a
1eb80 4b 65 79 31 2c 20 73 7a 48 64 72 31 29 3b 0a 20  Key1, szHdr1);. 
1eb90 20 20 20 64 31 20 3d 20 73 7a 48 64 72 31 3b 0a     d1 = szHdr1;.
1eba0 20 20 20 20 69 66 28 20 64 31 3e 28 75 6e 73 69      if( d1>(unsi
1ebb0 67 6e 65 64 29 6e 4b 65 79 31 20 29 7b 20 0a 20  gned)nKey1 ){ . 
1ebc0 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65 72 72       pPKey2->err
1ebd0 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c 49 54  Code = (u8)SQLIT
1ebe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1ebf0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20        return 0; 
1ec00 20 2f 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a   /* Corruption *
1ec10 2f 0a 20 20 20 20 7d 0a 20 20 20 20 69 20 3d 20  /.    }.    i = 
1ec20 30 3b 0a 20 20 7d 0a 0a 20 20 56 56 41 5f 4f 4e  0;.  }..  VVA_ON
1ec30 4c 59 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f  LY( mem1.szMallo
1ec40 63 20 3d 20 30 3b 20 29 20 2f 2a 20 4f 6e 6c 79  c = 0; ) /* Only
1ec50 20 6e 65 65 64 65 64 20 62 79 20 61 73 73 65 72   needed by asser
1ec60 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  t() statements *
1ec70 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 4b 65  /.  assert( pPKe
1ec80 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 46  y2->pKeyInfo->nF
1ec90 69 65 6c 64 2b 70 50 4b 65 79 32 2d 3e 70 4b 65  ield+pPKey2->pKe
1eca0 79 49 6e 66 6f 2d 3e 6e 58 46 69 65 6c 64 3e 3d  yInfo->nXField>=
1ecb0 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64 20 0a  pPKey2->nField .
1ecc0 20 20 20 20 20 20 20 7c 7c 20 43 4f 52 52 55 50         || CORRUP
1ecd0 54 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74  T_DB );.  assert
1ece0 28 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  ( pPKey2->pKeyIn
1ecf0 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 21 3d  fo->aSortOrder!=
1ed00 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1ed10 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66 6f 2d  PKey2->pKeyInfo-
1ed20 3e 6e 46 69 65 6c 64 3e 30 20 29 3b 0a 20 20 61  >nField>0 );.  a
1ed30 73 73 65 72 74 28 20 69 64 78 31 3c 3d 73 7a 48  ssert( idx1<=szH
1ed40 64 72 31 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44  dr1 || CORRUPT_D
1ed50 42 20 29 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 75  B );.  do{.    u
1ed60 33 32 20 73 65 72 69 61 6c 5f 74 79 70 65 3b 0a  32 serial_type;.
1ed70 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20 61  .    /* RHS is a
1ed80 6e 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20  n integer */.   
1ed90 20 69 66 28 20 70 52 68 73 2d 3e 66 6c 61 67 73   if( pRhs->flags
1eda0 20 26 20 4d 45 4d 5f 49 6e 74 20 29 7b 0a 20 20   & MEM_Int ){.  
1edb0 20 20 20 20 73 65 72 69 61 6c 5f 74 79 70 65 20      serial_type 
1edc0 3d 20 61 4b 65 79 31 5b 69 64 78 31 5d 3b 0a 20  = aKey1[idx1];. 
1edd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 73       testcase( s
1ede0 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20 29  erial_type==12 )
1edf0 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72 69  ;.      if( seri
1ee00 61 6c 5f 74 79 70 65 3e 3d 31 30 20 29 7b 0a 20  al_type>=10 ){. 
1ee10 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a         rc = +1;.
1ee20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ee30 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20 29  serial_type==0 )
1ee40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1ee50 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1ee60 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  f( serial_type==
1ee70 37 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  7 ){.        sql
1ee80 69 74 65 33 56 64 62 65 53 65 72 69 61 6c 47 65  ite3VdbeSerialGe
1ee90 74 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 73 65  t(&aKey1[d1], se
1eea0 72 69 61 6c 5f 74 79 70 65 2c 20 26 6d 65 6d 31  rial_type, &mem1
1eeb0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
1eec0 2d 73 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74  -sqlite3IntFloat
1eed0 43 6f 6d 70 61 72 65 28 70 52 68 73 2d 3e 75 2e  Compare(pRhs->u.
1eee0 69 2c 20 6d 65 6d 31 2e 75 2e 72 29 3b 0a 20 20  i, mem1.u.r);.  
1eef0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ef00 20 20 20 69 36 34 20 6c 68 73 20 3d 20 76 64 62     i64 lhs = vdb
1ef10 65 52 65 63 6f 72 64 44 65 63 6f 64 65 49 6e 74  eRecordDecodeInt
1ef20 28 73 65 72 69 61 6c 5f 74 79 70 65 2c 20 26 61  (serial_type, &a
1ef30 4b 65 79 31 5b 64 31 5d 29 3b 0a 20 20 20 20 20  Key1[d1]);.     
1ef40 20 20 20 69 36 34 20 72 68 73 20 3d 20 70 52 68     i64 rhs = pRh
1ef50 73 2d 3e 75 2e 69 3b 0a 20 20 20 20 20 20 20 20  s->u.i;.        
1ef60 69 66 28 20 6c 68 73 3c 72 68 73 20 29 7b 0a 20  if( lhs<rhs ){. 
1ef70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d 31           rc = -1
1ef80 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1ef90 69 66 28 20 6c 68 73 3e 72 68 73 20 29 7b 0a 20  if( lhs>rhs ){. 
1efa0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31           rc = +1
1efb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1efc0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
1efd0 2a 20 52 48 53 20 69 73 20 72 65 61 6c 20 2a 2f  * RHS is real */
1efe0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52  .    else if( pR
1eff0 68 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f  hs->flags & MEM_
1f000 52 65 61 6c 20 29 7b 0a 20 20 20 20 20 20 73 65  Real ){.      se
1f010 72 69 61 6c 5f 74 79 70 65 20 3d 20 61 4b 65 79  rial_type = aKey
1f020 31 5b 69 64 78 31 5d 3b 0a 20 20 20 20 20 20 69  1[idx1];.      i
1f030 66 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3e 3d  f( serial_type>=
1f040 31 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  10 ){.        /*
1f050 20 53 65 72 69 61 6c 20 74 79 70 65 73 20 31 32   Serial types 12
1f060 20 6f 72 20 67 72 65 61 74 65 72 20 61 72 65 20   or greater are 
1f070 73 74 72 69 6e 67 73 20 61 6e 64 20 62 6c 6f 62  strings and blob
1f080 73 20 28 67 72 65 61 74 65 72 20 74 68 61 6e 0a  s (greater than.
1f090 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65          ** numbe
1f0a0 72 73 29 2e 20 54 79 70 65 73 20 31 30 20 61 6e  rs). Types 10 an
1f0b0 64 20 31 31 20 61 72 65 20 63 75 72 72 65 6e 74  d 11 are current
1f0c0 6c 79 20 22 72 65 73 65 72 76 65 64 20 66 6f 72  ly "reserved for
1f0d0 20 66 75 74 75 72 65 20 0a 20 20 20 20 20 20 20   future .       
1f0e0 20 2a 2a 20 75 73 65 22 2c 20 73 6f 20 69 74 20   ** use", so it 
1f0f0 64 6f 65 73 6e 27 74 20 72 65 61 6c 6c 79 20 6d  doesn't really m
1f100 61 74 74 65 72 20 77 68 61 74 20 74 68 65 20 72  atter what the r
1f110 65 73 75 6c 74 73 20 6f 66 20 63 6f 6d 70 61 72  esults of compar
1f120 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ing.        ** t
1f130 68 65 6d 20 74 6f 20 6e 75 6d 62 65 72 69 63 20  hem to numberic 
1f140 76 61 6c 75 65 73 20 61 72 65 2e 20 20 2a 2f 0a  values are.  */.
1f150 20 20 20 20 20 20 20 20 72 63 20 3d 20 2b 31 3b          rc = +1;
1f160 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1f170 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 30 20   serial_type==0 
1f180 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1f190 2d 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  -1;.      }else{
1f1a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f1b0 56 64 62 65 53 65 72 69 61 6c 47 65 74 28 26 61  VdbeSerialGet(&a
1f1c0 4b 65 79 31 5b 64 31 5d 2c 20 73 65 72 69 61 6c  Key1[d1], serial
1f1d0 5f 74 79 70 65 2c 20 26 6d 65 6d 31 29 3b 0a 20  _type, &mem1);. 
1f1e0 20 20 20 20 20 20 20 69 66 28 20 73 65 72 69 61         if( seria
1f1f0 6c 5f 74 79 70 65 3d 3d 37 20 29 7b 0a 20 20 20  l_type==7 ){.   
1f200 20 20 20 20 20 20 20 69 66 28 20 6d 65 6d 31 2e         if( mem1.
1f210 75 2e 72 3c 70 52 68 73 2d 3e 75 2e 72 20 29 7b  u.r<pRhs->u.r ){
1f220 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f230 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20  = -1;.          
1f240 7d 65 6c 73 65 20 69 66 28 20 6d 65 6d 31 2e 75  }else if( mem1.u
1f250 2e 72 3e 70 52 68 73 2d 3e 75 2e 72 20 29 7b 0a  .r>pRhs->u.r ){.
1f260 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1f270 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   +1;.          }
1f280 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f290 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f2a0 71 6c 69 74 65 33 49 6e 74 46 6c 6f 61 74 43 6f  qlite3IntFloatCo
1f2b0 6d 70 61 72 65 28 6d 65 6d 31 2e 75 2e 69 2c 20  mpare(mem1.u.i, 
1f2c0 70 52 68 73 2d 3e 75 2e 72 29 3b 0a 20 20 20 20  pRhs->u.r);.    
1f2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1f2e0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20    }..    /* RHS 
1f2f0 69 73 20 61 20 73 74 72 69 6e 67 20 2a 2f 0a 20  is a string */. 
1f300 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68 73     else if( pRhs
1f310 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 53 74  ->flags & MEM_St
1f320 72 20 29 7b 0a 20 20 20 20 20 20 67 65 74 56 61  r ){.      getVa
1f330 72 69 6e 74 33 32 28 26 61 4b 65 79 31 5b 69 64  rint32(&aKey1[id
1f340 78 31 5d 2c 20 73 65 72 69 61 6c 5f 74 79 70 65  x1], serial_type
1f350 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
1f360 65 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d  e( serial_type==
1f370 31 32 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  12 );.      if( 
1f380 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32 20 29  serial_type<12 )
1f390 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 2d  {.        rc = -
1f3a0 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  1;.      }else i
1f3b0 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79 70 65  f( !(serial_type
1f3c0 20 26 20 30 78 30 31 29 20 29 7b 0a 20 20 20 20   & 0x01) ){.    
1f3d0 20 20 20 20 72 63 20 3d 20 2b 31 3b 0a 20 20 20      rc = +1;.   
1f3e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f3f0 20 20 6d 65 6d 31 2e 6e 20 3d 20 28 73 65 72 69    mem1.n = (seri
1f400 61 6c 5f 74 79 70 65 20 2d 20 31 32 29 20 2f 20  al_type - 12) / 
1f410 32 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63  2;.        testc
1f420 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29  ase( (d1+mem1.n)
1f430 3d 3d 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79  ==(unsigned)nKey
1f440 31 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  1 );.        tes
1f450 74 63 61 73 65 28 20 28 64 31 2b 6d 65 6d 31 2e  tcase( (d1+mem1.
1f460 6e 2b 31 29 3d 3d 28 75 6e 73 69 67 6e 65 64 29  n+1)==(unsigned)
1f470 6e 4b 65 79 31 20 29 3b 0a 20 20 20 20 20 20 20  nKey1 );.       
1f480 20 69 66 28 20 28 64 31 2b 6d 65 6d 31 2e 6e 29   if( (d1+mem1.n)
1f490 20 3e 20 28 75 6e 73 69 67 6e 65 64 29 6e 4b 65   > (unsigned)nKe
1f4a0 79 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  y1 ){.          
1f4b0 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65 20  pPKey2->errCode 
1f4c0 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f 52  = (u8)SQLITE_COR
1f4d0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f4e0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20       return 0;  
1f4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f500 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   Corruption */. 
1f510 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
1f520 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c   pKeyInfo->aColl
1f530 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  [i] ){.         
1f540 20 6d 65 6d 31 2e 65 6e 63 20 3d 20 70 4b 65 79   mem1.enc = pKey
1f550 49 6e 66 6f 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  Info->enc;.     
1f560 20 20 20 20 20 6d 65 6d 31 2e 64 62 20 3d 20 70       mem1.db = p
1f570 4b 65 79 49 6e 66 6f 2d 3e 64 62 3b 0a 20 20 20  KeyInfo->db;.   
1f580 20 20 20 20 20 20 20 6d 65 6d 31 2e 66 6c 61 67         mem1.flag
1f590 73 20 3d 20 4d 45 4d 5f 53 74 72 3b 0a 20 20 20  s = MEM_Str;.   
1f5a0 20 20 20 20 20 20 20 6d 65 6d 31 2e 7a 20 3d 20         mem1.z = 
1f5b0 28 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64 31  (char*)&aKey1[d1
1f5c0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ];.          rc 
1f5d0 3d 20 76 64 62 65 43 6f 6d 70 61 72 65 4d 65 6d  = vdbeCompareMem
1f5e0 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20 20 20  String(.        
1f5f0 20 20 20 20 20 20 26 6d 65 6d 31 2c 20 70 52 68        &mem1, pRh
1f600 73 2c 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f  s, pKeyInfo->aCo
1f610 6c 6c 5b 69 5d 2c 20 26 70 50 4b 65 79 32 2d 3e  ll[i], &pPKey2->
1f620 65 72 72 43 6f 64 65 0a 20 20 20 20 20 20 20 20  errCode.        
1f630 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c    );.        }el
1f640 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  se{.          in
1f650 74 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6d 65 6d  t nCmp = MIN(mem
1f660 31 2e 6e 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20  1.n, pRhs->n);. 
1f670 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6d 65           rc = me
1f680 6d 63 6d 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c  mcmp(&aKey1[d1],
1f690 20 70 52 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b   pRhs->z, nCmp);
1f6a0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f6b0 63 3d 3d 30 20 29 20 72 63 20 3d 20 6d 65 6d 31  c==0 ) rc = mem1
1f6c0 2e 6e 20 2d 20 70 52 68 73 2d 3e 6e 3b 20 0a 20  .n - pRhs->n; . 
1f6d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1f6e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52  .    }..    /* R
1f6f0 48 53 20 69 73 20 61 20 62 6c 6f 62 20 2a 2f 0a  HS is a blob */.
1f700 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 52 68      else if( pRh
1f710 73 2d 3e 66 6c 61 67 73 20 26 20 4d 45 4d 5f 42  s->flags & MEM_B
1f720 6c 6f 62 20 29 7b 0a 20 20 20 20 20 20 61 73 73  lob ){.      ass
1f730 65 72 74 28 20 28 70 52 68 73 2d 3e 66 6c 61 67  ert( (pRhs->flag
1f740 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 29 3d 3d 30  s & MEM_Zero)==0
1f750 20 7c 7c 20 70 52 68 73 2d 3e 6e 3d 3d 30 20 29   || pRhs->n==0 )
1f760 3b 0a 20 20 20 20 20 20 67 65 74 56 61 72 69 6e  ;.      getVarin
1f770 74 33 32 28 26 61 4b 65 79 31 5b 69 64 78 31 5d  t32(&aKey1[idx1]
1f780 2c 20 73 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a  , serial_type);.
1f790 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1f7a0 73 65 72 69 61 6c 5f 74 79 70 65 3d 3d 31 32 20  serial_type==12 
1f7b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 65 72  );.      if( ser
1f7c0 69 61 6c 5f 74 79 70 65 3c 31 32 20 7c 7c 20 28  ial_type<12 || (
1f7d0 73 65 72 69 61 6c 5f 74 79 70 65 20 26 20 30 78  serial_type & 0x
1f7e0 30 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  01) ){.        r
1f7f0 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 65  c = -1;.      }e
1f800 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
1f810 20 6e 53 74 72 20 3d 20 28 73 65 72 69 61 6c 5f   nStr = (serial_
1f820 74 79 70 65 20 2d 20 31 32 29 20 2f 20 32 3b 0a  type - 12) / 2;.
1f830 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f840 28 20 28 64 31 2b 6e 53 74 72 29 3d 3d 28 75 6e  ( (d1+nStr)==(un
1f850 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29 3b 0a  signed)nKey1 );.
1f860 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
1f870 28 20 28 64 31 2b 6e 53 74 72 2b 31 29 3d 3d 28  ( (d1+nStr+1)==(
1f880 75 6e 73 69 67 6e 65 64 29 6e 4b 65 79 31 20 29  unsigned)nKey1 )
1f890 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 64  ;.        if( (d
1f8a0 31 2b 6e 53 74 72 29 20 3e 20 28 75 6e 73 69 67  1+nStr) > (unsig
1f8b0 6e 65 64 29 6e 4b 65 79 31 20 29 7b 0a 20 20 20  ned)nKey1 ){.   
1f8c0 20 20 20 20 20 20 20 70 50 4b 65 79 32 2d 3e 65         pPKey2->e
1f8d0 72 72 43 6f 64 65 20 3d 20 28 75 38 29 53 51 4c  rrCode = (u8)SQL
1f8e0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
1f8f0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
1f900 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
1f910 20 20 20 20 20 2f 2a 20 43 6f 72 72 75 70 74 69       /* Corrupti
1f920 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d 65  on */.        }e
1f930 6c 73 65 20 69 66 28 20 70 52 68 73 2d 3e 66 6c  lse if( pRhs->fl
1f940 61 67 73 20 26 20 4d 45 4d 5f 5a 65 72 6f 20 29  ags & MEM_Zero )
1f950 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1f960 21 69 73 41 6c 6c 5a 65 72 6f 28 28 63 6f 6e 73  !isAllZero((cons
1f970 74 20 63 68 61 72 2a 29 26 61 4b 65 79 31 5b 64  t char*)&aKey1[d
1f980 31 5d 2c 6e 53 74 72 29 20 29 7b 0a 20 20 20 20  1],nStr) ){.    
1f990 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
1f9a0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1f9b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f9c0 3d 20 6e 53 74 72 20 2d 20 70 52 68 73 2d 3e 75  = nStr - pRhs->u
1f9d0 2e 6e 5a 65 72 6f 3b 0a 20 20 20 20 20 20 20 20  .nZero;.        
1f9e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1f9f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  e{.          int
1fa00 20 6e 43 6d 70 20 3d 20 4d 49 4e 28 6e 53 74 72   nCmp = MIN(nStr
1fa10 2c 20 70 52 68 73 2d 3e 6e 29 3b 0a 20 20 20 20  , pRhs->n);.    
1fa20 20 20 20 20 20 20 72 63 20 3d 20 6d 65 6d 63 6d        rc = memcm
1fa30 70 28 26 61 4b 65 79 31 5b 64 31 5d 2c 20 70 52  p(&aKey1[d1], pR
1fa40 68 73 2d 3e 7a 2c 20 6e 43 6d 70 29 3b 0a 20 20  hs->z, nCmp);.  
1fa50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1fa60 30 20 29 20 72 63 20 3d 20 6e 53 74 72 20 2d 20  0 ) rc = nStr - 
1fa70 70 52 68 73 2d 3e 6e 3b 0a 20 20 20 20 20 20 20  pRhs->n;.       
1fa80 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1fa90 0a 0a 20 20 20 20 2f 2a 20 52 48 53 20 69 73 20  ..    /* RHS is 
1faa0 6e 75 6c 6c 20 2a 2f 0a 20 20 20 20 65 6c 73 65  null */.    else
1fab0 7b 0a 20 20 20 20 20 20 73 65 72 69 61 6c 5f 74  {.      serial_t
1fac0 79 70 65 20 3d 20 61 4b 65 79 31 5b 69 64 78 31  ype = aKey1[idx1
1fad0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73  ];.      rc = (s
1fae0 65 72 69 61 6c 5f 74 79 70 65 21 3d 30 29 3b 0a  erial_type!=0);.
1faf0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
1fb00 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  c!=0 ){.      if
1fb10 28 20 70 4b 65 79 49 6e 66 6f 2d 3e 61 53 6f 72  ( pKeyInfo->aSor
1fb20 74 4f 72 64 65 72 5b 69 5d 20 29 7b 0a 20 20 20  tOrder[i] ){.   
1fb30 20 20 20 20 20 72 63 20 3d 20 2d 72 63 3b 0a 20       rc = -rc;. 
1fb40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1fb50 65 72 74 28 20 76 64 62 65 52 65 63 6f 72 64 43  ert( vdbeRecordC
1fb60 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79  ompareDebug(nKey
1fb70 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
1fb80 2c 20 72 63 29 20 29 3b 0a 20 20 20 20 20 20 61  , rc) );.      a
1fb90 73 73 65 72 74 28 20 6d 65 6d 31 2e 73 7a 4d 61  ssert( mem1.szMa
1fba0 6c 6c 6f 63 3d 3d 30 20 29 3b 20 20 2f 2a 20 53  lloc==0 );  /* S
1fbb0 65 65 20 63 6f 6d 6d 65 6e 74 20 62 65 6c 6f 77  ee comment below
1fbc0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1fbd0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1fbe0 69 2b 2b 3b 0a 20 20 20 20 70 52 68 73 2b 2b 3b  i++;.    pRhs++;
1fbf0 0a 20 20 20 20 64 31 20 2b 3d 20 73 71 6c 69 74  .    d1 += sqlit
1fc00 65 33 56 64 62 65 53 65 72 69 61 6c 54 79 70 65  e3VdbeSerialType
1fc10 4c 65 6e 28 73 65 72 69 61 6c 5f 74 79 70 65 29  Len(serial_type)
1fc20 3b 0a 20 20 20 20 69 64 78 31 20 2b 3d 20 73 71  ;.    idx1 += sq
1fc30 6c 69 74 65 33 56 61 72 69 6e 74 4c 65 6e 28 73  lite3VarintLen(s
1fc40 65 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 7d  erial_type);.  }
1fc50 77 68 69 6c 65 28 20 69 64 78 31 3c 28 75 6e 73  while( idx1<(uns
1fc60 69 67 6e 65 64 29 73 7a 48 64 72 31 20 26 26 20  igned)szHdr1 && 
1fc70 69 3c 70 50 4b 65 79 32 2d 3e 6e 46 69 65 6c 64  i<pPKey2->nField
1fc80 20 26 26 20 64 31 3c 3d 28 75 6e 73 69 67 6e 65   && d1<=(unsigne
1fc90 64 29 6e 4b 65 79 31 20 29 3b 0a 0a 20 20 2f 2a  d)nKey1 );..  /*
1fca0 20 4e 6f 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   No memory alloc
1fcb0 61 74 69 6f 6e 20 69 73 20 65 76 65 72 20 75 73  ation is ever us
1fcc0 65 64 20 6f 6e 20 6d 65 6d 31 2e 20 20 50 72 6f  ed on mem1.  Pro
1fcd0 76 65 20 74 68 69 73 20 75 73 69 6e 67 0a 20 20  ve this using.  
1fce0 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
1fcf0 20 61 73 73 65 72 74 28 29 2e 20 20 49 66 20 74   assert().  If t
1fd00 68 65 20 61 73 73 65 72 74 28 29 20 66 61 69 6c  he assert() fail
1fd10 73 2c 20 69 74 20 69 6e 64 69 63 61 74 65 73 20  s, it indicates 
1fd20 61 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 6c 65  a.  ** memory le
1fd30 61 6b 20 61 6e 64 20 61 20 6e 65 65 64 20 74 6f  ak and a need to
1fd40 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 56 64 62   call sqlite3Vdb
1fd50 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 65 6d  eMemRelease(&mem
1fd60 31 29 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  1).  */.  assert
1fd70 28 20 6d 65 6d 31 2e 73 7a 4d 61 6c 6c 6f 63 3d  ( mem1.szMalloc=
1fd80 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 72 63 3d 3d  =0 );..  /* rc==
1fd90 30 20 68 65 72 65 20 6d 65 61 6e 73 20 74 68 61  0 here means tha
1fda0 74 20 6f 6e 65 20 6f 72 20 62 6f 74 68 20 6f 66  t one or both of
1fdb0 20 74 68 65 20 6b 65 79 73 20 72 61 6e 20 6f 75   the keys ran ou
1fdc0 74 20 6f 66 20 66 69 65 6c 64 73 20 61 6e 64 0a  t of fields and.
1fdd0 20 20 2a 2a 20 61 6c 6c 20 74 68 65 20 66 69 65    ** all the fie
1fde0 6c 64 73 20 75 70 20 74 6f 20 74 68 61 74 20 70  lds up to that p
1fdf0 6f 69 6e 74 20 77 65 72 65 20 65 71 75 61 6c 2e  oint were equal.
1fe00 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 66 61   Return the defa
1fe10 75 6c 74 5f 72 63 0a 20 20 2a 2a 20 76 61 6c 75  ult_rc.  ** valu
1fe20 65 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  e.  */.  assert(
1fe30 20 43 4f 52 52 55 50 54 5f 44 42 20 0a 20 20 20   CORRUPT_DB .   
1fe40 20 20 20 20 7c 7c 20 76 64 62 65 52 65 63 6f 72      || vdbeRecor
1fe50 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
1fe60 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
1fe70 79 32 2c 20 70 50 4b 65 79 32 2d 3e 64 65 66 61  y2, pPKey2->defa
1fe80 75 6c 74 5f 72 63 29 20 0a 20 20 20 20 20 20 20  ult_rc) .       
1fe90 7c 7c 20 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d  || pKeyInfo->db-
1fea0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20  >mallocFailed.  
1feb0 29 3b 0a 20 20 70 50 4b 65 79 32 2d 3e 65 71 53  );.  pPKey2->eqS
1fec0 65 65 6e 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  een = 1;.  retur
1fed0 6e 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  n pPKey2->defaul
1fee0 74 5f 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  t_rc;.}.int sqli
1fef0 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1ff00 70 61 72 65 28 0a 20 20 69 6e 74 20 6e 4b 65 79  pare(.  int nKey
1ff10 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
1ff20 4b 65 79 31 2c 20 20 20 2f 2a 20 4c 65 66 74 20  Key1,   /* Left 
1ff30 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65  key */.  Unpacke
1ff40 64 52 65 63 6f 72 64 20 2a 70 50 4b 65 79 32 20  dRecord *pPKey2 
1ff50 20 20 20 20 20 20 20 20 20 2f 2a 20 52 69 67 68           /* Righ
1ff60 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20 20 72 65  t key */.){.  re
1ff70 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1ff80 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74  RecordCompareWit
1ff90 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65  hSkip(nKey1, pKe
1ffa0 79 31 2c 20 70 50 4b 65 79 32 2c 20 30 29 3b 0a  y1, pPKey2, 0);.
1ffb0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1ffc0 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 6f 70  unction is an op
1ffd0 74 69 6d 69 7a 65 64 20 76 65 72 73 69 6f 6e 20  timized version 
1ffe0 6f 66 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  of sqlite3VdbeRe
1fff0 63 6f 72 64 43 6f 6d 70 61 72 65 28 29 20 0a 2a  cordCompare() .*
20000 2a 20 74 68 61 74 20 28 61 29 20 74 68 65 20 66  * that (a) the f
20010 69 72 73 74 20 66 69 65 6c 64 20 6f 66 20 70 50  irst field of pP
20020 4b 65 79 32 20 69 73 20 61 6e 20 69 6e 74 65 67  Key2 is an integ
20030 65 72 2c 20 61 6e 64 20 28 62 29 20 74 68 65 20  er, and (b) the 
20040 0a 2a 2a 20 73 69 7a 65 2d 6f 66 2d 68 65 61 64  .** size-of-head
20050 65 72 20 76 61 72 69 6e 74 20 61 74 20 74 68 65  er varint at the
20060 20 73 74 61 72 74 20 6f 66 20 28 70 4b 65 79 31   start of (pKey1
20070 2f 6e 4b 65 79 31 29 20 66 69 74 73 20 69 6e 20  /nKey1) fits in 
20080 61 20 73 69 6e 67 6c 65 0a 2a 2a 20 62 79 74 65  a single.** byte
20090 20 28 69 2e 65 2e 20 69 73 20 6c 65 73 73 20 74   (i.e. is less t
200a0 68 61 6e 20 31 32 38 29 2e 0a 2a 2a 0a 2a 2a 20  han 128)..**.** 
200b0 54 6f 20 61 76 6f 69 64 20 63 6f 6e 63 65 72 6e  To avoid concern
200c0 73 20 61 62 6f 75 74 20 62 75 66 66 65 72 20 6f  s about buffer o
200d0 76 65 72 72 65 61 64 73 2c 20 74 68 69 73 20 72  verreads, this r
200e0 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
200f0 73 65 64 0a 2a 2a 20 6f 6e 20 73 63 68 65 6d 61  sed.** on schema
20100 73 20 77 68 65 72 65 20 74 68 65 20 6d 61 78 69  s where the maxi
20110 6d 75 6d 20 76 61 6c 69 64 20 68 65 61 64 65 72  mum valid header
20120 20 73 69 7a 65 20 69 73 20 36 33 20 62 79 74 65   size is 63 byte
20130 73 20 6f 72 20 6c 65 73 73 2e 0a 2a 2f 0a 73 74  s or less..*/.st
20140 61 74 69 63 20 69 6e 74 20 76 64 62 65 52 65 63  atic int vdbeRec
20150 6f 72 64 43 6f 6d 70 61 72 65 49 6e 74 28 0a 20  ordCompareInt(. 
20160 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73   int nKey1, cons
20170 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f  t void *pKey1, /
20180 2a 20 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20  * Left key */.  
20190 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
201a0 70 50 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a  pPKey2        /*
201b0 20 52 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b   Right key */.){
201c0 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65  .  const u8 *aKe
201d0 79 20 3d 20 26 28 28 63 6f 6e 73 74 20 75 38 2a  y = &((const u8*
201e0 29 70 4b 65 79 31 29 5b 2a 28 63 6f 6e 73 74 20  )pKey1)[*(const 
201f0 75 38 2a 29 70 4b 65 79 31 20 26 20 30 78 33 46  u8*)pKey1 & 0x3F
20200 5d 3b 0a 20 20 69 6e 74 20 73 65 72 69 61 6c 5f  ];.  int serial_
20210 74 79 70 65 20 3d 20 28 28 63 6f 6e 73 74 20 75  type = ((const u
20220 38 2a 29 70 4b 65 79 31 29 5b 31 5d 3b 0a 20 20  8*)pKey1)[1];.  
20230 69 6e 74 20 72 65 73 3b 0a 20 20 75 33 32 20 79  int res;.  u32 y
20240 3b 0a 20 20 75 36 34 20 78 3b 0a 20 20 69 36 34  ;.  u64 x;.  i64
20250 20 76 3b 0a 20 20 69 36 34 20 6c 68 73 3b 0a 0a   v;.  i64 lhs;..
20260 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65 6c    vdbeAssertFiel
20270 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d 69  dCountWithinLimi
20280 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31 2c  ts(nKey1, pKey1,
20290 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e 66   pPKey2->pKeyInf
202a0 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 2a  o);.  assert( (*
202b0 28 75 38 2a 29 70 4b 65 79 31 29 3c 3d 30 78 33  (u8*)pKey1)<=0x3
202c0 46 20 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 20  F || CORRUPT_DB 
202d0 29 3b 0a 20 20 73 77 69 74 63 68 28 20 73 65 72  );.  switch( ser
202e0 69 61 6c 5f 74 79 70 65 20 29 7b 0a 20 20 20 20  ial_type ){.    
202f0 63 61 73 65 20 31 3a 20 7b 20 2f 2a 20 31 2d 62  case 1: { /* 1-b
20300 79 74 65 20 73 69 67 6e 65 64 20 69 6e 74 65 67  yte signed integ
20310 65 72 20 2a 2f 0a 20 20 20 20 20 20 6c 68 73 20  er */.      lhs 
20320 3d 20 4f 4e 45 5f 42 59 54 45 5f 49 4e 54 28 61  = ONE_BYTE_INT(a
20330 4b 65 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74  Key);.      test
20340 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
20350 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
20360 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b 20  }.    case 2: { 
20370 2f 2a 20 32 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 2-byte signed
20380 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20390 20 20 6c 68 73 20 3d 20 54 57 4f 5f 42 59 54 45    lhs = TWO_BYTE
203a0 5f 49 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20  _INT(aKey);.    
203b0 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73 3c    testcase( lhs<
203c0 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  0 );.      break
203d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
203e0 20 33 3a 20 7b 20 2f 2a 20 33 2d 62 79 74 65 20   3: { /* 3-byte 
203f0 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 20 2a  signed integer *
20400 2f 0a 20 20 20 20 20 20 6c 68 73 20 3d 20 54 48  /.      lhs = TH
20410 52 45 45 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  REE_BYTE_INT(aKe
20420 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20430 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20450 20 20 20 20 63 61 73 65 20 34 3a 20 7b 20 2f 2a      case 4: { /*
20460 20 34 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   4-byte signed i
20470 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
20480 79 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  y = FOUR_BYTE_UI
20490 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
204a0 6c 68 73 20 3d 20 28 69 36 34 29 2a 28 69 6e 74  lhs = (i64)*(int
204b0 2a 29 26 79 3b 0a 20 20 20 20 20 20 74 65 73 74  *)&y;.      test
204c0 63 61 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20  case( lhs<0 );. 
204d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
204e0 7d 0a 20 20 20 20 63 61 73 65 20 35 3a 20 7b 20  }.    case 5: { 
204f0 2f 2a 20 36 2d 62 79 74 65 20 73 69 67 6e 65 64  /* 6-byte signed
20500 20 69 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20   integer */.    
20510 20 20 6c 68 73 20 3d 20 46 4f 55 52 5f 42 59 54    lhs = FOUR_BYT
20520 45 5f 55 49 4e 54 28 61 4b 65 79 2b 32 29 20 2b  E_UINT(aKey+2) +
20530 20 28 28 28 69 36 34 29 31 29 3c 3c 33 32 29 2a   (((i64)1)<<32)*
20540 54 57 4f 5f 42 59 54 45 5f 49 4e 54 28 61 4b 65  TWO_BYTE_INT(aKe
20550 79 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  y);.      testca
20560 73 65 28 20 6c 68 73 3c 30 20 29 3b 0a 20 20 20  se( lhs<0 );.   
20570 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20580 20 20 20 20 63 61 73 65 20 36 3a 20 7b 20 2f 2a      case 6: { /*
20590 20 38 2d 62 79 74 65 20 73 69 67 6e 65 64 20 69   8-byte signed i
205a0 6e 74 65 67 65 72 20 2a 2f 0a 20 20 20 20 20 20  nteger */.      
205b0 78 20 3d 20 46 4f 55 52 5f 42 59 54 45 5f 55 49  x = FOUR_BYTE_UI
205c0 4e 54 28 61 4b 65 79 29 3b 0a 20 20 20 20 20 20  NT(aKey);.      
205d0 78 20 3d 20 28 78 3c 3c 33 32 29 20 7c 20 46 4f  x = (x<<32) | FO
205e0 55 52 5f 42 59 54 45 5f 55 49 4e 54 28 61 4b 65  UR_BYTE_UINT(aKe
205f0 79 2b 34 29 3b 0a 20 20 20 20 20 20 6c 68 73 20  y+4);.      lhs 
20600 3d 20 2a 28 69 36 34 2a 29 26 78 3b 0a 20 20 20  = *(i64*)&x;.   
20610 20 20 20 74 65 73 74 63 61 73 65 28 20 6c 68 73     testcase( lhs
20620 3c 30 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61  <0 );.      brea
20630 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
20640 65 20 38 3a 20 0a 20 20 20 20 20 20 6c 68 73 20  e 8: .      lhs 
20650 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
20660 3b 0a 20 20 20 20 63 61 73 65 20 39 3a 0a 20 20  ;.    case 9:.  
20670 20 20 20 20 6c 68 73 20 3d 20 31 3b 0a 20 20 20      lhs = 1;.   
20680 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 2f     break;..    /
20690 2a 20 54 68 69 73 20 63 61 73 65 20 63 6f 75 6c  * This case coul
206a0 64 20 62 65 20 72 65 6d 6f 76 65 64 20 77 69 74  d be removed wit
206b0 68 6f 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68  hout changing th
206c0 65 20 72 65 73 75 6c 74 73 20 6f 66 20 72 75 6e  e results of run
206d0 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 69 73  ning.    ** this
206e0 20 63 6f 64 65 2e 20 49 6e 63 6c 75 64 69 6e 67   code. Including
206f0 20 69 74 20 63 61 75 73 65 73 20 67 63 63 20 74   it causes gcc t
20700 6f 20 67 65 6e 65 72 61 74 65 20 61 20 66 61 73  o generate a fas
20710 74 65 72 20 73 77 69 74 63 68 20 0a 20 20 20 20  ter switch .    
20720 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 28 73 69  ** statement (si
20730 6e 63 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66  nce the range of
20740 20 73 77 69 74 63 68 20 74 61 72 67 65 74 73 20   switch targets 
20750 6e 6f 77 20 73 74 61 72 74 73 20 61 74 20 7a 65  now starts at ze
20760 72 6f 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 73  ro and.    ** is
20770 20 63 6f 6e 74 69 67 75 6f 75 73 29 20 62 75 74   contiguous) but
20780 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20   does not cause 
20790 61 6e 79 20 64 75 70 6c 69 63 61 74 65 20 63 6f  any duplicate co
207a0 64 65 20 74 6f 20 62 65 20 67 65 6e 65 72 61 74  de to be generat
207b0 65 64 0a 20 20 20 20 2a 2a 20 28 61 73 20 67 63  ed.    ** (as gc
207c0 63 20 69 73 20 63 6c 65 76 65 72 20 65 6e 6f 75  c is clever enou
207d0 67 68 20 74 6f 20 63 6f 6d 62 69 6e 65 20 74 68  gh to combine th
207e0 65 20 74 77 6f 20 6c 69 6b 65 20 63 61 73 65 73  e two like cases
207f0 29 2e 20 4f 74 68 65 72 20 0a 20 20 20 20 2a 2a  ). Other .    **
20800 20 63 6f 6d 70 69 6c 65 72 73 20 6d 69 67 68 74   compilers might
20810 20 62 65 20 73 69 6d 69 6c 61 72 2e 20 20 2a 2f   be similar.  */
20820 20 0a 20 20 20 20 63 61 73 65 20 30 3a 20 63 61   .    case 0: ca
20830 73 65 20 37 3a 0a 20 20 20 20 20 20 72 65 74 75  se 7:.      retu
20840 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65 52 65  rn sqlite3VdbeRe
20850 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e 4b 65 79  cordCompare(nKey
20860 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32  1, pKey1, pPKey2
20870 29 3b 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  );..    default:
20880 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71  .      return sq
20890 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
208a0 6f 6d 70 61 72 65 28 6e 4b 65 79 31 2c 20 70 4b  ompare(nKey1, pK
208b0 65 79 31 2c 20 70 50 4b 65 79 32 29 3b 0a 20 20  ey1, pPKey2);.  
208c0 7d 0a 0a 20 20 76 20 3d 20 70 50 4b 65 79 32 2d  }..  v = pPKey2-
208d0 3e 61 4d 65 6d 5b 30 5d 2e 75 2e 69 3b 0a 20 20  >aMem[0].u.i;.  
208e0 69 66 28 20 76 3e 6c 68 73 20 29 7b 0a 20 20 20  if( v>lhs ){.   
208f0 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72   res = pPKey2->r
20900 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 76  1;.  }else if( v
20910 3c 6c 68 73 20 29 7b 0a 20 20 20 20 72 65 73 20  <lhs ){.    res 
20920 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20 20  = pPKey2->r2;.  
20930 7d 65 6c 73 65 20 69 66 28 20 70 50 4b 65 79 32  }else if( pPKey2
20940 2d 3e 6e 46 69 65 6c 64 3e 31 20 29 7b 0a 20 20  ->nField>1 ){.  
20950 20 20 2f 2a 20 54 68 65 20 66 69 72 73 74 20 66    /* The first f
20960 69 65 6c 64 73 20 6f 66 20 74 68 65 20 74 77 6f  ields of the two
20970 20 6b 65 79 73 20 61 72 65 20 65 71 75 61 6c 2e   keys are equal.
20980 20 43 6f 6d 70 61 72 65 20 74 68 65 20 74 72 61   Compare the tra
20990 69 6c 69 6e 67 20 0a 20 20 20 20 2a 2a 20 66 69  iling .    ** fi
209a0 65 6c 64 73 2e 20 20 2a 2f 0a 20 20 20 20 72 65  elds.  */.    re
209b0 73 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52  s = sqlite3VdbeR
209c0 65 63 6f 72 64 43 6f 6d 70 61 72 65 57 69 74 68  ecordCompareWith
209d0 53 6b 69 70 28 6e 4b 65 79 31 2c 20 70 4b 65 79  Skip(nKey1, pKey
209e0 31 2c 20 70 50 4b 65 79 32 2c 20 31 29 3b 0a 20  1, pPKey2, 1);. 
209f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
20a00 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 73 20  he first fields 
20a10 6f 66 20 74 68 65 20 74 77 6f 20 6b 65 79 73 20  of the two keys 
20a20 61 72 65 20 65 71 75 61 6c 20 61 6e 64 20 74 68  are equal and th
20a30 65 72 65 20 61 72 65 20 6e 6f 20 74 72 61 69 6c  ere are no trail
20a40 69 6e 67 0a 20 20 20 20 2a 2a 20 66 69 65 6c 64  ing.    ** field
20a50 73 2e 20 52 65 74 75 72 6e 20 70 50 4b 65 79 32  s. Return pPKey2
20a60 2d 3e 64 65 66 61 75 6c 74 5f 72 63 20 69 6e 20  ->default_rc in 
20a70 74 68 69 73 20 63 61 73 65 2e 20 2a 2f 0a 20 20  this case. */.  
20a80 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e    res = pPKey2->
20a90 64 65 66 61 75 6c 74 5f 72 63 3b 0a 20 20 20 20  default_rc;.    
20aa0 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
20ab0 20 31 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72   1;.  }..  asser
20ac0 74 28 20 76 64 62 65 52 65 63 6f 72 64 43 6f 6d  t( vdbeRecordCom
20ad0 70 61 72 65 44 65 62 75 67 28 6e 4b 65 79 31 2c  pareDebug(nKey1,
20ae0 20 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20   pKey1, pPKey2, 
20af0 72 65 73 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  res) );.  return
20b00 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   res;.}../*.** T
20b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
20b20 61 6e 20 6f 70 74 69 6d 69 7a 65 64 20 76 65 72  an optimized ver
20b30 73 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 56  sion of sqlite3V
20b40 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
20b50 28 29 20 0a 2a 2a 20 74 68 61 74 20 28 61 29 20  () .** that (a) 
20b60 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
20b70 6f 66 20 70 50 4b 65 79 32 20 69 73 20 61 20 73  of pPKey2 is a s
20b80 74 72 69 6e 67 2c 20 74 68 61 74 20 28 62 29 20  tring, that (b) 
20b90 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 0a  the first field.
20ba0 2a 2a 20 75 73 65 73 20 74 68 65 20 63 6f 6c 6c  ** uses the coll
20bb0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
20bc0 49 4e 41 52 59 20 61 6e 64 20 28 63 29 20 74 68  INARY and (c) th
20bd0 61 74 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68  at the size-of-h
20be0 65 61 64 65 72 20 76 61 72 69 6e 74 20 0a 2a 2a  eader varint .**
20bf0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
20c00 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20 66   (pKey1/nKey1) f
20c10 69 74 73 20 69 6e 20 61 20 73 69 6e 67 6c 65 20  its in a single 
20c20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  byte..*/.static 
20c30 69 6e 74 20 76 64 62 65 52 65 63 6f 72 64 43 6f  int vdbeRecordCo
20c40 6d 70 61 72 65 53 74 72 69 6e 67 28 0a 20 20 69  mpareString(.  i
20c50 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
20c60 76 6f 69 64 20 2a 70 4b 65 79 31 2c 20 2f 2a 20  void *pKey1, /* 
20c70 4c 65 66 74 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  Left key */.  Un
20c80 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 50  packedRecord *pP
20c90 4b 65 79 32 20 20 20 20 20 20 20 20 2f 2a 20 52  Key2        /* R
20ca0 69 67 68 74 20 6b 65 79 20 2a 2f 0a 29 7b 0a 20  ight key */.){. 
20cb0 20 63 6f 6e 73 74 20 75 38 20 2a 61 4b 65 79 31   const u8 *aKey1
20cc0 20 3d 20 28 63 6f 6e 73 74 20 75 38 2a 29 70 4b   = (const u8*)pK
20cd0 65 79 31 3b 0a 20 20 69 6e 74 20 73 65 72 69 61  ey1;.  int seria
20ce0 6c 5f 74 79 70 65 3b 0a 20 20 69 6e 74 20 72 65  l_type;.  int re
20cf0 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  s;..  assert( pP
20d00 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d 2e 66 6c  Key2->aMem[0].fl
20d10 61 67 73 20 26 20 4d 45 4d 5f 53 74 72 20 29 3b  ags & MEM_Str );
20d20 0a 20 20 76 64 62 65 41 73 73 65 72 74 46 69 65  .  vdbeAssertFie
20d30 6c 64 43 6f 75 6e 74 57 69 74 68 69 6e 4c 69 6d  ldCountWithinLim
20d40 69 74 73 28 6e 4b 65 79 31 2c 20 70 4b 65 79 31  its(nKey1, pKey1
20d50 2c 20 70 50 4b 65 79 32 2d 3e 70 4b 65 79 49 6e  , pPKey2->pKeyIn
20d60 66 6f 29 3b 0a 20 20 67 65 74 56 61 72 69 6e 74  fo);.  getVarint
20d70 33 32 28 26 61 4b 65 79 31 5b 31 5d 2c 20 73 65  32(&aKey1[1], se
20d80 72 69 61 6c 5f 74 79 70 65 29 3b 0a 20 20 69 66  rial_type);.  if
20d90 28 20 73 65 72 69 61 6c 5f 74 79 70 65 3c 31 32  ( serial_type<12
20da0 20 29 7b 0a 20 20 20 20 72 65 73 20 3d 20 70 50   ){.    res = pP
20db0 4b 65 79 32 2d 3e 72 31 3b 20 20 20 20 20 20 2f  Key2->r1;      /
20dc0 2a 20 28 70 4b 65 79 31 2f 6e 4b 65 79 31 29 20  * (pKey1/nKey1) 
20dd0 69 73 20 61 20 6e 75 6d 62 65 72 20 6f 72 20 61  is a number or a
20de0 20 6e 75 6c 6c 20 2a 2f 0a 20 20 7d 65 6c 73 65   null */.  }else
20df0 20 69 66 28 20 21 28 73 65 72 69 61 6c 5f 74 79   if( !(serial_ty
20e00 70 65 20 26 20 30 78 30 31 29 20 29 7b 20 0a 20  pe & 0x01) ){ . 
20e10 20 20 20 72 65 73 20 3d 20 70 50 4b 65 79 32 2d     res = pPKey2-
20e20 3e 72 32 3b 20 20 20 20 20 20 2f 2a 20 28 70 4b  >r2;      /* (pK
20e30 65 79 31 2f 6e 4b 65 79 31 29 20 69 73 20 61 20  ey1/nKey1) is a 
20e40 62 6c 6f 62 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  blob */.  }else{
20e50 0a 20 20 20 20 69 6e 74 20 6e 43 6d 70 3b 0a 20  .    int nCmp;. 
20e60 20 20 20 69 6e 74 20 6e 53 74 72 3b 0a 20 20 20     int nStr;.   
20e70 20 69 6e 74 20 73 7a 48 64 72 20 3d 20 61 4b 65   int szHdr = aKe
20e80 79 31 5b 30 5d 3b 0a 0a 20 20 20 20 6e 53 74 72  y1[0];..    nStr
20e90 20 3d 20 28 73 65 72 69 61 6c 5f 74 79 70 65 2d   = (serial_type-
20ea0 31 32 29 20 2f 20 32 3b 0a 20 20 20 20 69 66 28  12) / 2;.    if(
20eb0 20 28 73 7a 48 64 72 20 2b 20 6e 53 74 72 29 20   (szHdr + nStr) 
20ec0 3e 20 6e 4b 65 79 31 20 29 7b 0a 20 20 20 20 20  > nKey1 ){.     
20ed0 20 70 50 4b 65 79 32 2d 3e 65 72 72 43 6f 64 65   pPKey2->errCode
20ee0 20 3d 20 28 75 38 29 53 51 4c 49 54 45 5f 43 4f   = (u8)SQLITE_CO
20ef0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
20f00 20 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 2f    return 0;    /
20f10 2a 20 43 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a  * Corruption */.
20f20 20 20 20 20 7d 0a 20 20 20 20 6e 43 6d 70 20 3d      }.    nCmp =
20f30 20 4d 49 4e 28 20 70 50 4b 65 79 32 2d 3e 61 4d   MIN( pPKey2->aM
20f40 65 6d 5b 30 5d 2e 6e 2c 20 6e 53 74 72 20 29 3b  em[0].n, nStr );
20f50 0a 20 20 20 20 72 65 73 20 3d 20 6d 65 6d 63 6d  .    res = memcm
20f60 70 28 26 61 4b 65 79 31 5b 73 7a 48 64 72 5d 2c  p(&aKey1[szHdr],
20f70 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
20f80 2e 7a 2c 20 6e 43 6d 70 29 3b 0a 0a 20 20 20 20  .z, nCmp);..    
20f90 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
20fa0 20 20 20 20 72 65 73 20 3d 20 6e 53 74 72 20 2d      res = nStr -
20fb0 20 70 50 4b 65 79 32 2d 3e 61 4d 65 6d 5b 30 5d   pPKey2->aMem[0]
20fc0 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 72 65  .n;.      if( re
20fd0 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  s==0 ){.        
20fe0 69 66 28 20 70 50 4b 65 79 32 2d 3e 6e 46 69 65  if( pPKey2->nFie
20ff0 6c 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ld>1 ){.        
21000 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 56    res = sqlite3V
21010 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
21020 57 69 74 68 53 6b 69 70 28 6e 4b 65 79 31 2c 20  WithSkip(nKey1, 
21030 70 4b 65 79 31 2c 20 70 50 4b 65 79 32 2c 20 31  pKey1, pPKey2, 1
21040 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
21050 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 20  {.          res 
21060 3d 20 70 50 4b 65 79 32 2d 3e 64 65 66 61 75 6c  = pPKey2->defaul
21070 74 5f 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20  t_rc;.          
21080 70 50 4b 65 79 32 2d 3e 65 71 53 65 65 6e 20 3d  pPKey2->eqSeen =
21090 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
210a0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
210b0 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  s>0 ){.        r
210c0 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b  es = pPKey2->r2;
210d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
210e0 20 20 20 20 20 20 72 65 73 20 3d 20 70 50 4b 65        res = pPKe
210f0 79 32 2d 3e 72 31 3b 0a 20 20 20 20 20 20 7d 0a  y2->r1;.      }.
21100 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65      }else if( re
21110 73 3e 30 20 29 7b 0a 20 20 20 20 20 20 72 65 73  s>0 ){.      res
21120 20 3d 20 70 50 4b 65 79 32 2d 3e 72 32 3b 0a 20   = pPKey2->r2;. 
21130 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21140 72 65 73 20 3d 20 70 50 4b 65 79 32 2d 3e 72 31  res = pPKey2->r1
21150 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61  ;.    }.  }..  a
21160 73 73 65 72 74 28 20 76 64 62 65 52 65 63 6f 72  ssert( vdbeRecor
21170 64 43 6f 6d 70 61 72 65 44 65 62 75 67 28 6e 4b  dCompareDebug(nK
21180 65 79 31 2c 20 70 4b 65 79 31 2c 20 70 50 4b 65  ey1, pKey1, pPKe
21190 79 32 2c 20 72 65 73 29 0a 20 20 20 20 20 20 20  y2, res).       
211a0 7c 7c 20 43 4f 52 52 55 50 54 5f 44 42 0a 20 20  || CORRUPT_DB.  
211b0 20 20 20 20 20 7c 7c 20 70 50 4b 65 79 32 2d 3e       || pPKey2->
211c0 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 2d 3e 6d 61  pKeyInfo->db->ma
211d0 6c 6c 6f 63 46 61 69 6c 65 64 0a 20 20 29 3b 0a  llocFailed.  );.
211e0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
211f0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
21200 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71  pointer to an sq
21210 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 43  lite3VdbeRecordC
21220 6f 6d 70 61 72 65 28 29 20 63 6f 6d 70 61 74 69  ompare() compati
21230 62 6c 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ble function.** 
21240 73 75 69 74 61 62 6c 65 20 66 6f 72 20 63 6f 6d  suitable for com
21250 70 61 72 69 6e 67 20 73 65 72 69 61 6c 69 7a 65  paring serialize
21260 64 20 72 65 63 6f 72 64 73 20 74 6f 20 74 68 65  d records to the
21270 20 75 6e 70 61 63 6b 65 64 20 72 65 63 6f 72 64   unpacked record
21280 20 70 61 73 73 65 64 0a 2a 2a 20 61 73 20 74 68   passed.** as th
21290 65 20 6f 6e 6c 79 20 61 72 67 75 6d 65 6e 74 2e  e only argument.
212a0 0a 2a 2f 0a 52 65 63 6f 72 64 43 6f 6d 70 61 72  .*/.RecordCompar
212b0 65 20 73 71 6c 69 74 65 33 56 64 62 65 46 69 6e  e sqlite3VdbeFin
212c0 64 43 6f 6d 70 61 72 65 28 55 6e 70 61 63 6b 65  dCompare(Unpacke
212d0 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20 20 2f  dRecord *p){.  /
212e0 2a 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43 6f  * varintRecordCo
212f0 6d 70 61 72 65 49 6e 74 28 29 20 61 6e 64 20 76  mpareInt() and v
21300 61 72 69 6e 74 52 65 63 6f 72 64 43 6f 6d 70 61  arintRecordCompa
21310 72 65 53 74 72 69 6e 67 28 29 20 62 6f 74 68 20  reString() both 
21320 61 73 73 75 6d 65 0a 20 20 2a 2a 20 74 68 61 74  assume.  ** that
21330 20 74 68 65 20 73 69 7a 65 2d 6f 66 2d 68 65 61   the size-of-hea
21340 64 65 72 20 76 61 72 69 6e 74 20 74 68 61 74 20  der varint that 
21350 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 73 74  occurs at the st
21360 61 72 74 20 6f 66 20 65 61 63 68 20 72 65 63 6f  art of each reco
21370 72 64 0a 20 20 2a 2a 20 66 69 74 73 20 69 6e 20  rd.  ** fits in 
21380 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 28 69  a single byte (i
21390 2e 65 2e 20 69 73 20 31 32 37 20 6f 72 20 6c 65  .e. is 127 or le
213a0 73 73 29 2e 20 76 61 72 69 6e 74 52 65 63 6f 72  ss). varintRecor
213b0 64 43 6f 6d 70 61 72 65 49 6e 74 28 29 0a 20 20  dCompareInt().  
213c0 2a 2a 20 61 6c 73 6f 20 61 73 73 75 6d 65 73 20  ** also assumes 
213d0 74 68 61 74 20 69 74 20 69 73 20 73 61 66 65 20  that it is safe 
213e0 74 6f 20 6f 76 65 72 72 65 61 64 20 61 20 62 75  to overread a bu
213f0 66 66 65 72 20 62 79 20 61 74 20 6c 65 61 73 74  ffer by at least
21400 20 74 68 65 20 0a 20 20 2a 2a 20 6d 61 78 69 6d   the .  ** maxim
21410 75 6d 20 70 6f 73 73 69 62 6c 65 20 6c 65 67 61  um possible lega
21420 6c 20 68 65 61 64 65 72 20 73 69 7a 65 20 70 6c  l header size pl
21430 75 73 20 38 20 62 79 74 65 73 2e 20 42 65 63 61  us 8 bytes. Beca
21440 75 73 65 20 74 68 65 72 65 20 69 73 0a 20 20 2a  use there is.  *
21450 2a 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  * guaranteed to 
21460 62 65 20 61 74 20 6c 65 61 73 74 20 37 34 20 28  be at least 74 (
21470 62 75 74 20 6e 6f 74 20 31 33 36 29 20 62 79 74  but not 136) byt
21480 65 73 20 6f 66 20 70 61 64 64 69 6e 67 20 66 6f  es of padding fo
21490 6c 6c 6f 77 69 6e 67 20 65 61 63 68 0a 20 20 2a  llowing each.  *
214a0 2a 20 62 75 66 66 65 72 20 70 61 73 73 65 64 20  * buffer passed 
214b0 74 6f 20 76 61 72 69 6e 74 52 65 63 6f 72 64 43  to varintRecordC
214c0 6f 6d 70 61 72 65 49 6e 74 28 29 20 74 68 69 73  ompareInt() this
214d0 20 6d 61 6b 65 73 20 69 74 20 63 6f 6e 76 65 6e   makes it conven
214e0 69 65 6e 74 20 74 6f 0a 20 20 2a 2a 20 6c 69 6d  ient to.  ** lim
214f0 69 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  it the size of t
21500 68 65 20 68 65 61 64 65 72 20 74 6f 20 36 34 20  he header to 64 
21510 62 79 74 65 73 20 69 6e 20 63 61 73 65 73 20 77  bytes in cases w
21520 68 65 72 65 20 74 68 65 20 66 69 72 73 74 20 66  here the first f
21530 69 65 6c 64 0a 20 20 2a 2a 20 69 73 20 61 6e 20  ield.  ** is an 
21540 69 6e 74 65 67 65 72 2e 0a 20 20 2a 2a 0a 20 20  integer..  **.  
21550 2a 2a 20 54 68 65 20 65 61 73 69 65 73 74 20 77  ** The easiest w
21560 61 79 20 74 6f 20 65 6e 66 6f 72 63 65 20 74 68  ay to enforce th
21570 69 73 20 6c 69 6d 69 74 20 69 73 20 74 6f 20 63  is limit is to c
21580 6f 6e 73 69 64 65 72 20 6f 6e 6c 79 20 72 65 63  onsider only rec
21590 6f 72 64 73 20 77 69 74 68 0a 20 20 2a 2a 20 31  ords with.  ** 1
215a0 33 20 66 69 65 6c 64 73 20 6f 72 20 6c 65 73 73  3 fields or less
215b0 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20 66  . If the first f
215c0 69 65 6c 64 20 69 73 20 61 6e 20 69 6e 74 65 67  ield is an integ
215d0 65 72 2c 20 74 68 65 20 6d 61 78 69 6d 75 6d 20  er, the maximum 
215e0 6c 65 67 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  legal.  ** heade
215f0 72 20 73 69 7a 65 20 69 73 20 28 31 32 2a 35 20  r size is (12*5 
21600 2b 20 31 20 2b 20 31 29 20 62 79 74 65 73 2e 20  + 1 + 1) bytes. 
21610 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 70 4b   */.  if( (p->pK
21620 65 79 49 6e 66 6f 2d 3e 6e 46 69 65 6c 64 20 2b  eyInfo->nField +
21630 20 70 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 6e 58   p->pKeyInfo->nX
21640 46 69 65 6c 64 29 3c 3d 31 33 20 29 7b 0a 20 20  Field)<=13 ){.  
21650 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 70 2d    int flags = p-
21660 3e 61 4d 65 6d 5b 30 5d 2e 66 6c 61 67 73 3b 0a  >aMem[0].flags;.
21670 20 20 20 20 69 66 28 20 70 2d 3e 70 4b 65 79 49      if( p->pKeyI
21680 6e 66 6f 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b  nfo->aSortOrder[
21690 30 5d 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 72  0] ){.      p->r
216a0 31 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 2d 3e  1 = 1;.      p->
216b0 72 32 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  r2 = -1;.    }el
216c0 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 72 31 20  se{.      p->r1 
216d0 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 2d 3e 72  = -1;.      p->r
216e0 32 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  2 = 1;.    }.   
216f0 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 4d 45   if( (flags & ME
21700 4d 5f 49 6e 74 29 20 29 7b 0a 20 20 20 20 20 20  M_Int) ){.      
21710 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f 72  return vdbeRecor
21720 64 43 6f 6d 70 61 72 65 49 6e 74 3b 0a 20 20 20  dCompareInt;.   
21730 20 7d 0a 20 20 20 20 74 65 73 74 63 61 73 65 28   }.    testcase(
21740 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 52 65 61   flags & MEM_Rea
21750 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  l );.    testcas
21760 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d 5f 4e  e( flags & MEM_N
21770 75 6c 6c 20 29 3b 0a 20 20 20 20 74 65 73 74 63  ull );.    testc
21780 61 73 65 28 20 66 6c 61 67 73 20 26 20 4d 45 4d  ase( flags & MEM
21790 5f 42 6c 6f 62 20 29 3b 0a 20 20 20 20 69 66 28  _Blob );.    if(
217a0 20 28 66 6c 61 67 73 20 26 20 28 4d 45 4d 5f 52   (flags & (MEM_R
217b0 65 61 6c 7c 4d 45 4d 5f 4e 75 6c 6c 7c 4d 45 4d  eal|MEM_Null|MEM
217c0 5f 42 6c 6f 62 29 29 3d 3d 30 20 26 26 20 70 2d  _Blob))==0 && p-
217d0 3e 70 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c  >pKeyInfo->aColl
217e0 5b 30 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  [0]==0 ){.      
217f0 61 73 73 65 72 74 28 20 66 6c 61 67 73 20 26 20  assert( flags & 
21800 4d 45 4d 5f 53 74 72 20 29 3b 0a 20 20 20 20 20  MEM_Str );.     
21810 20 72 65 74 75 72 6e 20 76 64 62 65 52 65 63 6f   return vdbeReco
21820 72 64 43 6f 6d 70 61 72 65 53 74 72 69 6e 67 3b  rdCompareString;
21830 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
21840 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
21850 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 3b 0a 7d  RecordCompare;.}
21860 0a 0a 2f 2a 0a 2a 2a 20 70 43 75 72 20 70 6f 69  ../*.** pCur poi
21870 6e 74 73 20 61 74 20 61 6e 20 69 6e 64 65 78 20  nts at an index 
21880 65 6e 74 72 79 20 63 72 65 61 74 65 64 20 75 73  entry created us
21890 69 6e 67 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52  ing the OP_MakeR
218a0 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 0a 2a 2a  ecord opcode..**
218b0 20 52 65 61 64 20 74 68 65 20 72 6f 77 69 64 20   Read the rowid 
218c0 28 74 68 65 20 6c 61 73 74 20 66 69 65 6c 64 20  (the last field 
218d0 69 6e 20 74 68 65 20 72 65 63 6f 72 64 29 20 61  in the record) a
218e0 6e 64 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  nd store it in *
218f0 72 6f 77 69 64 2e 0a 2a 2a 20 52 65 74 75 72 6e  rowid..** Return
21900 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
21910 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20  erything works, 
21920 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
21930 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a   otherwise..**.*
21940 2a 20 70 43 75 72 20 6d 69 67 68 74 20 62 65 20  * pCur might be 
21950 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 65 78 74  pointing to text
21960 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
21970 20 63 6f 72 72 75 70 74 20 64 61 74 61 62 61 73   corrupt databas
21980 65 20 66 69 6c 65 2e 0a 2a 2a 20 53 6f 20 74 68  e file..** So th
21990 65 20 63 6f 6e 74 65 6e 74 20 63 61 6e 6e 6f 74  e content cannot
219a0 20 62 65 20 74 72 75 73 74 65 64 2e 20 20 44 6f   be trusted.  Do
219b0 20 61 70 70 72 6f 70 72 69 61 74 65 20 63 68 65   appropriate che
219c0 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65  cks on the conte
219d0 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
219e0 65 33 56 64 62 65 49 64 78 52 6f 77 69 64 28 73  e3VdbeIdxRowid(s
219f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 42 74 43 75  qlite3 *db, BtCu
21a00 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20  rsor *pCur, i64 
21a10 2a 72 6f 77 69 64 29 7b 0a 20 20 69 36 34 20 6e  *rowid){.  i64 n
21a20 43 65 6c 6c 4b 65 79 20 3d 20 30 3b 0a 20 20 69  CellKey = 0;.  i
21a30 6e 74 20 72 63 3b 0a 20 20 75 33 32 20 73 7a 48  nt rc;.  u32 szH
21a40 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 69  dr;        /* Si
21a50 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72  ze of the header
21a60 20 2a 2f 0a 20 20 75 33 32 20 74 79 70 65 52 6f   */.  u32 typeRo
21a70 77 69 64 3b 20 20 20 20 2f 2a 20 53 65 72 69 61  wid;    /* Seria
21a80 6c 20 74 79 70 65 20 6f 66 20 74 68 65 20 72 6f  l type of the ro
21a90 77 69 64 20 2a 2f 0a 20 20 75 33 32 20 6c 65 6e  wid */.  u32 len
21aa0 52 6f 77 69 64 3b 20 20 20 20 20 2f 2a 20 53 69  Rowid;     /* Si
21ab0 7a 65 20 6f 66 20 74 68 65 20 72 6f 77 69 64 20  ze of the rowid 
21ac0 2a 2f 0a 20 20 4d 65 6d 20 6d 2c 20 76 3b 0a 0a  */.  Mem m, v;..
21ad0 20 20 2f 2a 20 47 65 74 20 74 68 65 20 73 69 7a    /* Get the siz
21ae0 65 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65  e of the index e
21af0 6e 74 72 79 2e 20 20 4f 6e 6c 79 20 69 6e 64 69  ntry.  Only indi
21b00 63 65 73 20 65 6e 74 72 69 65 73 20 6f 66 20 6c  ces entries of l
21b10 65 73 73 0a 20 20 2a 2a 20 74 68 61 6e 20 32 47  ess.  ** than 2G
21b20 69 42 20 61 72 65 20 73 75 70 70 6f 72 74 20 2d  iB are support -
21b30 20 61 6e 79 74 68 69 6e 67 20 6c 61 72 67 65 20   anything large 
21b40 6d 75 73 74 20 62 65 20 64 61 74 61 62 61 73 65  must be database
21b50 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 2a   corruption..  *
21b60 2a 20 41 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  * Any corruption
21b70 20 69 73 20 64 65 74 65 63 74 65 64 20 69 6e 20   is detected in 
21b80 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
21b90 65 43 65 6c 6c 50 74 72 28 29 2c 20 74 68 6f 75  eCellPtr(), thou
21ba0 67 68 2c 20 73 6f 0a 20 20 2a 2a 20 74 68 69 73  gh, so.  ** this
21bb0 20 63 6f 64 65 20 63 61 6e 20 73 61 66 65 6c 79   code can safely
21bc0 20 61 73 73 75 6d 65 20 74 68 61 74 20 6e 43 65   assume that nCe
21bd0 6c 6c 4b 65 79 20 69 73 20 33 32 2d 62 69 74 73  llKey is 32-bits
21be0 20 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74    .  */.  assert
21bf0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  ( sqlite3BtreeCu
21c00 72 73 6f 72 49 73 56 61 6c 69 64 28 70 43 75 72  rsorIsValid(pCur
21c10 29 20 29 3b 0a 20 20 6e 43 65 6c 6c 4b 65 79 20  ) );.  nCellKey 
21c20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
21c30 79 6c 6f 61 64 53 69 7a 65 28 70 43 75 72 29 3b  yloadSize(pCur);
21c40 0a 20 20 61 73 73 65 72 74 28 20 28 6e 43 65 6c  .  assert( (nCel
21c50 6c 4b 65 79 20 26 20 53 51 4c 49 54 45 5f 4d 41  lKey & SQLITE_MA
21c60 58 5f 55 33 32 29 3d 3d 28 75 36 34 29 6e 43 65  X_U32)==(u64)nCe
21c70 6c 6c 4b 65 79 20 29 3b 0a 0a 20 20 2f 2a 20 52  llKey );..  /* R
21c80 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6d 70 6c  ead in the compl
21c90 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  ete content of t
21ca0 68 65 20 69 6e 64 65 78 20 65 6e 74 72 79 20 2a  he index entry *
21cb0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d  /.  sqlite3VdbeM
21cc0 65 6d 49 6e 69 74 28 26 6d 2c 20 64 62 2c 20 30  emInit(&m, db, 0
21cd0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
21ce0 33 56 64 62 65 4d 65 6d 46 72 6f 6d 42 74 72 65  3VdbeMemFromBtre
21cf0 65 28 70 43 75 72 2c 20 30 2c 20 28 75 33 32 29  e(pCur, 0, (u32)
21d00 6e 43 65 6c 6c 4b 65 79 2c 20 31 2c 20 26 6d 29  nCellKey, 1, &m)
21d10 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
21d20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21d30 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78  ..  /* The index
21d40 20 65 6e 74 72 79 20 6d 75 73 74 20 62 65 67 69   entry must begi
21d50 6e 20 77 69 74 68 20 61 20 68 65 61 64 65 72 20  n with a header 
21d60 73 69 7a 65 20 2a 2f 0a 20 20 28 76 6f 69 64 29  size */.  (void)
21d70 67 65 74 56 61 72 69 6e 74 33 32 28 28 75 38 2a  getVarint32((u8*
21d80 29 6d 2e 7a 2c 20 73 7a 48 64 72 29 3b 0a 20 20  )m.z, szHdr);.  
21d90 74 65 73 74 63 61 73 65 28 20 73 7a 48 64 72 3d  testcase( szHdr=
21da0 3d 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =3 );.  testcase
21db0 28 20 73 7a 48 64 72 3d 3d 6d 2e 6e 20 29 3b 0a  ( szHdr==m.n );.
21dc0 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28 73    if( unlikely(s
21dd0 7a 48 64 72 3c 33 20 7c 7c 20 28 69 6e 74 29 73  zHdr<3 || (int)s
21de0 7a 48 64 72 3e 6d 2e 6e 29 20 29 7b 0a 20 20 20  zHdr>m.n) ){.   
21df0 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69 64 5f   goto idx_rowid_
21e00 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20 7d 0a  corruption;.  }.
21e10 0a 20 20 2f 2a 20 54 68 65 20 6c 61 73 74 20 66  .  /* The last f
21e20 69 65 6c 64 20 6f 66 20 74 68 65 20 69 6e 64 65  ield of the inde
21e30 78 20 73 68 6f 75 6c 64 20 62 65 20 61 6e 20 69  x should be an i
21e40 6e 74 65 67 65 72 20 2d 20 74 68 65 20 52 4f 57  nteger - the ROW
21e50 49 44 2e 0a 20 20 2a 2a 20 56 65 72 69 66 79 20  ID..  ** Verify 
21e60 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 65 6e  that the last en
21e70 74 72 79 20 72 65 61 6c 6c 79 20 69 73 20 61 6e  try really is an
21e80 20 69 6e 74 65 67 65 72 2e 20 2a 2f 0a 20 20 28   integer. */.  (
21e90 76 6f 69 64 29 67 65 74 56 61 72 69 6e 74 33 32  void)getVarint32
21ea0 28 28 75 38 2a 29 26 6d 2e 7a 5b 73 7a 48 64 72  ((u8*)&m.z[szHdr
21eb0 2d 31 5d 2c 20 74 79 70 65 52 6f 77 69 64 29 3b  -1], typeRowid);
21ec0 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21ed0 65 52 6f 77 69 64 3d 3d 31 20 29 3b 0a 20 20 74  eRowid==1 );.  t
21ee0 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21ef0 69 64 3d 3d 32 20 29 3b 0a 20 20 74 65 73 74 63  id==2 );.  testc
21f00 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21f10 33 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  3 );.  testcase(
21f20 20 74 79 70 65 52 6f 77 69 64 3d 3d 34 20 29 3b   typeRowid==4 );
21f30 0a 20 20 74 65 73 74 63 61 73 65 28 20 74 79 70  .  testcase( typ
21f40 65 52 6f 77 69 64 3d 3d 35 20 29 3b 0a 20 20 74  eRowid==5 );.  t
21f50 65 73 74 63 61 73 65 28 20 74 79 70 65 52 6f 77  estcase( typeRow
21f60 69 64 3d 3d 36 20 29 3b 0a 20 20 74 65 73 74 63  id==6 );.  testc
21f70 61 73 65 28 20 74 79 70 65 52 6f 77 69 64 3d 3d  ase( typeRowid==
21f80 38 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  8 );.  testcase(
21f90 20 74 79 70 65 52 6f 77 69 64 3d 3d 39 20 29 3b   typeRowid==9 );
21fa0 0a 20 20 69 66 28 20 75 6e 6c 69 6b 65 6c 79 28  .  if( unlikely(
21fb0 74 79 70 65 52 6f 77 69 64 3c 31 20 7c 7c 20 74  typeRowid<1 || t
21fc0 79 70 65 52 6f 77 69 64 3e 39 20 7c 7c 20 74 79  ypeRowid>9 || ty
21fd0 70 65 52 6f 77 69 64 3d 3d 37 29 20 29 7b 0a 20  peRowid==7) ){. 
21fe0 20 20 20 67 6f 74 6f 20 69 64 78 5f 72 6f 77 69     goto idx_rowi
21ff0 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3b 0a 20 20  d_corruption;.  
22000 7d 0a 20 20 6c 65 6e 52 6f 77 69 64 20 3d 20 73  }.  lenRowid = s
22010 71 6c 69 74 65 33 53 6d 61 6c 6c 54 79 70 65 53  qlite3SmallTypeS
22020 69 7a 65 73 5b 74 79 70 65 52 6f 77 69 64 5d 3b  izes[typeRowid];
22030 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 75 33  .  testcase( (u3
22040 32 29 6d 2e 6e 3d 3d 73 7a 48 64 72 2b 6c 65 6e  2)m.n==szHdr+len
22050 52 6f 77 69 64 20 29 3b 0a 20 20 69 66 28 20 75  Rowid );.  if( u
22060 6e 6c 69 6b 65 6c 79 28 28 75 33 32 29 6d 2e 6e  nlikely((u32)m.n
22070 3c 73 7a 48 64 72 2b 6c 65 6e 52 6f 77 69 64 29  <szHdr+lenRowid)
22080 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 69 64 78   ){.    goto idx
22090 5f 72 6f 77 69 64 5f 63 6f 72 72 75 70 74 69 6f  _rowid_corruptio
220a0 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 65 74  n;.  }..  /* Fet
220b0 63 68 20 74 68 65 20 69 6e 74 65 67 65 72 20 6f  ch the integer o
220c0 66 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  ff the end of th
220d0 65 20 69 6e 64 65 78 20 72 65 63 6f 72 64 20 2a  e index record *
220e0 2f 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65 53  /.  sqlite3VdbeS
220f0 65 72 69 61 6c 47 65 74 28 28 75 38 2a 29 26 6d  erialGet((u8*)&m
22100 2e 7a 5b 6d 2e 6e 2d 6c 65 6e 52 6f 77 69 64 5d  .z[m.n-lenRowid]
22110 2c 20 74 79 70 65 52 6f 77 69 64 2c 20 26 76 29  , typeRowid, &v)
22120 3b 0a 20 20 2a 72 6f 77 69 64 20 3d 20 76 2e 75  ;.  *rowid = v.u
22130 2e 69 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62  .i;.  sqlite3Vdb
22140 65 4d 65 6d 52 65 6c 65 61 73 65 28 26 6d 29 3b  eMemRelease(&m);
22150 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22160 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20  _OK;..  /* Jump 
22170 68 65 72 65 20 69 66 20 64 61 74 61 62 61 73 65  here if database
22180 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 64   corruption is d
22190 65 74 65 63 74 65 64 20 61 66 74 65 72 20 6d 20  etected after m 
221a0 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 61 6c  has been.  ** al
221b0 6c 6f 63 61 74 65 64 2e 20 20 46 72 65 65 20 74  located.  Free t
221c0 68 65 20 6d 20 6f 62 6a 65 63 74 20 61 6e 64 20  he m object and 
221d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
221e0 52 52 55 50 54 2e 20 2a 2f 0a 69 64 78 5f 72 6f  RRUPT. */.idx_ro
221f0 77 69 64 5f 63 6f 72 72 75 70 74 69 6f 6e 3a 0a  wid_corruption:.
22200 20 20 74 65 73 74 63 61 73 65 28 20 6d 2e 73 7a    testcase( m.sz
22210 4d 61 6c 6c 6f 63 21 3d 30 20 29 3b 0a 20 20 73  Malloc!=0 );.  s
22220 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c  qlite3VdbeMemRel
22230 65 61 73 65 28 26 6d 29 3b 0a 20 20 72 65 74 75  ease(&m);.  retu
22240 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
22250 54 5f 42 4b 50 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  T_BKPT;.}../*.**
22260 20 43 6f 6d 70 61 72 65 20 74 68 65 20 6b 65 79   Compare the key
22270 20 6f 66 20 74 68 65 20 69 6e 64 65 78 20 65 6e   of the index en
22280 74 72 79 20 74 68 61 74 20 63 75 72 73 6f 72 20  try that cursor 
22290 70 43 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  pC is pointing t
222a0 6f 20 61 67 61 69 6e 73 74 0a 2a 2a 20 74 68 65  o against.** the
222b0 20 6b 65 79 20 73 74 72 69 6e 67 20 69 6e 20 70   key string in p
222c0 55 6e 70 61 63 6b 65 64 2e 20 20 57 72 69 74 65  Unpacked.  Write
222d0 20 69 6e 74 6f 20 2a 70 52 65 73 20 61 20 6e 75   into *pRes a nu
222e0 6d 62 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  mber.** that is 
222f0 6e 65 67 61 74 69 76 65 2c 20 7a 65 72 6f 2c 20  negative, zero, 
22300 6f 72 20 70 6f 73 69 74 69 76 65 20 69 66 20 70  or positive if p
22310 43 20 69 73 20 6c 65 73 73 20 74 68 61 6e 2c 20  C is less than, 
22320 65 71 75 61 6c 20 74 6f 2c 0a 2a 2a 20 6f 72 20  equal to,.** or 
22330 67 72 65 61 74 65 72 20 74 68 61 6e 20 70 55 6e  greater than pUn
22340 70 61 63 6b 65 64 2e 20 20 52 65 74 75 72 6e 20  packed.  Return 
22350 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
22360 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 70 55 6e 70  cess..**.** pUnp
22370 61 63 6b 65 64 20 69 73 20 65 69 74 68 65 72 20  acked is either 
22380 63 72 65 61 74 65 64 20 77 69 74 68 6f 75 74 20  created without 
22390 61 20 72 6f 77 69 64 20 6f 72 20 69 73 20 74 72  a rowid or is tr
223a0 75 6e 63 61 74 65 64 20 73 6f 20 74 68 61 74 20  uncated so that 
223b0 69 74 0a 2a 2a 20 6f 6d 69 74 73 20 74 68 65 20  it.** omits the 
223c0 72 6f 77 69 64 20 61 74 20 74 68 65 20 65 6e 64  rowid at the end
223d0 2e 20 20 54 68 65 20 72 6f 77 69 64 20 61 74 20  .  The rowid at 
223e0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 69  the end of the i
223f0 6e 64 65 78 20 65 6e 74 72 79 0a 2a 2a 20 69 73  ndex entry.** is
22400 20 69 67 6e 6f 72 65 64 20 61 73 20 77 65 6c 6c   ignored as well
22410 2e 20 20 48 65 6e 63 65 2c 20 74 68 69 73 20 72  .  Hence, this r
22420 6f 75 74 69 6e 65 20 6f 6e 6c 79 20 63 6f 6d 70  outine only comp
22430 61 72 65 73 20 74 68 65 20 70 72 65 66 69 78 65  ares the prefixe
22440 73 20 0a 2a 2a 20 6f 66 20 74 68 65 20 6b 65 79  s .** of the key
22450 73 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 66  s prior to the f
22460 69 6e 61 6c 20 72 6f 77 69 64 2c 20 6e 6f 74 20  inal rowid, not 
22470 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79 2e 0a  the entire key..
22480 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 56 64  */.int sqlite3Vd
22490 62 65 49 64 78 4b 65 79 43 6f 6d 70 61 72 65 28  beIdxKeyCompare(
224a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
224d0 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20  connection */.  
224e0 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 2c 20  VdbeCursor *pC, 
224f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22500 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
22510 6f 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73  o compare agains
22520 74 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52  t */.  UnpackedR
22530 65 63 6f 72 64 20 2a 70 55 6e 70 61 63 6b 65 64  ecord *pUnpacked
22540 2c 20 20 20 20 20 20 20 2f 2a 20 55 6e 70 61 63  ,       /* Unpac
22550 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 6b  ked version of k
22560 65 79 20 2a 2f 0a 20 20 69 6e 74 20 2a 72 65 73  ey */.  int *res
22570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22580 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
22590 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  e the comparison
225a0 20 72 65 73 75 6c 74 20 68 65 72 65 20 2a 2f 0a   result here */.
225b0 29 7b 0a 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65  ){.  i64 nCellKe
225c0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  y = 0;.  int rc;
225d0 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
225e0 72 3b 0a 20 20 4d 65 6d 20 6d 3b 0a 0a 20 20 61  r;.  Mem m;..  a
225f0 73 73 65 72 74 28 20 70 43 2d 3e 65 43 75 72 54  ssert( pC->eCurT
22600 79 70 65 3d 3d 43 55 52 54 59 50 45 5f 42 54 52  ype==CURTYPE_BTR
22610 45 45 20 29 3b 0a 20 20 70 43 75 72 20 3d 20 70  EE );.  pCur = p
22620 43 2d 3e 75 63 2e 70 43 75 72 73 6f 72 3b 0a 20  C->uc.pCursor;. 
22630 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
22640 42 74 72 65 65 43 75 72 73 6f 72 49 73 56 61 6c  BtreeCursorIsVal
22650 69 64 28 70 43 75 72 29 20 29 3b 0a 20 20 6e 43  id(pCur) );.  nC
22660 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  ellKey = sqlite3
22670 42 74 72 65 65 50 61 79 6c 6f 61 64 53 69 7a 65  BtreePayloadSize
22680 28 70 43 75 72 29 3b 0a 20 20 2f 2a 20 6e 43 65  (pCur);.  /* nCe
22690 6c 6c 4b 65 79 20 77 69 6c 6c 20 61 6c 77 61 79  llKey will alway
226a0 73 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  s be between 0 a
226b0 6e 64 20 30 78 66 66 66 66 66 66 66 66 20 62 65  nd 0xffffffff be
226c0 63 61 75 73 65 20 6f 66 20 74 68 65 20 77 61 79  cause of the way
226d0 0a 20 20 2a 2a 20 74 68 61 74 20 62 74 72 65 65  .  ** that btree
226e0 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 20 61  ParseCellPtr() a
226f0 6e 64 20 73 71 6c 69 74 65 33 47 65 74 56 61 72  nd sqlite3GetVar
22700 69 6e 74 33 32 28 29 20 61 72 65 20 69 6d 70 6c  int32() are impl
22710 65 6d 65 6e 74 65 64 20 2a 2f 0a 20 20 69 66 28  emented */.  if(
22720 20 6e 43 65 6c 6c 4b 65 79 3c 3d 30 20 7c 7c 20   nCellKey<=0 || 
22730 6e 43 65 6c 6c 4b 65 79 3e 30 78 37 66 66 66 66  nCellKey>0x7ffff
22740 66 66 66 20 29 7b 0a 20 20 20 20 2a 72 65 73 20  fff ){.    *res 
22750 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
22760 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22770 4b 50 54 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  KPT;.  }.  sqlit
22780 65 33 56 64 62 65 4d 65 6d 49 6e 69 74 28 26 6d  e3VdbeMemInit(&m
22790 2c 20 64 62 2c 20 30 29 3b 0a 20 20 72 63 20 3d  , db, 0);.  rc =
227a0 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d 46   sqlite3VdbeMemF
227b0 72 6f 6d 42 74 72 65 65 28 70 43 75 72 2c 20 30  romBtree(pCur, 0
227c0 2c 20 28 75 33 32 29 6e 43 65 6c 6c 4b 65 79 2c  , (u32)nCellKey,
227d0 20 31 2c 20 26 6d 29 3b 0a 20 20 69 66 28 20 72   1, &m);.  if( r
227e0 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  c ){.    return 
227f0 72 63 3b 0a 20 20 7d 0a 20 20 2a 72 65 73 20 3d  rc;.  }.  *res =
22800 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
22810 72 64 43 6f 6d 70 61 72 65 28 6d 2e 6e 2c 20 6d  rdCompare(m.n, m
22820 2e 7a 2c 20 70 55 6e 70 61 63 6b 65 64 29 3b 0a  .z, pUnpacked);.
22830 20 20 73 71 6c 69 74 65 33 56 64 62 65 4d 65 6d    sqlite3VdbeMem
22840 52 65 6c 65 61 73 65 28 26 6d 29 3b 0a 20 20 72  Release(&m);.  r
22850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
22860 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
22870 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
22880 76 61 6c 75 65 20 74 6f 20 62 65 20 72 65 74 75  value to be retu
22890 72 6e 65 64 20 62 79 20 73 75 62 73 65 71 75 65  rned by subseque
228a0 6e 74 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73  nt calls to.** s
228b0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 29  qlite3_changes()
228c0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
228d0 20 68 61 6e 64 6c 65 20 27 64 62 27 2e 20 0a 2a   handle 'db'. .*
228e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64  /.void sqlite3Vd
228f0 62 65 53 65 74 43 68 61 6e 67 65 73 28 73 71 6c  beSetChanges(sql
22900 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e 43  ite3 *db, int nC
22910 68 61 6e 67 65 29 7b 0a 20 20 61 73 73 65 72 74  hange){.  assert
22920 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22930 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
22940 29 3b 0a 20 20 64 62 2d 3e 6e 43 68 61 6e 67 65  );.  db->nChange
22950 20 3d 20 6e 43 68 61 6e 67 65 3b 0a 20 20 64 62   = nChange;.  db
22960 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 20 2b  ->nTotalChange +
22970 3d 20 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  = nChange;.}../*
22980 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 69  .** Set a flag i
22990 6e 20 74 68 65 20 76 64 62 65 20 74 6f 20 75 70  n the vdbe to up
229a0 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 20  date the change 
229b0 63 6f 75 6e 74 65 72 20 77 68 65 6e 20 69 74 20  counter when it 
229c0 69 73 20 66 69 6e 61 6c 69 73 65 64 0a 2a 2a 20  is finalised.** 
229d0 6f 72 20 72 65 73 65 74 2e 0a 2a 2f 0a 76 6f 69  or reset..*/.voi
229e0 64 20 73 71 6c 69 74 65 33 56 64 62 65 43 6f 75  d sqlite3VdbeCou
229f0 6e 74 43 68 61 6e 67 65 73 28 56 64 62 65 20 2a  ntChanges(Vdbe *
22a00 76 29 7b 0a 20 20 76 2d 3e 63 68 61 6e 67 65 43  v){.  v->changeC
22a10 6e 74 4f 6e 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a  ntOn = 1;.}../*.
22a20 2a 2a 20 4d 61 72 6b 20 65 76 65 72 79 20 70 72  ** Mark every pr
22a30 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
22a40 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
22a50 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
22a60 65 63 74 69 6f 6e 0a 2a 2a 20 61 73 20 65 78 70  ection.** as exp
22a70 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65  ired..**.** An e
22a80 78 70 69 72 65 64 20 73 74 61 74 65 6d 65 6e 74  xpired statement
22a90 20 6d 65 61 6e 73 20 74 68 61 74 20 72 65 63 6f   means that reco
22aa0 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65  mpilation of the
22ab0 20 73 74 61 74 65 6d 65 6e 74 20 69 73 0a 2a 2a   statement is.**
22ac0 20 72 65 63 6f 6d 6d 65 6e 64 2e 20 20 53 74 61   recommend.  Sta
22ad0 74 65 6d 65 6e 74 73 20 65 78 70 69 72 65 20 77  tements expire w
22ae0 68 65 6e 20 74 68 69 6e 67 73 20 68 61 70 70 65  hen things happe
22af0 6e 20 74 68 61 74 20 6d 61 6b 65 20 74 68 65 69  n that make thei
22b00 72 0a 2a 2a 20 70 72 6f 67 72 61 6d 73 20 6f 62  r.** programs ob
22b10 73 6f 6c 65 74 65 2e 20 20 52 65 6d 6f 76 69 6e  solete.  Removin
22b20 67 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 66  g user-defined f
22b30 75 6e 63 74 69 6f 6e 73 20 6f 72 20 63 6f 6c 6c  unctions or coll
22b40 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63  ating.** sequenc
22b50 65 73 2c 20 6f 72 20 63 68 61 6e 67 69 6e 67 20  es, or changing 
22b60 61 6e 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e  an authorization
22b70 20 66 75 6e 63 74 69 6f 6e 20 61 72 65 20 74 68   function are th
22b80 65 20 74 79 70 65 73 20 6f 66 0a 2a 2a 20 74 68  e types of.** th
22b90 69 6e 67 73 20 74 68 61 74 20 6d 61 6b 65 20 70  ings that make p
22ba0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
22bb0 74 73 20 6f 62 73 6f 6c 65 74 65 2e 0a 2a 2f 0a  ts obsolete..*/.
22bc0 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 69  void sqlite3Expi
22bd0 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
22be0 65 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62  ents(sqlite3 *db
22bf0 29 7b 0a 20 20 56 64 62 65 20 2a 70 3b 0a 20 20  ){.  Vdbe *p;.  
22c00 66 6f 72 28 70 20 3d 20 64 62 2d 3e 70 56 64 62  for(p = db->pVdb
22c10 65 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  e; p; p=p->pNext
22c20 29 7b 0a 20 20 20 20 70 2d 3e 65 78 70 69 72 65  ){.    p->expire
22c30 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  d = 1;.  }.}../*
22c40 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
22c50 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74  atabase associat
22c60 65 64 20 77 69 74 68 20 74 68 65 20 56 64 62 65  ed with the Vdbe
22c70 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 20 2a 73 71  ..*/.sqlite3 *sq
22c80 6c 69 74 65 33 56 64 62 65 44 62 28 56 64 62 65  lite3VdbeDb(Vdbe
22c90 20 2a 76 29 7b 0a 20 20 72 65 74 75 72 6e 20 76   *v){.  return v
22ca0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ->db;.}../*.** R
22cb0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
22cc0 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 61  to an sqlite3_va
22cd0 6c 75 65 20 73 74 72 75 63 74 75 72 65 20 63 6f  lue structure co
22ce0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76 61 6c  ntaining the val
22cf0 75 65 20 62 6f 75 6e 64 0a 2a 2a 20 70 61 72 61  ue bound.** para
22d00 6d 65 74 65 72 20 69 56 61 72 20 6f 66 20 56 4d  meter iVar of VM
22d10 20 76 2e 20 45 78 63 65 70 74 2c 20 69 66 20 74   v. Except, if t
22d20 68 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 53  he value is an S
22d30 51 4c 20 4e 55 4c 4c 2c 20 72 65 74 75 72 6e 20  QL NULL, return 
22d40 0a 2a 2a 20 30 20 69 6e 73 74 65 61 64 2e 20 55  .** 0 instead. U
22d50 6e 6c 65 73 73 20 69 74 20 69 73 20 4e 55 4c 4c  nless it is NULL
22d60 2c 20 61 70 70 6c 79 20 61 66 66 69 6e 69 74 79  , apply affinity
22d70 20 61 66 66 20 28 6f 6e 65 20 6f 66 20 74 68 65   aff (one of the
22d80 20 53 51 4c 49 54 45 5f 41 46 46 5f 2a 0a 2a 2a   SQLITE_AFF_*.**
22d90 20 63 6f 6e 73 74 61 6e 74 73 29 20 74 6f 20 74   constants) to t
22da0 68 65 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20  he value before 
22db0 72 65 74 75 72 6e 69 6e 67 20 69 74 2e 0a 2a 2a  returning it..**
22dc0 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64  .** The returned
22dd0 20 76 61 6c 75 65 20 6d 75 73 74 20 62 65 20 66   value must be f
22de0 72 65 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  reed by the call
22df0 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
22e00 56 61 6c 75 65 46 72 65 65 28 29 2e 0a 2a 2f 0a  ValueFree()..*/.
22e10 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 73  sqlite3_value *s
22e20 71 6c 69 74 65 33 56 64 62 65 47 65 74 42 6f 75  qlite3VdbeGetBou
22e30 6e 64 56 61 6c 75 65 28 56 64 62 65 20 2a 76 2c  ndValue(Vdbe *v,
22e40 20 69 6e 74 20 69 56 61 72 2c 20 75 38 20 61 66   int iVar, u8 af
22e50 66 29 7b 0a 20 20 61 73 73 65 72 74 28 20 69 56  f){.  assert( iV
22e60 61 72 3e 30 20 29 3b 0a 20 20 69 66 28 20 76 20  ar>0 );.  if( v 
22e70 29 7b 0a 20 20 20 20 4d 65 6d 20 2a 70 4d 65 6d  ){.    Mem *pMem
22e80 20 3d 20 26 76 2d 3e 61 56 61 72 5b 69 56 61 72   = &v->aVar[iVar
22e90 2d 31 5d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  -1];.    if( 0==
22ea0 28 70 4d 65 6d 2d 3e 66 6c 61 67 73 20 26 20 4d  (pMem->flags & M
22eb0 45 4d 5f 4e 75 6c 6c 29 20 29 7b 0a 20 20 20 20  EM_Null) ){.    
22ec0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
22ed0 2a 70 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56  *pRet = sqlite3V
22ee0 61 6c 75 65 4e 65 77 28 76 2d 3e 64 62 29 3b 0a  alueNew(v->db);.
22ef0 20 20 20 20 20 20 69 66 28 20 70 52 65 74 20 29        if( pRet )
22f00 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
22f10 33 56 64 62 65 4d 65 6d 43 6f 70 79 28 28 4d 65  3VdbeMemCopy((Me
22f20 6d 20 2a 29 70 52 65 74 2c 20 70 4d 65 6d 29 3b  m *)pRet, pMem);
22f30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
22f40 56 61 6c 75 65 41 70 70 6c 79 41 66 66 69 6e 69  ValueApplyAffini
22f50 74 79 28 70 52 65 74 2c 20 61 66 66 2c 20 53 51  ty(pRet, aff, SQ
22f60 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20  LITE_UTF8);.    
22f70 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
22f80 20 70 52 65 74 3b 0a 20 20 20 20 7d 0a 20 20 7d   pRet;.    }.  }
22f90 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
22fa0 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20  /*.** Configure 
22fb0 53 51 4c 20 76 61 72 69 61 62 6c 65 20 69 56 61  SQL variable iVa
22fc0 72 20 73 6f 20 74 68 61 74 20 62 69 6e 64 69 6e  r so that bindin
22fd0 67 20 61 20 6e 65 77 20 76 61 6c 75 65 20 74 6f  g a new value to
22fe0 20 69 74 20 73 69 67 6e 61 6c 73 0a 2a 2a 20 74   it signals.** t
22ff0 6f 20 73 71 6c 69 74 65 33 5f 72 65 6f 70 74 69  o sqlite3_reopti
23000 6d 69 7a 65 28 29 20 74 68 61 74 20 72 65 2d 70  mize() that re-p
23010 72 65 70 61 72 69 6e 67 20 74 68 65 20 73 74 61  reparing the sta
23020 74 65 6d 65 6e 74 20 6d 61 79 20 72 65 73 75 6c  tement may resul
23030 74 0a 2a 2a 20 69 6e 20 61 20 62 65 74 74 65 72  t.** in a better
23040 20 71 75 65 72 79 20 70 6c 61 6e 2e 0a 2a 2f 0a   query plan..*/.
23050 76 6f 69 64 20 73 71 6c 69 74 65 33 56 64 62 65  void sqlite3Vdbe
23060 53 65 74 56 61 72 6d 61 73 6b 28 56 64 62 65 20  SetVarmask(Vdbe 
23070 2a 76 2c 20 69 6e 74 20 69 56 61 72 29 7b 0a 20  *v, int iVar){. 
23080 20 61 73 73 65 72 74 28 20 69 56 61 72 3e 30 20   assert( iVar>0 
23090 29 3b 0a 20 20 69 66 28 20 69 56 61 72 3e 33 32  );.  if( iVar>32
230a0 20 29 7b 0a 20 20 20 20 76 2d 3e 65 78 70 6d 61   ){.    v->expma
230b0 73 6b 20 3d 20 30 78 66 66 66 66 66 66 66 66 3b  sk = 0xffffffff;
230c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 76 2d  .  }else{.    v-
230d0 3e 65 78 70 6d 61 73 6b 20 7c 3d 20 28 28 75 33  >expmask |= ((u3
230e0 32 29 31 20 3c 3c 20 28 69 56 61 72 2d 31 29 29  2)1 << (iVar-1))
230f0 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66  ;.  }.}..#ifndef
23100 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
23110 54 55 41 4c 54 41 42 4c 45 0a 2f 2a 0a 2a 2a 20  TUALTABLE./*.** 
23120 54 72 61 6e 73 66 65 72 20 65 72 72 6f 72 20 6d  Transfer error m
23130 65 73 73 61 67 65 20 74 65 78 74 20 66 72 6f 6d  essage text from
23140 20 61 6e 20 73 71 6c 69 74 65 33 5f 76 74 61 62   an sqlite3_vtab
23150 2e 7a 45 72 72 4d 73 67 20 28 74 65 78 74 20 73  .zErrMsg (text s
23160 74 6f 72 65 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f  tored.** in memo
23170 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
23180 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 29   sqlite3_malloc)
23190 20 69 6e 74 6f 20 61 20 56 64 62 65 2e 7a 45 72   into a Vdbe.zEr
231a0 72 4d 73 67 20 28 74 65 78 74 20 73 74 6f 72 65  rMsg (text store
231b0 64 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  d.** in memory o
231c0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
231d0 69 74 65 33 44 62 4d 61 6c 6c 6f 63 29 2e 0a 2a  ite3DbMalloc)..*
231e0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 56 74  /.void sqlite3Vt
231f0 61 62 49 6d 70 6f 72 74 45 72 72 6d 73 67 28 56  abImportErrmsg(V
23200 64 62 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 5f  dbe *p, sqlite3_
23210 76 74 61 62 20 2a 70 56 74 61 62 29 7b 0a 20 20  vtab *pVtab){.  
23220 69 66 28 20 70 56 74 61 62 2d 3e 7a 45 72 72 4d  if( pVtab->zErrM
23230 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
23240 33 20 2a 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  3 *db = p->db;. 
23250 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23260 28 64 62 2c 20 70 2d 3e 7a 45 72 72 4d 73 67 29  (db, p->zErrMsg)
23270 3b 0a 20 20 20 20 70 2d 3e 7a 45 72 72 4d 73 67  ;.    p->zErrMsg
23280 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
23290 75 70 28 64 62 2c 20 70 56 74 61 62 2d 3e 7a 45  up(db, pVtab->zE
232a0 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
232b0 74 65 33 5f 66 72 65 65 28 70 56 74 61 62 2d 3e  te3_free(pVtab->
232c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 70 56  zErrMsg);.    pV
232d0 74 61 62 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  tab->zErrMsg = 0
232e0 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f  ;.  }.}.#endif /
232f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  * SQLITE_OMIT_VI
23300 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 0a 23  RTUALTABLE */..#
23310 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
23320 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23330 4f 4b 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  OK../*.** If the
23340 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
23350 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 72 65   is not NULL, re
23360 6c 65 61 73 65 20 61 6e 79 20 61 6c 6c 6f 63 61  lease any alloca
23370 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65 64  tions associated
23380 20 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6d 65   .** with the me
23390 6d 6f 72 79 20 63 65 6c 6c 73 20 69 6e 20 74 68  mory cells in th
233a0 65 20 70 2d 3e 61 4d 65 6d 5b 5d 20 61 72 72 61  e p->aMem[] arra
233b0 79 2e 20 41 6c 73 6f 20 66 72 65 65 20 74 68 65  y. Also free the
233c0 20 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 0a   UnpackedRecord.
233d0 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 74 73  ** structure its
233e0 65 6c 66 2c 20 75 73 69 6e 67 20 73 71 6c 69 74  elf, using sqlit
233f0 65 33 44 62 46 72 65 65 28 29 2e 0a 2a 2a 0a 2a  e3DbFree()..**.*
23400 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
23410 69 73 20 75 73 65 64 20 74 6f 20 66 72 65 65 20  is used to free 
23420 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 73  UnpackedRecord s
23430 74 72 75 63 74 75 72 65 73 20 61 6c 6c 6f 63 61  tructures alloca
23440 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 76 64  ted by.** the vd
23450 62 65 55 6e 70 61 63 6b 52 65 63 6f 72 64 28 29  beUnpackRecord()
23460 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
23470 69 6e 20 76 64 62 65 61 70 69 2e 63 2e 0a 2a 2f  in vdbeapi.c..*/
23480 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 64 62  .static void vdb
23490 65 46 72 65 65 55 6e 70 61 63 6b 65 64 28 73 71  eFreeUnpacked(sq
234a0 6c 69 74 65 33 20 2a 64 62 2c 20 55 6e 70 61 63  lite3 *db, Unpac
234b0 6b 65 64 52 65 63 6f 72 64 20 2a 70 29 7b 0a 20  kedRecord *p){. 
234c0 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e   if( p ){.    in
234d0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
234e0 3b 20 69 3c 70 2d 3e 6e 46 69 65 6c 64 3b 20 69  ; i<p->nField; i
234f0 2b 2b 29 7b 0a 20 20 20 20 20 20 4d 65 6d 20 2a  ++){.      Mem *
23500 70 4d 65 6d 20 3d 20 26 70 2d 3e 61 4d 65 6d 5b  pMem = &p->aMem[
23510 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4d  i];.      if( pM
23520 65 6d 2d 3e 7a 4d 61 6c 6c 6f 63 20 29 20 73 71  em->zMalloc ) sq
23530 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
23540 61 73 65 28 70 4d 65 6d 29 3b 0a 20 20 20 20 7d  ase(pMem);.    }
23550 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
23560 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 7d 0a 7d  ee(db, p);.  }.}
23570 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23580 45 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41  E_ENABLE_PREUPDA
23590 54 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 64  TE_HOOK */..#ifd
235a0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
235b0 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f 4b 0a  _PREUPDATE_HOOK.
235c0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
235d0 20 70 72 65 2d 75 70 64 61 74 65 20 68 6f 6f 6b   pre-update hook
235e0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  . If this is an 
235f0 55 50 44 41 54 45 20 6f 72 20 44 45 4c 45 54 45  UPDATE or DELETE
23600 20 70 72 65 2d 75 70 64 61 74 65 20 63 61 6c 6c   pre-update call
23610 2c 0a 2a 2a 20 74 68 65 6e 20 63 75 72 73 6f 72  ,.** then cursor
23620 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
23630 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
23640 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20 74  hould point to t
23650 68 65 20 72 6f 77 20 61 62 6f 75 74 0a 2a 2a 20  he row about.** 
23660 74 6f 20 62 65 20 75 70 64 61 74 65 20 6f 72 20  to be update or 
23670 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68 65 20  deleted. If the 
23680 61 70 70 6c 69 63 61 74 69 6f 6e 20 63 61 6c 6c  application call
23690 73 20 73 71 6c 69 74 65 33 5f 70 72 65 75 70 64  s sqlite3_preupd
236a0 61 74 65 5f 6f 6c 64 28 29 2c 0a 2a 2a 20 74 68  ate_old(),.** th
236b0 65 20 72 65 71 75 69 72 65 64 20 76 61 6c 75 65  e required value
236c0 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66 72   will be read fr
236d0 6f 6d 20 74 68 65 20 72 6f 77 20 74 68 65 20 63  om the row the c
236e0 75 72 73 6f 72 20 70 6f 69 6e 74 73 20 74 6f 2e  ursor points to.
236f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
23700 56 64 62 65 50 72 65 55 70 64 61 74 65 48 6f 6f  VdbePreUpdateHoo
23710 6b 28 0a 20 20 56 64 62 65 20 2a 76 2c 20 20 20  k(.  Vdbe *v,   
23720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23730 20 20 20 20 20 2f 2a 20 56 64 62 65 20 70 72 65       /* Vdbe pre
23740 2d 75 70 64 61 74 65 20 68 6f 6f 6b 20 69 73 20  -update hook is 
23750 69 6e 76 6f 6b 65 64 20 62 79 20 2a 2f 0a 20 20  invoked by */.  
23760 56 64 62 65 43 75 72 73 6f 72 20 2a 70 43 73 72  VdbeCursor *pCsr
23770 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23780 2f 2a 20 43 75 72 73 6f 72 20 74 6f 20 67 72 61  /* Cursor to gra
23790 62 20 6f 6c 64 2e 2a 20 76 61 6c 75 65 73 20 66  b old.* values f
237a0 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c  rom */.  int op,
237b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
237c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
237d0 54 45 5f 49 4e 53 45 52 54 2c 20 55 50 44 41 54  TE_INSERT, UPDAT
237e0 45 20 6f 72 20 44 45 4c 45 54 45 20 2a 2f 0a 20  E or DELETE */. 
237f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
23800 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
23810 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
23820 65 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54  e */.  Table *pT
23830 61 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ab,             
23840 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 69 66 69         /* Modifi
23850 65 64 20 74 61 62 6c 65 20 2a 2f 0a 20 20 69 36  ed table */.  i6
23860 34 20 69 4b 65 79 31 2c 20 20 20 20 20 20 20 20  4 iKey1,        
23870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23880 20 49 6e 69 74 69 61 6c 20 6b 65 79 20 76 61 6c   Initial key val
23890 75 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  ue */.  int iReg
238a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238b0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 73          /* Regis
238c0 74 65 72 20 66 6f 72 20 6e 65 77 2e 2a 20 72 65  ter for new.* re
238d0 63 6f 72 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  cord */.){.  sql
238e0 69 74 65 33 20 2a 64 62 20 3d 20 76 2d 3e 64 62  ite3 *db = v->db
238f0 3b 0a 20 20 69 36 34 20 69 4b 65 79 32 3b 0a 20  ;.  i64 iKey2;. 
23900 20 50 72 65 55 70 64 61 74 65 20 70 72 65 75 70   PreUpdate preup
23910 64 61 74 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  date;.  const ch
23920 61 72 20 2a 7a 54 62 6c 20 3d 20 70 54 61 62 2d  ar *zTbl = pTab-
23930 3e 7a 4e 61 6d 65 3b 0a 20 20 73 74 61 74 69 63  >zName;.  static
23940 20 63 6f 6e 73 74 20 75 38 20 66 61 6b 65 53 6f   const u8 fakeSo
23950 72 74 4f 72 64 65 72 20 3d 20 30 3b 0a 0a 20 20  rtOrder = 0;..  
23960 61 73 73 65 72 74 28 20 64 62 2d 3e 70 50 72 65  assert( db->pPre
23970 55 70 64 61 74 65 3d 3d 30 20 29 3b 0a 20 20 6d  Update==0 );.  m
23980 65 6d 73 65 74 28 26 70 72 65 75 70 64 61 74 65  emset(&preupdate
23990 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 72 65 55  , 0, sizeof(PreU
239a0 70 64 61 74 65 29 29 3b 0a 20 20 69 66 28 20 6f  pdate));.  if( o
239b0 70 3d 3d 53 51 4c 49 54 45 5f 55 50 44 41 54 45  p==SQLITE_UPDATE
239c0 20 29 7b 0a 20 20 20 20 69 4b 65 79 32 20 3d 20   ){.    iKey2 = 
239d0 76 2d 3e 61 4d 65 6d 5b 69 52 65 67 5d 2e 75 2e  v->aMem[iReg].u.
239e0 69 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  i;.  }else{.    
239f0 69 4b 65 79 32 20 3d 20 69 4b 65 79 31 3b 0a 20  iKey2 = iKey1;. 
23a00 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43   }..  assert( pC
23a10 73 72 2d 3e 6e 46 69 65 6c 64 3d 3d 70 54 61 62  sr->nField==pTab
23a20 2d 3e 6e 43 6f 6c 20 0a 20 20 20 20 20 20 20 7c  ->nCol .       |
23a30 7c 20 28 70 43 73 72 2d 3e 6e 46 69 65 6c 64 3d  | (pCsr->nField=
23a40 3d 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 20 26 26  =pTab->nCol+1 &&
23a50 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 44 45 4c 45   op==SQLITE_DELE
23a60 54 45 20 26 26 20 69 52 65 67 3d 3d 2d 31 29 0a  TE && iReg==-1).
23a70 20 20 29 3b 0a 0a 20 20 70 72 65 75 70 64 61 74    );..  preupdat
23a80 65 2e 76 20 3d 20 76 3b 0a 20 20 70 72 65 75 70  e.v = v;.  preup
23a90 64 61 74 65 2e 70 43 73 72 20 3d 20 70 43 73 72  date.pCsr = pCsr
23aa0 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6f 70  ;.  preupdate.op
23ab0 20 3d 20 6f 70 3b 0a 20 20 70 72 65 75 70 64 61   = op;.  preupda
23ac0 74 65 2e 69 4e 65 77 52 65 67 20 3d 20 69 52 65  te.iNewReg = iRe
23ad0 67 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  g;.  preupdate.k
23ae0 65 79 69 6e 66 6f 2e 64 62 20 3d 20 64 62 3b 0a  eyinfo.db = db;.
23af0 20 20 70 72 65 75 70 64 61 74 65 2e 6b 65 79 69    preupdate.keyi
23b00 6e 66 6f 2e 65 6e 63 20 3d 20 45 4e 43 28 64 62  nfo.enc = ENC(db
23b10 29 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 6b  );.  preupdate.k
23b20 65 79 69 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyinfo.nField = 
23b30 70 54 61 62 2d 3e 6e 43 6f 6c 3b 0a 20 20 70 72  pTab->nCol;.  pr
23b40 65 75 70 64 61 74 65 2e 6b 65 79 69 6e 66 6f 2e  eupdate.keyinfo.
23b50 61 53 6f 72 74 4f 72 64 65 72 20 3d 20 28 75 38  aSortOrder = (u8
23b60 2a 29 26 66 61 6b 65 53 6f 72 74 4f 72 64 65 72  *)&fakeSortOrder
23b70 3b 0a 20 20 70 72 65 75 70 64 61 74 65 2e 69 4b  ;.  preupdate.iK
23b80 65 79 31 20 3d 20 69 4b 65 79 31 3b 0a 20 20 70  ey1 = iKey1;.  p
23b90 72 65 75 70 64 61 74 65 2e 69 4b 65 79 32 20 3d  reupdate.iKey2 =
23ba0 20 69 4b 65 79 32 3b 0a 20 20 70 72 65 75 70 64   iKey2;.  preupd
23bb0 61 74 65 2e 69 50 4b 65 79 20 3d 20 70 54 61 62  ate.iPKey = pTab
23bc0 2d 3e 69 50 4b 65 79 3b 0a 0a 20 20 64 62 2d 3e  ->iPKey;..  db->
23bd0 70 50 72 65 55 70 64 61 74 65 20 3d 20 26 70 72  pPreUpdate = &pr
23be0 65 75 70 64 61 74 65 3b 0a 20 20 64 62 2d 3e 78  eupdate;.  db->x
23bf0 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62 61 63  PreUpdateCallbac
23c00 6b 28 64 62 2d 3e 70 50 72 65 55 70 64 61 74 65  k(db->pPreUpdate
23c10 41 72 67 2c 20 64 62 2c 20 6f 70 2c 20 7a 44 62  Arg, db, op, zDb
23c20 2c 20 7a 54 62 6c 2c 20 69 4b 65 79 31 2c 20 69  , zTbl, iKey1, i
23c30 4b 65 79 32 29 3b 0a 20 20 64 62 2d 3e 70 50 72  Key2);.  db->pPr
23c40 65 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 73  eUpdate = 0;.  s
23c50 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
23c60 20 70 72 65 75 70 64 61 74 65 2e 61 52 65 63 6f   preupdate.aReco
23c70 72 64 29 3b 0a 20 20 76 64 62 65 46 72 65 65 55  rd);.  vdbeFreeU
23c80 6e 70 61 63 6b 65 64 28 64 62 2c 20 70 72 65 75  npacked(db, preu
23c90 70 64 61 74 65 2e 70 55 6e 70 61 63 6b 65 64 29  pdate.pUnpacked)
23ca0 3b 0a 20 20 76 64 62 65 46 72 65 65 55 6e 70 61  ;.  vdbeFreeUnpa
23cb0 63 6b 65 64 28 64 62 2c 20 70 72 65 75 70 64 61  cked(db, preupda
23cc0 74 65 2e 70 4e 65 77 55 6e 70 61 63 6b 65 64 29  te.pNewUnpacked)
23cd0 3b 0a 20 20 69 66 28 20 70 72 65 75 70 64 61 74  ;.  if( preupdat
23ce0 65 2e 61 4e 65 77 20 29 7b 0a 20 20 20 20 69 6e  e.aNew ){.    in
23cf0 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
23d00 3b 20 69 3c 70 43 73 72 2d 3e 6e 46 69 65 6c 64  ; i<pCsr->nField
23d10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71  ; i++){.      sq
23d20 6c 69 74 65 33 56 64 62 65 4d 65 6d 52 65 6c 65  lite3VdbeMemRele
23d30 61 73 65 28 26 70 72 65 75 70 64 61 74 65 2e 61  ase(&preupdate.a
23d40 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  New[i]);.    }. 
23d50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
23d60 28 64 62 2c 20 70 72 65 75 70 64 61 74 65 2e 61  (db, preupdate.a
23d70 4e 65 77 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  New);.  }.}.#end
23d80 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
23d90 42 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f  BLE_PREUPDATE_HO
23da0 4f 4b 20 2a 2f 0a                                OK */.